首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Currying函数Erlang

Currying函数Erlang
EN

Stack Overflow用户
提问于 2013-04-24 13:23:37
回答 5查看 2.8K关注 0票数 10

我正在尝试使用Erlang重做我所有的Haskell作业问题,其中一件让我感到困惑的事情是如何使用没有所有参数的函数列表。

示例:我正在尝试使用这个fold,但我不知道如何传递函数,以便它在累加器上操作

代码语言:javascript
复制
%%inside my module)
add(X,Y) -> X + Y.

multiply(X,Y) -> X*Y.

然后在命令行中使用以下命令:

代码语言:javascript
复制
lists:foldl(fun(Function,Accumulator) -> Function(Accumulator) end, 3, [add(3),multiply(5)]).
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-04-24 14:18:50

在Erlang中,您必须调用函数,传递它所需的所有参数。但是你可以通过创建一个匿名函数来避免它,这个匿名函数只接受你需要的参数,然后正确地调用你的函数。如果您需要一个接受一个参数X并调用函数add(3,X)的函数,您可以创建一个匿名函数,如下所示:

代码语言:javascript
复制
fun (X) -> add(3, X) end

以下是您的任务示例:

代码语言:javascript
复制
lists:foldl(fun (Function, Accumulator) -> Function(Accumulator) end, 3,
    [fun (X) -> add(3, X) end, fun (X) -> multiply(5, X) end]).
票数 13
EN

Stack Overflow用户

发布于 2013-04-26 22:43:50

就原生Erlang而言,没有您想要的任何形式的部分计算。你将不得不创造自己的乐趣来做到这一点。但是,如果使用Erlando Monad Library,则可以使用模式匹配来创建它。它的工作原理是,erlang编译器允许您在编译代码时使用AST,因此您可以像这样做一些很酷的事情。

票数 5
EN

Stack Overflow用户

发布于 2013-04-24 21:13:53

人们可以很容易地编写一个部分应用程序函数,它被称为类似于erlang:apply/3的方式。它缺乏支持currying的语言中的优雅。

代码语言:javascript
复制
-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).
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16183971

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档