将元素连接到Haskell中匿名函数的列表中

时间:2012-10-14 14:54:57

标签: list haskell lambda higher-order-functions

我是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”中定义。)

感谢。

1 个答案:

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