2014-04-08 37 views
3

有沒有辦法在Erlang中創建一流的模式?我需要能夠創建並將模式作爲參數傳遞給其他函數,但我知道模式不是Erlang中的第一類。我也看了Elixir,但它似乎沒有提供任何更多的模式。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的新手,所以這可能完全沒有必要。也許有一個圖書館做這種事情?

任何意見非常感謝。提前致謝!

回答

3

我不知道的東西已經存在,你想要做什麼,而是你可以很容易地實現它是這樣的:

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

我不確定我看到你的整個問題,但似乎謂詞函數會很好地適應你。這是使用函數式語言對泛型函數進行參數化的常用方法。看一下列表函數,比如map,foldl,filter。

3

你可能想看看Erlang match specifications,我相信這是你所問的那種模式。它們用於匹配Erlang's tables and databases以及Erlang tracing中的值。你可能會在那裏找到一些靈感。

+0

匹配規範的一個問題是沒有可用的函數來檢查匹配規範是否對特定輸入有效。您必須自己處理它們,而謂詞非常易於使用並且符合函數式編程的性質。 –

+0

'ets:select'中使用的模式看起來很有趣。是否有可用於匹配規格的庫? – Stratus3D

0

我結束了使用藥劑的宏功能來實現類似Erlang的比賽規格的東西。代碼看起來更清晰(因爲我只是用模式定義函數),它們的工作方式非常類似於Erlang的匹配規範。