【发布时间】:2019-03-25 02:57:36
【问题描述】:
我正在做CIS 194的作业。问题是使用streamInterleave实现标尺功能。代码看起来像
data Stream a = Cons a (Stream a)
streamRepeat :: a -> Stream a
streamRepeat x = Cons x (streamRepeat x)
streamMap :: (a -> b) -> Stream a -> Stream b
streamMap f (Cons x xs) = Cons (f x) (streamMap f xs)
streamInterleave :: Stream a -> Stream a -> Stream a
streamInterleave (Cons x xs) ys = Cons x (streamInterleave ys xs)
ruler :: Stream Integer
ruler = streamInterleave (streamRepeat 0) (streamMap (+1) ruler)
我真的很困惑为什么可以这样实现标尺。这是要给我[0,1,0,1....]吗?
任何帮助将不胜感激。谢谢!!
【问题讨论】:
-
你到底卡在哪一部分?除了实际的
ruler定义之外,您是否了解其中的大部分内容,或者您是否还需要了解其他各种streamXXX函数的帮助? -
因在家庭作业上诚实而被赞成。不,标尺不会导致
0,1,0,1,...,因为在这种情况下streamMap (+1) ruler将是1,2,1,2,...,并且与0,0,0,...交错不会导致0,1,0,1,...。这更棘手。不过,0,1看起来是正确的开始。尝试为某些未知数xi假装ruler=0,1,x2,x3,x4,x5,...,并尝试推断x2应该是什么。然后,知道x2,计算x3。等等。你会注意到一个模式。
标签: haskell stream infinite self-reference interleave