thedeemon: (Default)
Dmitry Popov ([personal profile] thedeemon) wrote 2017-04-22 06:35 am (UTC)

comprehension есть, но синтаксис там сложный паттерн-матчинг не позволяет, можно так:

fibs = 1 :: 1 :: [ sumFirstTwo s | s <- tails fibs ]

где
sumFirstTwo : Num a => Stream a -> a
sumFirstTwo (x::y::_) = x + y

Но реализован comprehension для стримов как-то ужасно, работает плохо (репл быстро съедает всю память). Можно так написать:

fibs = 1 :: 1 :: map sumFirstTwo (tails fibs)

Тогда работает ок, но время все равно не линейное. При этом готовой реализации tails для стримов не было, я ее так написал:

tails : Stream a -> Stream (Stream a)
tails src@(x :: xs) = src :: tails xs

Если присмотреться, видно, что мемоизации не происходит и одни и те же элементы будут много раз вычисляться.

Post a comment in response:

This account has disabled anonymous posting.
If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting