2017-10-31 4 views
0

コンテキストの場合、偶数番目の位置にリストの要素を出力する単純な関数を作成しようとしています。シングルトンリスト、等価/エラーステートメントに一致するパターン

>evens [] = [] 
>evens [x] = x 
>evens (x, y, xs) = x : evens xs 

なぜコンパイル時にタイプエラーが発生するのですか?

私は二行目を次のように変更します

>evens [x] = x:[] 

とすべてが、その後絶対に正常に動作します。

learnyouahaskell.comは、パターンマッチングでは、(x:[])は[x]として書き直すことができますが、これは私の関数定義でなぜ失敗するのですか?

答えて

2

[x] != x。 1つの要素のリストは要素自体とは異なります。 x:[][x]に置き換えることはできますが、[x]xに置き換えることはできません。また、3番目の式が間違っているようです。あなたはそれがうまくコンパイルされると言いますが、それはタイプミスかもしれませんが、確かにevensの完全な定義は次のとおりです。

evens :: [a] -> [a] 
evens [] = [] 
evens [x] = [x] -- x :: a; you can't use an a where you need a [a]! 
evens (x:y:xs) = x : evens xs 
-- x :: a; xs :: [a]; evens xs :: [a]; (:) :: a -> [a] -> [a] 
-- x : evens xs :: [a]