Haskell - 在无限流中否定偶数

时间:2012-11-25 09:36:17

标签: haskell infinite-sequence

我正在尝试生成一个无限数列表

0,1,-2,3,-4,5,-6...

到目前为止,我得到了

evenise x   | x == 0 = 0
            | even x = -x
            | otherwise = x

s = foldl (\x -> evenise x) 0 [1..]

但是我收到了错误

Occurs check: cannot construct the infinite type: a0 = b0 -> a0
In the first argument of `evenise', namely `x'
In the expression: evenise x
In the first argument of `foldl', namely `(\ x -> evenise x)'

我不理解错误,因为evenise接受了一个元素,而错误的函数(\x -> evenise x)也只占用了一个元素。

3 个答案:

答案 0 :(得分:4)

您想使用map而不是foldl

s = map evenise [0..]

map遍历列表并将映射函数应用于每个元素。 foldl用于将列表“缩减”为值 - 例如,添加列表中的所有元素可以像

一样完成
foldl (+) 0

另外,foldl仅适用于有限列表,而foldr(也适用于减少)有时可用于无限列表。

答案 1 :(得分:3)

您收到错误,因为foldl采用两个参数的函数,而不是一个。但foldl无论如何都无法处理无限列表,所以我不明白你在那里做什么。

(您不需要evenise中的第一行,因为-0 == 0。)

答案 2 :(得分:3)

您还可以创建无限列表并将测试嵌入到列表定义中:

s = [ if odd x then x else negate x | x <- [0,1..] ]