1

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

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)也接受了一个元素。

4

3 回答 3

4

你想用mapfoldl

s = map evenise [0..]

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

foldl (+) 0

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

于 2012-11-25T09:40:45.143 回答
3

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

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

于 2012-11-25T09:43:11.847 回答
3

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

s = [ if odd x then x else negate x | x <- [0,1..] ]
于 2012-11-25T10:53:46.890 回答