2016-12-13 4 views
0

Geben Sie das Modell (bezogen auf this):Ulme: erhalten erste Fehlermeldung aus einer Liste

type alias ValidationResult = 
    { parameter : String 
    , errorMessage : String 
    } 


type alias ErrorResponse = 
    { validationErrors : List ValidationResult } 


decodeValidationResults : Decoder ValidationResult 
decodeValidationResults = 
    map2 ValidationResult 
    (field "Parameter" string) 
    (field "ErrorMessage" string) 

decodeErrorResponse : Decoder ErrorResponse 
decodeErrorResponse = 
    map ErrorResponse 
     (field "ValidationErrors" (list decodeValidationResults)) 

ich eine Funktion erstellen möchten, die die forst Fehlermeldung aus der Errorzurückgibt. Hier ist, was ich habe versucht:

firstErrorMessage : Decoder CardEngineErrorResponse -> String 
firstErrorMessage decoder response = 
    case List.head response.validationErrors of 
     Just something -> 
      something.errorMessage 

     Nothing -> 
      toString "" 

Aber ich bin immer die Fehlermeldung:

The definition of `firstErrorMessage` does not match its type annotation. 

The type annotation for `firstErrorMessage` says it always returns: 
  
  String 
  
 But the returned value (shown above) is a: 
  
  { b | validationErrors : List { a | errorMessage : String } } -> String 
  
 Hint: It looks like a function needs 1 more argument. 

Jeder von euch haben eine Ahnung, was ich falsch mache?

Antwort

2

Wenn Sie nur versuchen, die erste Fehlermeldung von einem ErrorResponse Wert zu erhalten, brauchen Sie nicht Decoder verweisen:

firstErrorMessage : ErrorResponse -> String 
firstErrorMessage response = 
    case List.head response.validationErrors of 
     Just something -> 
      something.errorMessage 

     Nothing -> 
      "" 

oder, kurz und bündig:

firstErrorMessage : ErrorResponse -> String 
firstErrorMessage response = 
    List.head response.validationErrors 
     |> Maybe.map .errorMessage 
     |> Maybe.withDefault "" 

Wenn Sie stattdessen versuchen, dies alles im Kontext eines Decoders zu tun, können Sie dies unter Verwendung von Json.Decode.map:

tun
firstErrorMessageDecoder : Decoder String 
firstErrorMessageDecoder = 
    decodeErrorResponse 
     |> map firstErrorMessage 

Noch ein Hinweis: Wenn etwas die Möglichkeit hat, zu versagen, ist es oft am besten, den Begriff Maybe beizubehalten. Statt auf die leere Zeichenfolge von säumigen die Anrufer über müssen wissen, können Sie eine stärkere API aufzubauen, indem eine Rückkehr Maybe String:

firstErrorMessage : ErrorResponse -> Maybe String 
firstErrorMessage response = 
    List.head response.validationErrors 
     |> Maybe.map .errorMessage 
+1

Wenn Sie jemals nach Madrid kommen, bitte sagen Sie mir, denn ich besitze Sie Kisten Bier ;) –

Verwandte Themen