Dmitry Popov (
thedeemon
) wrote
2017-04-22 06:35 am (UTC)
no subject
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
Если присмотреться, видно, что мемоизации не происходит и одни и те же элементы будут много раз вычисляться.
(
10 comments
)
Post a comment in response:
From:
Anonymous
This account has disabled anonymous posting.
OpenID
Identity URL:
Log in?
Dreamwidth account
Account name
Password
Log in?
If you don't have an account you can
create one now
.
Subject
HTML doesn't work in the subject.
Formatting type
Casual HTML
Markdown
Raw HTML
Rich Text Editor
Message
[
Home
|
Post Entry
|
Log in
|
Search
|
Browse Options
|
Site Map
]
no subject
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
Если присмотреться, видно, что мемоизации не происходит и одни и те же элементы будут много раз вычисляться.