2016-08-09 33 views
1

Ich brauche einen Vielleicht -Wertes in einem meiner Update-Funktionen auszupacken:Elm Maybe.withDefault

update msg model = 

    case msg of 

    UpdateMainContent val -> 
     Maybe.withDefault 100 (Just 42) 
     model 

Dies natürlich Dummy-Code ist und die

Maybe.withDefault 100 (Just 42) 

ist gerade aus dem genommen documentation for Maybe und sollte eigentlich nichts tun. Der Compiler beschwert sich und sagte:

Detected errors in 1 module. 


-- TYPE MISMATCH ----------------------------------- ./src/Review/Form/State.elm 

The 1st argument to function `withDefault` is causing a mismatch. 

15|>    Maybe.withDefault 100 (Just 42)) 
16|    -- Maybe.withDefault 100 (model.activeItem) 
17|    model 

Function `withDefault` is expecting the 1st argument to be: 

    a -> b 

But it is: 

    number 

Warum es sagt, dass "withDefault" ist das erste Argument erwartet

a -> b 

zu sein, wenn es als

a -> Maybe a -> a 

in der definiert ist, Dokumentation?

+0

Sieht aus wie Sie einige seltsame Syntaxfehler in Ihrem Code und Compiler haben versagt, sie zu erkennen. Versuchen Sie, '(Maybe.withDefault 100 (Just 42))' 'einzubinden oder fügen Sie Ihrem Beispiel mehr Code hinzu. – halfzebra

+0

@halfzebra, die genau den gleichen Fehler gibt. Ich möchte nicht den vollständigen Code-Pfad einfügen, da er groß, verschachtelt und modular ist, und das würde die Frage ein wenig zu spezifisch machen. Ich kann jedoch sagen, dass "val" nur eine einfache Zeichenfolge ist. Was Sie sagen, ist, dass ich einen Syntaxfehler außerhalb des obigen Codes haben kann, der den Fehler verursacht? Ich werde versuchen, meine Frage ein wenig zu klären. – swelet

Antwort

7

Sie in model versehentlich links:

UpdateMainContent val -> 
    Maybe.withDefault 100 (Just 42) 
    model -- <-- here 

Dies macht den Typ Inferenzalgorithmus denken, dass Maybe.withDefault 100 (Just 42) auf eine Funktion auswerten sollte, die dieses model Argument nehmen. Damit das Sinn macht, erwartet es 100 und 42 Funktionen zu sein, aber sie sind nicht, und so sagt es Ihnen.

Es könnte helfen, ein Beispiel zu sehen, wo das funktioniert:

f : Int -> Int 
f x = x + 1 

Maybe.withDefault identity (Just f) 0 

Dies bewerten zu 1.

+0

Danke Sören! Wie kann ich es umschreiben, um das zu vermeiden? Wickeln Sie es einfach in Parens: (Maybe.withDefault 100 (nur 42)) gibt den gleichen Fehler! – swelet

+1

Löschen Sie die Zeile mit 'Modell'? –

+0

Ich brauche den Fall, um "Modell" zurückzugeben. Ich denke, dass ich hier etwas vermisse (ziemlich neu in der funktionalen Programmierung). Ist es nicht möglich, irgendeinen beliebigen Code auszuführen, bevor etwas aus einem Fall zurückgegeben wird? – swelet