Erlang新手:我正在研究Joe Armstrong的书中的例子,并且我正在测试他的代码以获得" for循环。"我想我得到了一个不合适的名单,但我不确定为什么。以下(从第1版的书中)编译并加载就好了:
-module(lib_misc).
-export[for/3].
for(Max, Max, F) ->
[F(Max)];
for(I, Max, F) ->
[F(I)|for(I+1, Max, F)].
erl> lib_misc:for(1,10, fun(I) -> I end).
返回:
[1,2,3,4,5,6,7,8,9,10]
正如所料。但是,如果100代替10:
[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23, 24,25,26,27,28 29 | ...]
这适用于所有数字> 29.是否有一个" automagic" (或用户可配置)限制列表的元素?如果此代码生成不正确的列表,为什么?提前谢谢。
注意:我正在运行"最新的" (17.3)在Windows,Debian和NixO上构建erlang,我得到了相同的结果......
答案 0 :(得分:3)
length(lib_misc:for(1,10, fun(I) -> I end))
的长度。你会发现它具有正确的价值。你也可以打印出来:
io:format("~p~n",[lib_misc:for(1,10, fun(I) -> I end)]).
这是一般性警告,shell会以“最佳”演示文稿显示结果。对于长列表或深层嵌套术语,它会产生一些“摘要”以避免潜在的数百页。