我试着理解如何给一个有毒的函数不同的参数,以及传递给匿名函数的参数是什么。试着这样做是为了把它和模式匹配联系起来。
我已经看过了:
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的参数如何匹配这些参数。
此外,一般情况下,匿名函数的参数是什么?如果我给一个包含匿名函数的函数几个参数,从我所看到的来看,它会取第一个参数,但情况总是这样吗?
1条答案
按热度按时间pgky5nke1#
我认为混淆之处在于
mkt/2
返回的不是{changed_value, Res, C}
形式的值,而是一个新的(匿名)函数,然后可以给该函数一个与模式{exst_value, V2}
(或new
)匹配的参数,如下面在erl中的交互所示(我将mkt/2
的定义放在一个名为tmp
的模块中):关于第二个问题,匿名函数可以接受多个参数。