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])

但是 lambda 是flip (:)并且因此具有类型

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

并试图将其与 统一起来a -> [n] -> [n],我们发现

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

这意味着t == [t]

如果你不flip使用 cons (:),它会进行类型检查,但函数会更容易表示为

test xs = xs ++ [1]

或者,无点

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