是否可以在lambda中包含case语句?
我正在尝试创建一个函数,在Erlang中以递归方式递归地添加两个数字而没有运气。
Mult = fun(X) -> (fun(Y) -> case Y of
0 -> 0;
Y -> X + fun(Y-1)
end)
end.
收到错误
syntax error before: 'end'
答案 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.
(将被放入单独的文件中)。