Erlang-sumif函数

Erlang-sumif函数,erlang,Erlang,我试图在Erlang中创建一个sumif函数,如果谓词函数的计算结果为true,该函数将返回列表中所有元素的总和。以下是我所拥有的: sumif(_, []) -> undefined; sumif(Fun, [H|T]) -> case Fun(H) of true -> H + sumif(Fun, T); false -> sumif(Fun, T)

我试图在Erlang中创建一个
sumif
函数,如果谓词函数的计算结果为true,该函数将返回列表中所有元素的总和。以下是我所拥有的:

sumif(_, []) -> undefined;
sumif(Fun, [H|T]) -> case Fun(H) of
                       true -> H + sumif(Fun, T);
                       false -> sumif(Fun, T)
                     end.
我还实现了自己的pos函数,如果数字大于0,则返回true,否则返回false:

pos(A) -> A > 0.
我尝试将
pos
sumif
一起使用,但出现以下错误:

exception error: bad function pos
为什么会这样?是因为我的
sumif
功能还是
pos
?我自己测试了
pos
,它似乎工作得很好

编辑:可能是因为我调用函数的方式。这就是我现在如何称呼它:
hi:sumif(pos,[-1,1,2,-3])。
其中
hi
是我的模块名

是因为我的sumif功能还是pos

这是因为
sumif
。当传递空列表时,应返回
0
,当
T
[]
时,将从第2子句调用该列表:

-module(a).
-compile(export_all).

sumif(_, []) -> 0;
sumif(Fun, [H|T]) -> case Fun(H) of
                       true -> H + sumif(Fun, T);
                       false -> sumif(Fun, T)
                     end.

pos(A) -> A > 0.
测试:

是因为我的sumif功能还是pos

这是因为
sumif
。当传递空列表时,应返回
0
,当
T
[]
时,将从第2子句调用该列表:

-module(a).
-compile(export_all).

sumif(_, []) -> 0;
sumif(Fun, [H|T]) -> case Fun(H) of
                       true -> H + sumif(Fun, T);
                       false -> sumif(Fun, T)
                     end.

pos(A) -> A > 0.
测试:


列表理解使事情简单得多:

sumif(F, L) ->
    lists:sum([X || X <- L, F(X)]).
如何为第一个参数生成正确的函数:

F1 = fun pos/1,     % inside module where pos/1 defined
F2 = fun xyz:pos/1, % exported function from module xyz (hot code swap works)
N = 0,
F3 = fun(X) -> X > N end, % closure
% test it
true = lists:all(fun(F) -> is_function(F, 1) end, [F1, F2, F3]).

列表理解使事情简单得多:

sumif(F, L) ->
    lists:sum([X || X <- L, F(X)]).
如何为第一个参数生成正确的函数:

F1 = fun pos/1,     % inside module where pos/1 defined
F2 = fun xyz:pos/1, % exported function from module xyz (hot code swap works)
N = 0,
F3 = fun(X) -> X > N end, % closure
% test it
true = lists:all(fun(F) -> is_function(F, 1) end, [F1, F2, F3]).

您的代码中有两个错误: 1. <代码>sumif(,[])->未定义应返回
0
,而不是
未定义的
。
2.当您将
pos(A)->A>0.
传递到
sumif/2
时,您应该使用
fun pos/1
,请阅读


您可以使用
列表:foldl

您的代码中有两个错误: 1. <代码>sumif(,[])->未定义
应返回
0
,而不是
未定义的
。
2.当您将
pos(A)->A>0.
传递到
sumif/2
时,您应该使用
fun pos/1
,请阅读


您可以使用
列表:foldl

谢谢。这也是因为我调用
pos
函数的方式也是错误的。刚刚学到了一些新东西!非常感谢。这也是因为我调用
pos
函数的方式也是错误的。刚刚学到了一些新东西!