List 带尾无限序列

List 带尾无限序列,list,haskell,List,Haskell,我想实现一个序列,其中xun仅依赖于xun-1}作为一个无限列表 next x_k = x_k +1 --get next element seq1 n = n : seq1 (next n) seq2 = 0:[next (last seq2)] seq1起作用,seq2不起作用。 在seq1中到底发生了什么? 是因为最后一次等待永远吗? 如果是这样的话,我怎么看得出例如last不适合无限列表?seq1 这里唯一的神奇之处是列表构造函数当然是懒惰的,因此seq1(next n)将根据需要

我想实现一个序列,其中
xun
仅依赖于
xun-1}
作为一个无限列表

next x_k = x_k +1 --get next element

seq1 n = n : seq1 (next n)

seq2 = 0:[next (last seq2)]
seq1
起作用,
seq2
不起作用。
seq1
中到底发生了什么?
是因为最后一次等待永远吗? 如果是这样的话,我怎么看得出例如
last
不适合无限列表?

seq1
这里唯一的神奇之处是列表构造函数当然是懒惰的,因此
seq1(next n)
将根据需要进行评估,您不会遇到麻烦

seq2
正如您已经看到的那样,您的序列将是无限的,请求它的最后一个元素(使用
last
)是没有意义的-因此,这当然会进入无限循环(同时尝试查找无限列表中的最后一个元素)

如果您想了解详细信息,请查看当您需要
seq2的第二个元素时会发生什么


请记住,
last
的定义如下:

last [x]                =  x
last (_:xs)             =  last xs

使用
展开器
您可以很容易地使用定义:

seq3 = unfoldr (\b -> Just (b, next b)) 0
使用
迭代
正如@ReinHeinrichs评论的那样,您也可以这样做

seq3 = iterate next 0
使用

实际上,
iterate
实际上是像
seq1
一样实现的:

iterate :: (a -> a) -> a -> [a]
iterate f x =  x : iterate f (f x)

你已经知道你的序列是无限的-那么最后一个是什么呢
seq1
应该是显而易见的-这里唯一的魔法是列表构造函数当然是懒惰的,因此
seq1(下一个n)
将根据需要进行评估,您可以在这样的情况下使用
Unfover
:`let mySeq=Unfover(\b->Just(b,next b))0`@CarstenKönig您应该将其作为答案发布。:)完成(我想)-谢谢你的提示,这不只是
下一步迭代
?@ReinHenrichs是的-但我总是忘记这一点:(…我会添加它(或者留给你添加另一个答案)随时添加它。:)
iterate :: (a -> a) -> a -> [a]
iterate f x =  x : iterate f (f x)