erlang - 匿名函数和模式匹配

标签 erlang pattern-matching anonymous-function erlang-shell

我尝试了解如何为匿名函数提供不同的参数,以及什么作为参数传递给匿名函数。尝试这样做,以便将其与模式匹配联系起来。

我看过:

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/

相关文章:

erlang - Elixir GenServer 教程中的计时错误?

postgresql - Postgres 三元组搜索中 AND OR NOT 的语法是什么?

JavaScript匿名函数参数及调用安排

javascript - 函数未作为函数传递

javascript:在函数(){}中使用当前的for循环计数器值?

erlang - 如何用Erlang编写一个简单的Web服务器?

unit-testing - 使用状态记录的单元测试流程

erlang - rebar 和 rebar3 有什么区别?或 erlang.mk

linux - 如何实现按模式查找文件?

arrays - 基于模式匹配的冷融合计数