4

有没有办法在 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 的新手,所以也许这完全没有必要。也许有一个图书馆可以做这种事情?

任何意见是极大的赞赏。提前致谢!

4

4 回答 4

5

我不知道是否已经存在可以满足您的需求的东西,但是您可以像这样轻松地实现它:

-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]}).
于 2014-04-09T04:10:58.593 回答
3

您可能想查看Erlang 匹配规范,我相信这是您要询问的那种模式。它们用于匹配Erlang 的表和数据库以及Erlang 跟踪中的值。你可能会在那里找到一些灵感。

于 2014-04-08T23:46:40.240 回答
2

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

于 2014-04-08T23:02:56.533 回答
1

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

于 2014-04-09T22:14:48.417 回答