ヘッドアンドテールは、例外をもたらす空のリストを呼びます
-
30-09-2019 - |
質問
チュートリアルをフォローしています。 (現実世界のハスケル)
そして、私は空のリストで呼び出された頭と尾についての初心者の質問が1つあります:GHCIでは例外を返します。
直感的には、どちらも空のリストを返すべきだと思います。私を修正してもらえますか?なぜだめですか ? (私が覚えている限り、ozmlで左または右の空のリストはnilを返します)
私は確かにチュートリアルでこのトピックをまだカバーしていませんが、それはバグのソースではありません(引数を提供しない場合)?私は、オプションであるかもしれない引数のリストを関数に渡すと、頭でそれらを読むことはバグにつながる可能性があるということですか?
GHCIの動作を知っているだけで、コンパイルしたときに何が起こるかわかりません。
解決
直感的には、どちらも空のリストを返すべきだと思います。私を修正してもらえますか?なぜだめですか ?
上手 - head
は [a] -> a
. 。単一の最初の要素を返します。リストなし。
そして、空のリストのような最初の要素がない場合は?さて、何を返す?タイプの値を作成することはできません a
何もないので、残っているのはすべてです undefined
- エラー。
と tail
?テールは基本的に最初の要素のないリストです。つまり、元の要素よりも短いアイテムです。最初の要素がない場合、これらの法律を支持することはできません。
箱から1つのアップルを取り出すと、同じ箱を持つことはできません(いつ起こったのか tail [] == []
)。動作はそうでなければなりません undefined
それも。
これは、次の結論につながります。
私は確かにチュートリアルでこのトピックをまだカバーしていませんが、それはバグのソースではありませんか?私は、オプションであるかもしれない引数のリストを関数に渡すと、頭でそれらを読むことはバグにつながる可能性があるということですか?
はい、それはバグのソースですが、欠陥のあるコードを書き込むことができるためです。基本的に存在しない値を読み込もうとしているコード。したがって、:*ヘッド/テールを使用しないでください** - パターンマッチングを使用します。
sum [] = 0
sum (x:xs) = x + sum xs
コンパイラはできます 保証 考えられるすべてのケースがカバーされ、値は常に定義されており、読み取りがはるかにきれいです。