我尝试了解如何为匿名函数提供不同的参数,以及什么作为参数传递给匿名函数。尝试这样做,以便将其与模式匹配联系起来。
我看过:
https://learnyousomeerlang.com/higher-order-functions#anonymous-functions
在此声明:
fun(Args1) ->
Expression1, Exp2, ..., ExpN;
(Args2) ->
Expression1, Exp2, ..., ExpN;
(Args3) ->
Expression1, Exp2, ..., ExpN
end
我想我可以传递不同的参数并得到不同的模式。不过我已经编写了以下代码:
mkt(add, {V1, C}) ->
fun(new) -> {changed_value, V1, C};
({exst_value, V2}) ->
try V1 + V2 of
Res -> {changed_value, Res, C}
catch
_:_ ->
nothing
end
end;
mkt(mult, {V1, C}) ->
fun(new) -> {changed_value, V1, C};
({exst_value, V2}) ->
try V1 * V2 of
Res -> {changed_value, Res, C}
catch
_:_ ->
nothing
end
end.
sym_mkt(Opr, Args) -> {call, ?MODULE, mkt, [Opr, Args]}.
term_transf(KeyGen) ->
oneof(
[ ?LET({K, V, C}, {KeyGen, int(), cost()},
return ({K, sym_mkt(add,{V,C})})),
?LET({K, V, C}, {KeyGen, int(), cost()},
return ({K, sym_mkt(mult,{V,C})}))
]).
基于对 mkt(...)
及其当前变量的调用,有没有一种方法可以向其传递参数,以便具有第二个原子的匿名函数(例如 {exst_value, ...}
) 被激活,因为我不知道 mkt 的参数如何与这些参数匹配。
此外,一般情况下,什么会作为参数传递给匿名函数。如果我给一个带有匿名函数的函数提供多个参数,从我所看到的来看,它会采用第一个参数。 但情况总是如此吗?
最佳答案
我认为困惑在于 mkt/2
返回的内容,它不是 {changed_value, Res, C}
形式的值,而是一个新(匿名)功能。然后,可以为该函数提供一个与模式 {exst_value, V2}
(或 new
)匹配的参数,如 erl 中的以下交互所示(我在其中定义了 mkt/2
在名为 tmp
的模块中):
1> c(tmp).
{ok,tmp}
2> F = tmp:mkt(add, {1, foo}).
#Fun<tmp.1.37861693>
3> F({exst_value, 2}).
{changed_value,3,foo}
4> F(new).
{changed_value,1,foo}
关于你的第二个问题,匿名函数可以接受多个参数。
关于erlang - 匿名函数和模式匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72949987/