我正在尝试生成一个无限数列表
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)
也只占用了一个元素。
答案 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..] ]