2016-05-24 42 views
0

我正在努力重新實現Elixir中的NumPy/SciPy的一些基本線性代數功能。別擔心,我知道這是一個有點輕浮的努力。我只是爲了好玩而做。爲Elixir函數定製typespec,以確保將兩個列表的維度用作函數的參數

目前我已經有一堆工作函數,但特別是與向量我想添加一些自定義行爲。 最簡單的例子就是這個。比方說,我有一個函數add_vectors/2

def add_vectors(vec_1, vec_2) do 
    for {el_1, el_2} <- Enum.zip(vec_1, vec_2), do: el_1 + el_2 
end 

我可以很容易地與裝飾它:

@spec add_vectors(list(), list()) :: list() 

但是,這只是檢查該類型只是事實的清單。 我知道你可以在elixir中定義自定義類型規範,但是我不想編寫一個宏來定義它的任何維度N. 有沒有簡單的方法來做到這一點?

回答

2

如果我理解正確,你想寫一個類型規範,告訴矢量/列表長度/維度?我敢肯定,這對於typespecs來說已經超出了範圍,因爲這些是爲了定義類型的規範,就像名稱所暗示的那樣。根據文檔:

Elixir帶有用於聲明類型和規格的符號。 Elixir是動態類型化的,因​​爲編譯器從不會使用這些類型描述來優化或修改代碼。儘管如此,使用typespecs很有用,因爲文檔和工具(如Dialyzer)可以使用類型描述來分析代碼以查找錯誤。

看看文檔,我沒有發現任何提及驗證和指定必須確保的函數屬性。您正在尋找的東西似乎更類似於像Java的JML這樣的工具,用於合同設計,這些屬性經過驗證。我建議你看一看契約式設計的藥劑:

Elixir Contracts

Talk about the project

您也可以利用看守和模式匹配,如果你想防守程序適用於該種功能(查找when宏)。

相關問題