Я работаю над проблемой (ее из класса UPenn, но я не принимаю ее (просто работаю над ней, чтобы узнать Haskell)), и дело в том, чтобы построить Stream (как определено ниже), который определяется «правителем» (линейка !! n = показатель наивысшей степени 2, который будет делить n). Проблема в том, что я считаю, что определение правителя ниже должно лениво оценивать, но, судя по всему, оно оценивается строго и бесконечно. Если я закрываю его, добавляя терминал, например «nthStream 10 = streamRepeat 10», он запускается и генерирует вывод до той точки, которую я хочу правильно.Haskell не ленивый, оценивая чередование
data Stream a = Stream a (Stream a)
streamToList :: Stream a -> [a]
streamToList (Stream a rest) = [a] ++ streamToList rest
instance Show a => Show (Stream a) where
show s = show $ take 100 $ streamToList s
streamRepeat :: a -> Stream a
streamRepeat a = Stream a (streamRepeat a)
interleaveStreams :: Stream a -> Stream a -> Stream a
interleaveStreams (Stream a arest) (Stream b brest) = (Stream a (Stream b (interleaveStreams arest brest)))
nthStream :: Integer -> Stream Integer
nthStream n = interleaveStreams (streamRepeat n) (nthStream (n+1))
ruler :: Stream Integer
ruler = nthStream 0
Может ли кто-нибудь объяснить, почему линейка (и nthStream) не лениво оценивает?
не должны ли быть в базовом случае для 'streamRepeat'? –
@ shree.pat18 'streamRepeat' должен возвращать бесконечный поток, если я не ошибаюсь, очень похоже на' repeat :: a -> [a] 'в Prelude. – bheklilr
bheklir, вы правы. он должен возвращать бесконечный поток. Пример: streamRepeat 3 = Stream 3 (Stream 3 (Stream 3 .... –