lambdas中的case语句

时间:2013-03-12 22:16:27

标签: lambda functional-programming erlang currying

是否可以在lambda中包含case语句?

我正在尝试创建一个函数,在Erlang中以递归方式递归地添加两个数字而没有运气。

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

收到错误

syntax error before: 'end'

4 个答案:

答案 0 :(得分:2)

你不能在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 :(得分:2)

查看此页http://rosettacode.org/wiki/Y_combinator

适用于您的案例,它提供:

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> 

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

答案 2 :(得分:1)

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

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

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

答案 3 :(得分:0)

我认为代码中的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.

(将被放入单独的文件中)。