lambdas中的案例陈述

lambdas中的案例陈述,lambda,functional-programming,erlang,currying,Lambda,Functional Programming,Erlang,Currying,是否可以将案例陈述合并到lambda中 我试图在Erlang中创建一个递归地将两个数字相加的函数,但没有运气 Mult = fun(X) -> (fun(Y) -> case Y of 0 -> 0; Y -> X + fun(Y-1) end) end. 接收错误 syntax error before: 'end' 我认为代码中的case表达式不会导致问题。相反,函数定义本身的格式不正确 如果我正确解释了您的代码,那么您需要定义一个用于乘法的递归

是否可以将案例陈述合并到lambda中

我试图在Erlang中创建一个递归地将两个数字相加的函数,但没有运气

Mult = fun(X) -> (fun(Y) -> case Y of  
  0 -> 0;
  Y -> X + fun(Y-1)
  end)
end. 
接收错误

syntax error before: 'end'

我认为代码中的
case
表达式不会导致问题。相反,函数定义本身的格式不正确

如果我正确解释了您的代码,那么您需要定义一个用于乘法的递归函数。而
fun(Y-1)
是否打算作为递归函数调用

但是在你的例子中,
Mult
是一个变量,它被分配了一个匿名函数(或者两个嵌套的匿名函数),我认为匿名函数不允许递归

以下变化如何:

-module (mult).
-export ([mult/1]).

mult(X) ->
  fun (Y) ->
    case Y of
      0 -> 0;
      Y -> X + (mult(X))(Y-1)
  end
end.

(放在一个单独的文件中)

我认为代码中的
case
表达式不会导致问题。相反,函数定义本身的格式不正确

如果我正确解释了您的代码,那么您需要定义一个用于乘法的递归函数。而
fun(Y-1)
是否打算作为递归函数调用

但是在你的例子中,
Mult
是一个变量,它被分配了一个匿名函数(或者两个嵌套的匿名函数),我认为匿名函数不允许递归

以下变化如何:

-module (mult).
-export ([mult/1]).

mult(X) ->
  fun (Y) ->
    case Y of
      0 -> 0;
      Y -> X + (mult(X))(Y-1)
  end
end.

(放在一个单独的文件中)

不能在lambda内部使用自声明(至少在R16之前),但可以将其作为参数发送:

Mult = fun(X) ->
    YFun = fun(0, _) -> 0;
              (Y, M) ->
                  X + M(Y - 1, M)
           end,
    fun(Y) ->
        YFun(Y, YFun)
    end
end.
你得到了什么

> (Mult(2))(3).
6

不能在lambda内部使用自声明(至少在R16之前),但可以将其作为参数发送:

Mult = fun(X) ->
    YFun = fun(0, _) -> 0;
              (Y, M) ->
                  X + M(Y - 1, M)
           end,
    fun(Y) ->
        YFun(Y, YFun)
    end
end.
你得到了什么

> (Mult(2))(3).
6
请看这一页

适用于您的案例,它给出:

1> Y = fun(M) -> (fun(X) -> X(X) end)(fun (F) -> M(fun(A) -> (F(F))(A) end) end) end.
#Fun<erl_eval.6.82930912>
2> Mul = fun (F) -> fun ({X,0}) -> 0; ({X,N}) -> X + F({X,N-1}) end end.
#Fun<erl_eval.6.82930912>
3> (Y(Mul))({5,4}).                                                     
20
4> 
1>Y=fun(M)->(fun(X)->X(X)end)(fun(F)->M(fun(A)->(F(F))(A)end)end。
#乐趣
2> Mul=fun(F)->fun({X,0})->0;({X,N})->X+F({X,N-1})结束。
#乐趣
3> (Y(Mul))({5,4})。
20
4> 
我必须承认这对我来说有点复杂…

看看这页

适用于您的案例,它给出:

1> Y = fun(M) -> (fun(X) -> X(X) end)(fun (F) -> M(fun(A) -> (F(F))(A) end) end) end.
#Fun<erl_eval.6.82930912>
2> Mul = fun (F) -> fun ({X,0}) -> 0; ({X,N}) -> X + F({X,N-1}) end end.
#Fun<erl_eval.6.82930912>
3> (Y(Mul))({5,4}).                                                     
20
4> 
1>Y=fun(M)->(fun(X)->X(X)end)(fun(F)->M(fun(A)->(F(F))(A)end)end。
#乐趣
2> Mul=fun(F)->fun({X,0})->0;({X,N})->X+F({X,N-1})结束。
#乐趣
3> (Y(Mul))({5,4})。
20
4> 

我必须承认这对我来说有点复杂…

记住Erlang做模式匹配,即使在匿名函数中也是如此。你根本不需要一个案例陈述

-module (math).
-export ([mult/1]).

mult(X) -> 
    fun(0) -> 0;
       (Y) -> X + (mult(X))(Y-1)
    end.

请记住,Erlang进行模式匹配,即使在匿名函数中也是如此。你根本不需要一个案例陈述

-module (math).
-export ([mult/1]).

mult(X) -> 
    fun(0) -> 0;
       (Y) -> X + (mult(X))(Y-1)
    end.

Precise正在试验一种不使用模块实现递归调用的方法,正如您在上面演示的,可以实现递归调用(使用或不使用lambda;酷炫的代码!)语法错误的原因是
fun
是Erlang中的保留字,定义了匿名函数,因此,您不允许在类似
fun(Y-1)
的调用中使用它。Precise正在尝试一种不使用模块实现递归调用的方法,正如您在上面演示的,可以实现递归调用(使用或不使用lambda;酷代码!)。语法错误的原因是
fun
是Erlang中的保留字,定义匿名函数,因此不允许在调用中使用它,如
fun(Y-1)
。在子句
Y->X+fun(Y-1)
中要调用什么函数?如上所述,
fun(Y-1)
是问题所在。有关匿名函数如何调用自身的示例,请参阅。在子句
Y->X+fun(Y-1)
中,您希望调用什么函数?如前所述,
fun(Y-1)
是问题所在。请参阅一个匿名函数如何调用自身的示例。我没有指定任何其他内容,只是能够定义递归调用而不需要模块,这是第一个答案+1用于打开combinators的网关。除了能够定义递归调用而不需要模块之外,我没有指定任何其他内容,这是第一个答案+1用于打开combinators的网关。