2016-05-24 14 views
0

Ich arbeite daran, einige grundlegende Funktionen der linearen Algebra von NumPy/SciPy in Elixir zu implementieren. Mach dir keine Sorgen, ich weiß, das ist ein etwas frivoles Unterfangen. Ich mache es nur zum Spaß.Angepasste Typespec für Elixir-Funktion, um die Dimensionalität von zwei Listen zu gewährleisten, die als Argumente für eine Funktion verwendet werden

Derzeit habe ich bereits eine Reihe von Arbeitsfunktionen, aber vor allem mit Vektoren möchte ich einige benutzerdefinierte Verhaltensweisen hinzufügen. Das einfachste Beispiel wäre dies. Sagen wir, ich habe eine Funktion add_vectors/2:

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

Aber dies nur überprüft, ob der Typ einfach in der Tat ist eine Liste:

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 

ich es leicht mit schmücken könnte. Ich weiß, dass Sie benutzerdefinierte Typespecs in Elixier definieren können, aber ich möchte nicht ein Makro schreiben müssen, das durchgeht, um es für jede Dimensionalität N zu definieren. Gibt es eine einfache Möglichkeit, dies zu tun?

Antwort

2

Wenn ich richtig verstanden habe, möchten Sie eine Typespec schreiben, die die Vektoren/Listen Länge/Dimension erzählt? Ich bin mir ziemlich sicher, dass dies für Typespecs nicht möglich ist, da diese Spezifikationen für Typen definieren sollen, wie der Name andeutet. Nach der Dokumentation:

Elixir kommt mit einer Notation für die Deklaration von Typen und Spezifikationen. Elixir wird dynamisch typisiert, da solche Typen niemals vom Compiler verwendet werden, um Code zu optimieren oder zu modifizieren. Dennoch ist die Verwendung von typespecs als Dokumentation nützlich und Tools wie Dialyzer können den Code mit typespecs analysieren, um Fehler zu finden.

Mit Blick auf die Dokumente finde ich keine Erwähnung der Validierung und Angabe von Funktionseigenschaften, die gewährleistet werden müssen. Was Sie suchen, ähnelt eher Tools wie Java JML für die Vertragsgestaltung, wo solche Eigenschaften validiert werden. Ich schlage vor, Sie einen Blick auf Design-nehmen durch Vertrag für Elixir:

Elixir Contracts

Talk about the project

Sie auch Wachen und Muster verwenden können passend, wenn Sie defensiv für diese Art von Funktionen programmieren möchten (suchen Sie nach der when Makro).