ERLANG, карта для бесконечного списка

Я хотел написать карту для бесконечного списка. Это то, что у меня есть на данный момент:

-module(map).
-export([ints/0,take/2,map/2, double_int/1]).

ints() -> ints_from(0).

take(0, _)         -> [];
take(N, [H|LazyT]) -> [H | take(N-1, LazyT())].

double_int(N) -> 2 * N.

map(_, []) -> [];
map(F, [H | T]) -> [F(H) | map(F, T())].

ints_from(N) -> [N | fun () -> ints_from(N+1) end].

Проблема в том, что при звонке

> L = map:ints().
[0|#Fun<map.0.104601022>]
> R = map:map(fun map:double_int/1, L).

Я получаю нескончаемый процесс. Думаю, карта проходит через весь бесконечный список и, следовательно, никогда не заканчивается.

Что я делаю неправильно?


person user3556115    schedule 20.04.2015    source источник
comment
Какое определение для ints_from?   -  person legoscia    schedule 20.04.2015
comment
ints_from (N) - ›[N | fun () - ›ints_from (N + 1) end].   -  person user3556115    schedule 20.04.2015


Ответы (1)


Поскольку вы представляете ленивые списки как списки, хвост которых является функцией, ваше определение map также должно возвращать такое значение:

map(_, []) -> [];
map(F, [H | T]) -> [F(H) | fun() -> map(F, T()) end].
person legoscia    schedule 20.04.2015
comment
Большое тебе спасибо. Я думал, что возврата функции из списка будет достаточно. Но это не тот случай. Теперь я лучше понимаю бесконечные списки. - person user3556115; 21.04.2015