2017-04-02 6 views
0

Ich habe einen Typ:Typenkonflikt beim Versuch, den Typ in Elm zu destrukturieren?

type MenuItem msg 
    = MenuItem 
     { attributes : List (Attribute msg) 
     , children : List (Html msg) 
     } 

, die Teil eines NavBar ist. Dann habe ich eine Funktion renderItems, die eine Liste von MenuItem s macht:

renderItems : List (MenuItem msg) -> Html msg 
renderItems items = 
    ul [ class "nav-list" ] (List.map renderItem items) 

renderItems, wie Sie sehen können, ruft renderItem, die wie folgt aussieht:

renderItem : MenuItem msg -> Html msg 
renderItem { attributes, children } = 
    li [ class "nav-item" ] 
     [ a ([ class "nav-link" ] ++ attributes) 
      children 
     ] 

Aber ich bekomme einen Compiler-Fehler hier :

This record is causing problems in this pattern match. 

14| renderItem { attributes, children } = 
       ^^^^^^^^^^^^^^^^^^^^^^^^ 
The pattern matches things of type: 

    MenuItem msg 

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

    { c | attributes : a, children : b } 

Detected errors in 1 module. 

Kann jemand das für mich interpretieren? Ich verstehe das Missverhältnis nicht. attributes und children scheinen ziemlich gut zusammenzupassen.

Antwort

4
type MenuItem msg 
    = MenuItem 
     { attributes : List (Attribute msg) 
     , children : List (Html msg) 
     } 

unterscheidet sich von

type alias MenuItem msg 
    = { attributes : List (Attribute msg) 
     , children : List (Html msg) 
     } 

Letzteres kann Muster der Art und Weise angepasst sein, das Sie tat:

renderItem { attributes, children } = 

aber der ehemalige, da es auch in einem Daten Konstruktor gewickelt wird benötigt ausgepackt werden:

renderItem (MenuItem { attributes, children }) = 
Verwandte Themen