我的代码导致了某种无限递归,所以我决定查看这个帖子(OP正在做与我相同的问题:在无限流上实现尺子函数):
使用’streamInterlift’实现尺子函数
我的代码看起来像这样:
data Stream a = Cons a (Stream a)
streamRepeat :: a -> Stream a
streamRepeat x = Cons x (streamRepeat x)
interleaveStreams :: Stream a -> Stream a -> Stream a
interleaveStreams (Cons x xs) (Cons y ys) = Cons x (Cons y (streamInterleave xs ys))
ruler :: Stream Integer
ruler = interleaveStreams (streamRepeat 0) (streamMap (+1) $ ruler)
现在,事实证明,如果我将interleaveStreams的定义更改为
interleaveStreams :: Stream a -> Stream a -> Stream a
interleaveStreams (Cons x xs) ys = Cons x (interleaveStreams ys xs)
并保留其他所有内容,没有无限递归,它正常工作.据我所知,interleaveStreams的两个版本是等价的.为什么其中一个挂起,而另一个正常工作?