列表推导与高阶函数

时间:2013-03-27 19:55:05

标签: erlang list-comprehension higher-order-functions

以下哪个代码段是首选的?为什么?

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)是谓词。

2 个答案:

答案 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的整数,而如果有这样的整数,它打印它们的列表和返回 okio:format的返回值)。第二个总是打印列表,即使它是空的,返回 ok

请注意,打印值和返回是两个完全不同的东西。因此,我的问题是你的功能应该做什么。

在这里,哪种选择纯粹是一种选择,你可以选择一种你认为更好的选择。列表推导通常提供表达地图和过滤器的简洁方法。