2016-05-24 4 views
0

私はElixirのNumPy/SciPyの基本線形代数関数を再実装するために取り組んでいます。心配しないでください。これはやや軽い試みです。私はただ楽しみのためにやっています。関数の引数として使用される2つのリストの類似性を保証するためのElixir関数のカスタム型指定

現在、私はすでにたくさんの機能を持っていますが、特にベクターではカスタム動作を追加したいと思います。 最も簡単な例はこれです。のは、私が機能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() 

しかし、タイプは、単に実際にリストされ、こののみをチェックします。 私はあなたがエリクシルでカスタムの型指定を定義できるのは知っていますが、どのような次元数Nでもそれを定義するためのマクロを書く必要はありません。 これを行う簡単な方法はありますか?

答えて

2

私が正しく理解していれば、ベクトル/リストの長さ/寸法を知らせるtypespecを書いてみたいですか?これらの名前は、タイプの名前を含めるとの仕様を定義するためのものなので、typespecの範囲外です。ドキュメントごと:

エリクシールには、タイプと仕様を宣言するための表記が付いています。 Elixirは動的に型指定されます。そのようなtypespecは、コードを最適化または変更するためにコンパイラによって決して使用されないためです。それでも、typespecsを使うことは、Dialyzerがtypespecsを使ってコードを解析してバグを見つけるためのドキュメントやツールとして役立ちます。

ドキュメントを見る私は、確認しなければならない機能プロパティの検証と指定については触れていません。あなたが探しているものは、そのようなプロパティが検証された契約による設計のためのJavaのJMLのようなツールに似ています。私はあなたがエリクサーのために契約による設計を見てみましょうお勧め:

Elixir Contracts

Talk about the project

あなたは機能のようなもののために防御的プログラミングしたい場合にも警備員やパターンマッチングを利用することができる(探しwhenマクロ)。

関連する問題