Ленивые вычисления и "неправильные" списки.

60 views
Skip to first unread message

ufm

unread,
Jul 29, 2010, 4:33:24 PM7/29/10
to Erlang в России
Подскажите, зачем для "ленивых" вычислений предлагается использовать
"неправильные" списки?
Т.е. я не совсем понимаю, чем отличается

next(Seq) ->
fun() -> [Seq|next(Seq+1)] end.

от

next(Seq) ->
fun() -> [Seq,next(Seq+1)] end.

Первое предлагается использовать так:

24> SeqFun0 = sequence:next(0).
#Fun<sequence.0.31154838>
25> [Seq1|SeqFun1] = SeqFun0().
[0|#Fun<sequence.0.31154838>]
26> [Seq2|SeqFun2] = SeqFun1().
[1|#Fun<sequence.0.31154838>]

Второе можно использовать так:

24> SeqFun0 = sequence:next(0).
#Fun<sequence.0.31154838>
25> [Seq1,SeqFun1] = SeqFun0().
[0,#Fun<sequence.0.31154838>]
26> [Seq2,SeqFun2] = SeqFun1().
[1,#Fun<sequence.0.31154838>]

P.S. Судя по всему, dict тоже вовсю использует "неправильные" списки.

Gleb Peregud

unread,
Jul 29, 2010, 4:42:41 PM7/29/10
to erlang-...@googlegroups.com
2010/7/29 ufm <ufm...@gmail.com>:

> P.S. Судя по всему, dict тоже вовсю использует "неправильные" списки.

На сколько мне известно - это микрооптимизация для ограничения
используемого объёма памяти, т.к. improper list это самая маленькая
структура для хранения пары значений (двойной кортеж и правильный
список длинны 2 занимают больше памяти)

Фролов Дмитрий

unread,
Jul 29, 2010, 5:48:11 PM7/29/10
to erlang-...@googlegroups.com
Вообще, ленивых вычислений в erlang нет! Это промышленная real-time система, где важен актуальный отклик от процесса. А отличия в примере - разная транспозиция элементов списка:
1> [123 | [12,23,34]].
[123,12,23,34]
2> [123 , [12,23,34]].
[123,[12,23,34]]
3> 


30 июля 2010 г. 0:42 пользователь Gleb Peregud <gleb...@gmail.com> написал:

--
Страница рассылки: http://groups.google.com/group/erlang-russian
 Jabber-конференция: erl...@conference.jabber.ru
 Новости: http://erlanger.ru

Maxim Treskin

unread,
Jul 29, 2010, 5:54:52 PM7/29/10
to erlang-...@googlegroups.com
В примере ленивость достигается через fun(), которые вычисляются в тот момент, когда используются.

2010/7/30 Фролов Дмитрий <fro...@dostavka.ru>



--
Maxim Treskin

Фролов Дмитрий

unread,
Jul 29, 2010, 5:59:52 PM7/29/10
to erlang-...@googlegroups.com
Это не ленивость. Она в haskell. Тут при  вызове f(g(a)) ---- g(a) выполнится по-любому ( не важно - используется это в f или нет )

30 июля 2010 г. 1:54 пользователь Maxim Treskin <zert...@gmail.com> написал:
Reply all
Reply to author
Forward
0 new messages