Erlang-sumif函数
我试图在Erlang中创建一个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)
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
函数的方式也是错误的。刚刚学到了一些新东西!