2017-01-01 5 views
1

Ich verwende Ulme-Form: https://github.com/etaque/elm-form/, und ich brauche, um Muster einen polymorphen Typen in einen konkreten Typen zu entsprechen, aber ich die nächsten Fehler bekam:Muster einen polymorphen Typen entsprechen in konkreter in Elm

The pattern matches things of type: 

    TranslationId 

But the values it will actually be trying to match are: 

    e 

Hint: Your type annotation uses type variable `e` which means any type of value 
can flow through. Your code is saying it CANNOT be anything though! Maybe change 
your type annotation to be more specific? Maybe the code has a problem? More at: 
<https://github.com/elm-lang/elm-compiler/blob/0.18.0/hints/type-annotations.md> 
dies ist

Der Code in Frage:

translateError : ErrorValue e -> String 
translateError error = 
    case error of 
     InvalidEmail -> 
      translate English ErrInvalidEmail 

     Empty -> 
      translate English ErrEmpty 

     CustomError PasswordNotMatch -> 
      translate English PasswordNotMatch 

     x -> 
      toString x 

ErrorValue Typ https://github.com/etaque/elm-form/blob/f9480cb8646ebc9f78f13d3a7482c463c5275776/src/Form/Error.elm#L19:

type ErrorValue e 
    = Empty 
    | InvalidString 
    | InvalidEmail 
    | InvalidUrl 
    | InvalidFormat 
    | InvalidInt 
    | InvalidFloat 
    | InvalidBool 
    | InvalidDate 
    | SmallerIntThan Int 
    | GreaterIntThan Int 
    | SmallerFloatThan Float 
    | GreaterFloatThan Float 
    | ShorterStringThan Int 
    | LongerStringThan Int 
    | NotIncludedIn 
    | CustomError e 

TranslationId Typ https://github.com/werner/madison-elm/blob/master/src/elm/Translations/Utils.elm#L9:

type TranslationId 
    = ErrInvalidEmail 
    | PasswordNotMatch 
    | ErrEmpty 

kam ich mit einer Lösung, aber es sieht seltsam und ich bin nicht sicher, ob es die richtige https://github.com/werner/madison-elm/blob/master/src/elm/Translations/FormErrors.elm#L7:

translateError : ErrorValue e -> String 
translateError error = 
    case error of 
     InvalidEmail -> 
      translate English ErrInvalidEmail 

     Empty -> 
      translate English ErrEmpty 

     CustomError e -> 
      case (toString e) of 
       "PasswordNotMatch" -> 
        translate English PasswordNotMatch 
       x -> 
        toString x 

     x -> 
      toString x 
+1

Das ist, weil Sie nicht sind die festlegen, was 'e' ist in' translateError: ErrorValue e -> String' - so es weiß nichts über es. Vielleicht die 'e -> String' Funktion übergeben? – Reactormonk

Antwort

2

Wie @reactormonk sagt, Sie sind Adressierung der Typvariablen in Ihrer Typdefinition nicht. elm-form bietet Flexibilität im benutzerdefinierten Fehler durch diese Typvariable, die Sie selbst liefern müssen, wenn Sie benutzerdefinierte Fehler verwenden möchten (wenn Sie dies nicht tun, können Sie die Variable im gesamten Code ohne Probleme verwenden).

Insbesondere ErrorValue hat eine Variable vom Typ e, die Sie angeben müssen: im Code keine Rolle spielt, die nicht den Konstruktor Custom nicht verwendet, aber nicht egal, in translateError, weil Sie zu Mustererkennung auf Custom versuchen. Es sieht aus, als ob der Typ Sie wollen, TranslationId so wollen Sie

translateError : ErrorValue TranslationId -> String 
translateError error = 
    case error of 
     InvalidEmail -> 
      translate English ErrInvalidEmail 

     Empty -> 
      translate English ErrEmpty 

     CustomError PasswordNotMatch -> 
      translate English PasswordNotMatch 

     x -> 
      toString x 
+0

Ich habe das gemacht, dann rufe ich es von [hier] (https://github.com/werner/madison-elm/blob/master/src/elm/ViewHelpers.elm#L32), dann habe ich die Typ-Signatur um geändert : 'errorFor: FieldState Übersetzungs-ID String -> Html msg', dann habe ich einen Fehler von [hier] (https://github.com/werner/madison-elm/blob/master/src/elm/ViewHelpers.elm#L25), ich bin endlich stecken geblieben. –

+1

Ich habe versucht, meine Antwort ein wenig vollständiger zu machen, aber der Rat ist der gleiche –

+0

Ja, ich weiß, dass Sie sich die Zeit genommen haben, dies zu überprüfen. Aber vielleicht habe ich nicht genug erklärt und folge deinem Rat zu diesem Punkt (https://github.com/werner/madison-elm/blob/master/src/elm/ViewHelpers.elm#L25), Das ruft eine Funktion 'getFieldAsString' aus dem elm-form-Paket auf, wie Sie [hier] (https://github.com/etaque/elm-form/blob/3e97913dab84f2fb5432379664a9f578d4158f48/src/Form.elm#L92) sehen können ein Typ der Form: 'FieldState e String', jedoch übergebe ich:' FieldState TranslationId String', dies erzeugt den Fehler. –