Я работаю над 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
= 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
Но теперь я застреваю при вводе в ruler
в ghci
, он, вероятно, попадет в бесконечный цикл.
Это не должно быть, если работает ленивая оценка. Я хочу знать, почему здесь ленивая оценка.
Вспомогательная функция для наблюдения Stream
:
streamToList (Cons x xs) = x : streamToList xs
instance Show a => Show (Stream a) where
show = show . take 20 . streamToList
Ваше первое определение выглядит очень знакомым, что я, должно быть, видел его раньше. Я предполагаю, что это было в SICP – Wentao