Es gibt keine feste Regel, wenn es angemessen ist, aber ich neige dazu, ein paar Faustregeln zu befolgen. Lassen Sie uns ein Beispiel für eine Authentifizierungsfunktion verwenden, die einen Benutzernamen und ein Passwort verwendet. Beides sind String-Werte.
Als absolutes Minimum, ohne zusätzliche Alias oder Typen, könnte die Anmerkung sein:
authenticate : String -> String -> Bool
Da Anmerkung, ist es nicht klar ist, welche Parameter der Benutzername und das ist das Passwort . Wir können die Lesbarkeit verbessern, indem Typ Aliase:
type alias Username = String
type alias Password = String
authenticate : Username -> Password -> Bool
Das ist besser für die Verbraucher von meinem Paket aber geben Sie Aliase werden Sie nicht verbieten versehentlich die Parameter Swapping im Code aufrufen. Zum Beispiel würde diese problematische Funktion kompilieren:
login : Username -> Password -> Bool
login username password =
if authenticate password username then ...
Wenn Sie einen Schritt weiter gehen wollen und Kraft, um die explizite Deklaration des Typs jedes Mal, wenn Sie es verwenden, können Sie diese Art von Fehler zu vermeiden, da der Compiler fangen mixups:
type Username = Username String
type Password = Password String
Mit dieser Definition müssen Sie nun explizit auspacken und die Saiten entweder in einem Benutzernamen oder Passwort Konstruktor jedes Mal, wenn Sie es verwenden, verpacken. Dies ist besonders nützlich für Dinge wie Maßeinheiten, in denen ein solches Konzept avoided the loss of a Mars mission
Wie Sie in Richards Beispiel sehen können, bedeutet die Route eines vollständigen Typ- und Typkonstruktors, dass Sie separate Boilerplate-Funktionen für die JSON-Decodierung benötigen Kodierung usw., die mühsam werden können. Sie müssen die richtige Balance für Ihr Team und Ihre Projekte finden.
Das Beispiel, das Sie gezeigt haben, wird als undurchsichtiger Typ bezeichnet. Wenn Sie eines verwenden, können Sie die Implementierungsdetails von anderen Teilen Ihres Programms (oder im Fall von Bibliotheken, vom Konsumenten) ausblenden. Sie können mehr über sie in der [Elm-Pakethilfe] (http://package.elm-lang.org/help/design-guidelines#keep-tags-and-record-constructors-secret) lesen (siehe Abschnitt " Halten Sie Tags und Record-Konstruktoren geheim "). – pzp