erlang 匿名函数和模式匹配

aor9mmx1  于 2022-12-08  发布在  Erlang
关注(0)|答案(1)|浏览(224)

我试着理解如何给一个有毒的函数不同的参数,以及传递给匿名函数的参数是什么。试着这样做是为了把它和模式匹配联系起来。
我已经看过了:
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的参数如何匹配这些参数。
此外,一般情况下,匿名函数的参数是什么?如果我给一个包含匿名函数的函数几个参数,从我所看到的来看,它会取第一个参数,但情况总是这样吗?

pgky5nke

pgky5nke1#

我认为混淆之处在于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}

关于第二个问题,匿名函数可以接受多个参数。

相关问题