我正在尝试使用Erlang重做我所有的Haskell作业问题,其中一件让我感到困惑的事情是如何使用没有所有参数的函数列表。
示例:我正在尝试使用这个fold,但我不知道如何传递函数,以便它在累加器上操作
%%inside my module)
add(X,Y) -> X + Y.
multiply(X,Y) -> X*Y.然后在命令行中使用以下命令:
lists:foldl(fun(Function,Accumulator) -> Function(Accumulator) end, 3, [add(3),multiply(5)]).发布于 2013-04-24 14:18:50
在Erlang中,您必须调用函数,传递它所需的所有参数。但是你可以通过创建一个匿名函数来避免它,这个匿名函数只接受你需要的参数,然后正确地调用你的函数。如果您需要一个接受一个参数X并调用函数add(3,X)的函数,您可以创建一个匿名函数,如下所示:
fun (X) -> add(3, X) end以下是您的任务示例:
lists:foldl(fun (Function, Accumulator) -> Function(Accumulator) end, 3,
[fun (X) -> add(3, X) end, fun (X) -> multiply(5, X) end]).发布于 2013-04-26 22:43:50
就原生Erlang而言,没有您想要的任何形式的部分计算。你将不得不创造自己的乐趣来做到这一点。但是,如果使用Erlando Monad Library,则可以使用模式匹配来创建它。它的工作原理是,erlang编译器允许您在编译代码时使用AST,因此您可以像这样做一些很酷的事情。
发布于 2013-04-24 21:13:53
人们可以很容易地编写一个部分应用程序函数,它被称为类似于erlang:apply/3的方式。它缺乏支持currying的语言中的优雅。
-module(partial).
-export([apply/4]).
apply(Module, Name, Arity, Args) when length(Args) < Arity ->
Left = Arity - length(Args),
fun(Args1) when length(Args1) < Left ->
fun(Args2) ->
apply(Module, Name, Arity, Args2 ++ Args1 ++ Args)
end;
(Args1) when length(Args1) > Left ->
erlang:error(badarg);
(Args1) ->
erlang:apply(Module, Name, Args1 ++ Args)
end;
apply(_, _, Arity, Args) when length(Args) > Arity ->
erlang:error(badarg);
apply(Module, Name, _, Args) ->
erlang:apply(Module, Name, Args).https://stackoverflow.com/questions/16183971
复制相似问题