0

私はHaskellを初めて使用し、これをコンパイルできない理由を見つけることができないようです:

test = foldr (\x y -> y : x) [1]

ダミー関数「テスト」に対して機能的に何かを達成しようとしているわけではありません。

このエラーコードを取得し続けるだけです:

Occurs check: cannot construct the infinite type: a0 = [a0]
    In the first argument of `(:)', namely `y'
    In the expression: y : x
    In the first argument of `foldr', namely `(\ x y -> y : x)'

私がやりたいことは、リストから要素を連結して、別の関数で定義された無名関数内で別のリストを形成できるようにすることです (この場合、「テスト」で定義されています)。

ありがとう。

4

1 に答える 1

3

のタイプfoldr

foldr :: (a -> b -> b) -> b -> [a] -> b

だから私たちがそれを使おうとすると

test = foldr (\x y -> y : x) [1]

次のタイプが必要です。

b = Num n => [n]

空の入力リストの引数はその型を持ち、

(\x y -> y : x) :: (a -> b -> b)
                :: Num n => (a -> [n] -> [n])

しかし、ラムダはそうflip (:)であり、したがって型を持っています

(\x y -> y : x) :: [t] -> t -> [t]

そして、それを で統一しようとするとa -> [n] -> [n]

a == [t]
t == [n]
[t] == [n]

これは を意味しt == [t]ます。

flipconsを指定しない(:)と、型チェックが行われますが、関数は次のように表現する方が簡単です。

test xs = xs ++ [1]

または、ポイントフリー

test = (++ [1])
于 2012-10-14T15:03:30.343 に答える