3

私はチュートリアルに従っています。(Real World Haskell)

そして、空のリストで呼び出される頭と尾についての初心者の質問が1つあります。GHCiでは例外が返されます。

直感的には、どちらも空のリストを返す必要があると思います。訂正してもらえますか?なぜだめですか ?(私がOzMLで覚えている限り、空のリストの左または右はnilを返します)

私は確かにチュートリアルでこのトピックをまだカバーしていませんが、それはバグの原因ではありませんか(引数を提供しない場合)?オプションの引数のリストを関数に渡す場合、それらを頭で読むとバグが発生する可能性がありますか?

私はGHCiの動作を知っているだけで、コンパイルするとどうなるかわかりません。

4

1 に答える 1

13

直感的には、どちらも空のリストを返す必要があると思います。訂正してもらえますか?なぜだめですか ?

まあ-headです[a] -> a。単一の最初の要素を返します。リストはありません。

そして、空のリストのような最初の要素がない場合はどうなりますか?さて何を返すのですか?何もないところからtypeの値を作成することはできないため、a残っているundefinedのはエラーだけです。


そしてtail?テールは基本的に最初の要素のないリストです。つまり、元のアイテムよりも1つ短いアイテムです。最初の要素がない場合、これらの法則を守ることはできません。

箱からリンゴを1つ取り出すと、同じ箱を作ることはできません(いつ何が起こったのかtail [] == [])。振る舞いもしなければなりundefinedません。


これにより、次の結論が導き出されます。

私は確かにチュートリアルでこのトピックをまだカバーしていませんが、それはバグの原因ではありませんか?オプションの引数のリストを関数に渡す場合、それらを頭で読むとバグが発生する可能性がありますか?

はい、それはバグの原因ですが、欠陥のあるコードを書くことができるからです。基本的に存在しない値を読み取ろうとしているコード。したがって:*ヘッド/テールを使用しないでください**-パターンマッチングを使用します。

sum     [] = 0
sum (x:xs) = x + sum xs

コンパイラーは、考えられるすべてのケースがカバーされ、値が常に定義されており、読みやすくなっていることを保証できます。

于 2010-08-22T19:35:01.813 に答える