Первоклассные модели в Эрланге? (Варианты)

Есть ли способ создать первоклассные шаблоны в Erlang? Мне нужно иметь возможность создавать и передавать шаблоны в качестве аргументов другим функциям, но я знаю, что шаблоны не являются первоклассными в Erlang. Я также посмотрел на эликсир, но, похоже, он не предлагает ничего больше, чем паттерны.

Мне было интересно, если кто-нибудь придумал простое решение этой проблемы. Я думал о попытке реализовать что-то вроде этого:

% 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 ответа

Решение

Я не знаю, существует ли что-то, что делает то, что вы хотите, но вы можете легко реализовать это так:

-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]}).

Возможно, вы захотите взглянуть на спецификации соответствия Erlang, которые, я полагаю, являются типами шаблонов, о которых вы спрашиваете. Они используются для сопоставления значений в таблицах и базах данных Erlang, а также в трассировке Erlang. Вы можете найти там вдохновение.

Я не уверен, что вижу всю вашу проблему, но кажется, что функция предиката подойдет вам хорошо. Это довольно распространенный способ параметризации обобщенных функций с ними на функциональном языке. Взгляните на списки функций, таких как map, foldl, filter.

В конечном итоге я использовал макро-функциональность Elixir для реализации чего-то похожего на спецификации соответствия Эрланга. Код выглядит намного чище (поскольку я просто определяю функции с помощью шаблонов), и они работают очень похоже на спецификации совпадений Эрланга.

Другие вопросы по тегам