lomeo: (лямбда)
Из дискуссии с [livejournal.com profile] sassa_nf.

В java локальные переменные метода не собираются сборщиком мусора, пока мы не выйдем из метода (наверх, разумеется, а не глубже). Это важно, потому что Scala'вские Stream из-за этого часто становятся бесполезны.

Вот имеем мы некий Stream, который любят сравнивать с Haskell'евским списком. И начинаем его обрабатывать. А обработка через некоторое время завешается с OutOfMemoryError:
val messages = Stream continually nextMessage
for (message <- messages) doSomething(message)

А теперь перепишем это так:
for (message <- Stream continually nextMessage) doSomething(message)

и обработка у нас будет вестись вечно.

А всё потому, что первый способ генерит astore, который создаёт локальную переменную. А второй — нет.

UPD: [livejournal.com profile] sassa_nf всё же заставил java работать правильно. За что ему отдельное спасибо!
lomeo: (лямбда)
Клёвая реализация сабжа от [livejournal.com profile] antilamer:
data Tree a = Nil | Branch (Tree a) a (Tree a)

bfs t = [x | Branch _ x _ <- b]
  where
    b = t:[x | Branch l _ r <- b, x <- [l,r]]

Ленивость, все дела.

отсюда.
lomeo: (лямбда)
Не очень понимаю, как сделать некоторые вычисления eager. Кто знает, подскажите.
Допустим у меня есть простой шелл - State с одной целой переменной. В шелле поддерживается две команды
  • r - прочесть целое значение

  • w - вывести целое значение

Вот код:

тут код )
А как мне сделать, чтобы ошибка показывалась после ввода команды r?

Profile

lomeo: (Default)
Dmitry Antonyuk

December 2015

S M T W T F S
  12345
6789101112
131415 16171819
20212223242526
2728293031  

Syndicate

RSS Atom

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Sep. 24th, 2017 03:48 pm
Powered by Dreamwidth Studios