我是Haskell的新手,似乎无法找到无法编译的原因:
test = foldr (\x y -> y : x) [1]
我并没有尝试在虚拟功能“test”中实现任何功能。
只是我不断收到此错误代码:
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)'
我想做的就是能够连接列表中的元素,在另一个函数中定义的匿名函数中形成另一个列表(在本例中,在“test”中定义。)
感谢。
答案 0 :(得分: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
利弊(:)
,它会进行类型检查,但该功能会更容易表达为
test xs = xs ++ [1]
或,无点
test = (++ [1])