2016-05-16 4 views
2

Derzeit habe ich eine verschachtelte Komponente, die nur einen Fehlertext anzeigt. Die View-Verfahren erhält ein Model und gibt Html, aber der Compiler beschwert sich sagen, dass Html einen anderen Wert benötigt, so landete ich dies zu tun:Elm: Wie erstellt man eine Ansicht, die Msg nicht zurückgibt?

view: Model -> Html() 
view error = 
    div [class "docs-section error-bar"] [ 
     errorText error 
    ] 

errorText: Model -> Html() 
errorText error = 
    case error.text of 
    Nothing -> span [][] 
    Just value -> text value 

Was Ich mag nicht wissen, ist, dass ich den () Wert zu haben zur Unterschrift. Gibt es einen Weg, wie ich das loswerden kann?

Danke!

Antwort

4

Die Html type erfordert genau einen Parameter, so dass Sie immer geben müssen ist etwas. Die Verwendung von () als Typparameter ist eine gebräuchliche Möglichkeit, einen Dummy-Wert dorthin zu setzen.

Man konnte immer eine Art Alias ​​definieren jedes Mal zu vermeiden () eingeben:

view: Model -> OnlyHtml 
+0

Danke! Ich mag den Aliasnamen. =) – afcastano

2

Mit Html() wird schwieriger machen es für:

type alias OnlyHtml = Html() 

Dann könnten Sie Ihre Art Signaturen entsprechend ändern Sie, um diese Ansicht mit Ansichten, die tun senden Nachrichten zu komponieren. Verwenden Sie stattdessen eine Typvariable: .

Der Kleinbuchstabe m ist von entscheidender Bedeutung: Es bedeutet, dass dieser HTML-Code jede Art von Nachricht senden kann. Abgesehen davon würde das Senden einer Nachricht des unbekannten Typs das Typsystem unterbrechen und stattdessen keine Nachrichten senden. Wenn das seltsam erscheint, bedenken Sie, dass x : List a bedeutet, dass die Elemente x von einem beliebigen Typ sind, und daher gibt es keine solchen Elemente: x == [].

Die Typvariable ist der allgemeinste Typ für Ihre Funktionen. Alles, was Sie tun, indem Sie stattdessen () verwenden, gibt eine spezifischere Annotation, die erlaubt ist. Es ist so, als ob die leere Liste tatsächlich eine Liste von Strings wäre: Sicher, aber alles, was Sie getan haben, ist, dass dieser Wert für eine Funktion inakzeptabel ist, die eine Liste eines anderen Typs erwartet. Das ist, was ich unter Html() verstehe, ist schwer ohne andere Ansichten zu komponieren.

viewMsg : Html Msg 
viewUnit : Html() 
viewTypeVariable : Html msg 

views = [viewMsg, viewTypeVariable] -- This is okay 
views = [viewMsg, viewUnit] -- This is a type error! 
Verwandte Themen