Шаблоны первого класса в Erlang? (Альтернативы)

Есть ли способ создавать первоклассные шаблоны в 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, поэтому, возможно, это совершенно не нужно. Возможно, есть библиотека, которая делает такие вещи?

Любые советы высоко ценится. Заранее спасибо!


person Stratus3D    schedule 08.04.2014    source источник


Ответы (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]}).
person Pascal    schedule 09.04.2014

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

person Steve Vinoski    schedule 08.04.2014
comment
Проблема со спецификациями совпадения заключается в том, что нет полезных функций, которые проверяют, действительна ли спецификация совпадения для конкретного ввода. Вы должны обрабатывать их самостоятельно, тогда как предикаты очень просты в использовании и соответствуют природе функционального программирования. - person Dmitry Belyaev; 09.04.2014
comment
Шаблоны, использованные в ets:select, выглядят интересно. Доступны ли библиотеки для работы со спецификациями соответствия? - person Stratus3D; 09.04.2014

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

person Dmitry Belyaev    schedule 08.04.2014

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

person Stratus3D    schedule 09.04.2014