Iはruler function
は無限ストリーム
n
= 1に相当)
0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,...
が定義しようと、UPENN Haskell Homework 6 Exercise 5に取り組んでいを定義するために失敗します最大power of 2
は、n
を均等に割ります。
は、私はただの整除テストなしでそれを構築するためのアイデアを思い付いた:
[0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2]
明らか
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) (...))
ruler =
interleaveStreams (streamRepeat 0)
(interleaveStreams (streamRepeat 1)
(interleaveStreams (streamRepeat 2)
(interleaveStreams (streamRepeat 3) (streamRepeat 4))))
の最初の20要素であるIそれを手動で無限に定義することはできませんでしたので、私はを定義しましたそのような無限再帰定義を支援する:
infInterStream n = interleaveStreams (streamRepeat n) (infInterStream (n+1))
ruler = infInterStream 0
しかし、今ghci
にruler
に入力するとき、私は動けなくなる、それはおそらく無限ループに陥ります。
遅延評価が機能しているとは限りません。私はここで怠惰な評価が失敗する理由を知りたい。
streamToList (Cons x xs) = x : streamToList xs
instance Show a => Show (Stream a) where
show = show . take 20 . streamToList
あなたの最初の定義は、私が以前に見たことがあることに非常によく似ています。私はそれがSICPにあったと思います – Wentao