以下哪个代码段是首选的?为什么?
check_number(X) ->
case lists:filter(fun(Y) -> check_num(Y) end, lists:seq(1,X)) of
[] -> empty;
List -> io:format("~w~n", [List])
end.
或者
check_number(X) ->
io:format("~w~n", [[N || N <- lists:seq(1,X), check_num(N)]]).
假设check_num(N)是谓词。
答案 0 :(得分:6)
你的第二个功能不等于第一个功能。您可以编写第一个与第二个函数相同的函数:
check_number(X) ->
io:format("~w~n", [lists:filter(fun check_num/1, lists:seq(1,X))]).
正如你所看到的那样,它看起来并不大。使用哪一个完全取决于你和你同事的美感。
答案 1 :(得分:2)
你的函数check_number/1
到底应该做什么?第一个返回 empty
如果没有满足check_num/1
的整数,而如果有这样的整数,它打印它们的列表和返回 ok
(io:format
的返回值)。第二个总是打印列表,即使它是空的,返回 ok
。
请注意,打印值和返回是两个完全不同的东西。因此,我的问题是你的功能应该做什么。
在这里,哪种选择纯粹是一种选择,你可以选择一种你认为更好的选择。列表推导通常提供表达地图和过滤器的简洁方法。