私は の初心者で、 Learn you a HaskellHaskell
を読んでいて、そのページで関数を次のように宣言しました。
tell :: (Show a) => [a] -> String
tell [] = "The list is empty"
tell (x:[]) = "The list has one element: " ++ show x
tell (x:y:[]) = "The list has two elements: " ++ show x ++ " and " ++ show y
tell (x:y:_) = "This list is long. The first two elements are: " ++ show x ++ " and " ++ show y
これはうまくいきます。その本は言う
この関数は、空のリスト、シングルトン リスト、2 つの要素を持つリスト、および 3 つ以上の要素を持つリストを処理するため、安全です。(x:[]) および (x:y:[]) は、[x] および [x,y] として書き換えることができることに注意してください (構文糖衣のため、括弧は必要ありません)。(x:y:_) は長さ 2 以上の任意のリストに一致するため、角括弧で書き換えることはできません。
最後の行を次のように変更して、これを実行しようとしました
-- same as before
tell [x:y:_] = "This list is long. The first two elements are: " ++ show x ++ " and " ++ show y
そしてHaskellは非常に醜いメッセージを思いつきました
Could not deduce (a ~ [a0])
from the context (Show a)
bound by the type signature for tell :: Show a => [a] -> String
at C:\Documents and Settings\Razor\Desktop\Other\baby.hs:(24,1)-(27,9
5)
`a' is a rigid type variable bound by
the type signature for tell :: Show a => [a] -> String
at C:\Documents and Settings\Razor\Desktop\Other\baby.hs:24:1
In the pattern: x : y : _
In the pattern: [x : y : _]
In an equation for `tell':
tell [x : y : _]
= "This list is long. The first two elements are: "
++ show x ++ " and " ++ show y
Failed, modules loaded: none.
誰が何が間違っているのか説明できますか? そして、本によると、私は のように書くことができます(x:[])
([x]
確かにそうしました) が、なぜ のように書くことができないのですtell (x:y:_)
かtell [x:y:_]
? 本に説明があることは知っていますが、何が問題なのか本当に理解できませんか? 誰かがそれを明確な言葉で説明できますか?