使Haskell函数与无限列表一起工作

时间:2015-03-16 00:18:02

标签: haskell

我想知道如何将函数转换为无限列表?

例如,我有一个恢复列表列表的功能。

innerReverse [[1,2,3]]将返回[[3,2,1]]。但是,当我尝试take 10 $ innerReverse [[1..]]时,它基本上会遇到无限循环。

当我innerReverse [(take 10 [1..])]时,它会给出结果:[[10,9,8,7,6,5,4,3,2,1]]

1 个答案:

答案 0 :(得分:8)

Haskell是一种 lazy 语言,这意味着评估仅在实际使用结果之前执行。这就是Haskell有可能拥有无限列表的原因;到目前为止,您访问的列表部分实际上只存储在内存中。

无限列表的概念使得您尝试做的事情变得不可能。在列表[1..]中,第一个元素是1。最后一个元素是什么?答案是,这是一个棘手的问题;没有" end"的概念。一个无限的名单。同样,[1..]反向的第一个元素是什么?再次,这是一个棘手的问题。最后一个元素是1,但列表没有开头。

我不确定为什么您希望[1..]的反向为[10,9,8,7,6,5,4,3,2,1]。后者的反面是[1,2,3,4,5,6,7,8,9,10],而不是[1..]