Первоклассные модели в Эрланге? (Варианты)
Есть ли способ создать первоклассные шаблоны в 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 для реализации чего-то похожего на спецификации соответствия Эрланга. Код выглядит намного чище (поскольку я просто определяю функции с помощью шаблонов), и они работают очень похоже на спецификации совпадений Эрланга.