【发布时间】:2016-09-05 09:33:15
【问题描述】:
我正在处理UPENN Haskell Homework 6 Exercise 5,试图定义一个ruler function
0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,...
其中流中的第 n 个元素(假设第一个元素对应于 n = 1)是最大的 power of 2,它均匀地除以 n。
我只是想出了一个想法,无需任何可分性测试即可构建它:
data Stream x = Cons x (Stream x) deriving (Eq)
streamRepeat x = Cons x (streamRepeat x)
interleaveStreams (Cons x xs) (Cons y ys) =
Cons x (Cons y (interleaveStreams xs ys))
ruler =
interleaveStreams (streamRepeat 0)
(interleaveStreams (streamRepeat 1)
(interleaveStreams (streamRepeat 2)
(interleaveStreams (streamRepeat 3) (...))
其中的前 20 个元素
ruler =
interleaveStreams (streamRepeat 0)
(interleaveStreams (streamRepeat 1)
(interleaveStreams (streamRepeat 2)
(interleaveStreams (streamRepeat 3) (streamRepeat 4))))
是
[0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2]
显然我无法手动将其定义为无限,所以我定义了一个infInterStream 来帮助定义这种无限递归:
infInterStream n = interleaveStreams (streamRepeat n) (infInterStream (n+1))
ruler = infInterStream 0
但是现在我在ghci中输入ruler时卡住了,它可能陷入了无限循环。
如果惰性评估有效,则不应该如此。我想知道为什么惰性评估在这里失败。
观察Stream的辅助函数:
streamToList (Cons x xs) = x : streamToList xs
instance Show a => Show (Stream a) where
show = show . take 20 . streamToList
【问题讨论】:
标签: haskell stream lazy-evaluation