【发布时间】:2016-05-11 23:07:45
【问题描述】:
http://www.seas.upenn.edu/~cis194/spring13/hw/06-laziness.pdf
问题是关于标尺函数的表示
0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2, 0, 1, 0, 4, . . . 其中流中的第 n 个元素(假设第一个元素 对应于 n = 1) 是 2 的最大幂,它整除 n
我有一个工作解决方案,使用 show 显示带有 interleaveStreams 功能的前 20 个元素:
data Stream a = Cons a (Stream a)
streamToList :: Stream a -> [a]
streamToList (Cons a b) = a : streamToList b
instance Show a => Show (Stream a) where
show = show . take 20 . streamToList
streamRepeat :: a -> Stream a
streamRepeat a = Cons a (streamRepeat a)
ruler :: Stream Integer
ruler =
let s n = interleaveStreams' (streamRepeat n) (s (n+1))
in s 0
interleaveStreams :: Stream a -> Stream a -> Stream a
interleaveStreams (Cons x xs) (Cons y ys) = Cons x (Cons y (interleaveStreams xs ys))
interleaveStreams' :: Stream a -> Stream a -> Stream a
interleaveStreams' (Cons x xs) y = Cons x $ interleaveStreams' y xs
但是我不明白为什么使用 interleave 函数的标尺不会以 Show 终止。
【问题讨论】: