ERLANG,无限列表的映射
ERLANG, map for infinite list
我想为无限列表写一个地图。
这是我目前所拥有的:
-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).
我得到一个永无止境的过程。我想,地图正在遍历整个无限列表,因此永无止境。
我做错了什么?
由于您将惰性列表表示为尾部为函数的列表,因此您对 map
的定义也需要 return 这样的值:
map(_, []) -> [];
map(F, [H | T]) -> [F(H) | fun() -> map(F, T()) end].
我想为无限列表写一个地图。 这是我目前所拥有的:
-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).
我得到一个永无止境的过程。我想,地图正在遍历整个无限列表,因此永无止境。
我做错了什么?
由于您将惰性列表表示为尾部为函数的列表,因此您对 map
的定义也需要 return 这样的值:
map(_, []) -> [];
map(F, [H | T]) -> [F(H) | fun() -> map(F, T()) end].