【问题标题】:First class patterns in Erlang? (Alternatives)Erlang 中的一流模式? (备择方案)
【发布时间】:2014-05-21 20:42:36
【问题描述】:

有没有办法在 Erlang 中创建一流的模式?我需要能够创建模式并将其作为参数传递给其他函数,但我知道模式在 Erlang 中不是一流的。我还查看了 Elixir,但就模式而言,它似乎没有提供更多功能。

我想知道是否有人想出了一个简单的解决方案来解决这个问题。我正在考虑尝试实现这样的东西:

% Instead of using variables, we would just use uppercase atoms which would serve as vars
% A passable pattern
Pattern = {ok, 'Result'}. 

% Custom function to check for matches
match(pattern, {ok, [1,2,3]}). % => true

我是 Erlang 的新手,所以也许这完全没有必要。也许有一个图书馆可以做这种事情?

非常感谢任何建议。提前致谢!

【问题讨论】:

    标签: erlang pattern-matching elixir first-class


    【解决方案1】:

    我最终使用 Elixir 的宏功能来实现类似于 Erlang 的匹配规范的东西。代码看起来更简洁(因为我只是用模式定义函数)并且它们的工作方式与 Erlang 的匹配规范非常相似。

    【讨论】:

      【解决方案2】:

      我不知道是否已经存在可以执行您想要的操作,但是您可以像这样轻松实现它:

      -module (match).
      
      -compile([export_all]).
      
      -define(MF(S), fun(S) -> true; (_)->false end).
      
      
      match(F,V) -> F(V).
      
      
      test() ->
          Pattern = ?MF({ok,_}),
          false = match(Pattern,{error,reason}),
          true = match(Pattern,{ok,[1,2,3]}).
      

      【讨论】:

        【解决方案3】:

        您可能想查看Erlang match specifications,我相信这是您要询问的那种模式。它们用于匹配Erlang's tables and databasesErlang tracing 中的值。您可能会在那里找到一些灵感。

        【讨论】:

        • 匹配规范的一个问题是没有可用的函数来检查匹配规范是否对特定输入有效。您必须自己处理它们,而谓词非常易于使用并且符合函数式编程的本质。
        • ets:select 中使用的模式看起来很有趣。是否有用于处理匹配规范的库?
        【解决方案4】:

        我不确定我是否看到了您的全部问题,但似乎谓词函数很适合您。在函数式语言中用它们参数化泛型函数是很常见的方法。看看列表函数,例如 map、foldl、filter。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-12-05
          • 1970-01-01
          • 1970-01-01
          • 2011-06-10
          相关资源
          最近更新 更多