2017-06-07 16 views
1

Ich habe einen Typ:Fehler konnte nicht Typ entsprechen

newtype User = User 
    { id :: String 
    , email :: String 
    , last_update :: String 
    } 

und eine Funktion:

import Pux.DOM.HTML (HTML) 
import Pux.DOM.HTML.Attributes (key) 
import Text.Smolder.HTML as H 
import Text.Smolder.HTML.Attributes as A 

userRow :: User -> HTML Event 
    userRow user = 
    H.tr ! key user.id ! A.className "user-item" $ do 
     H.td ! key ("email") $ text user.email 
     H.td ! key ("last_update") $ text user.last_update 
     H.td ! key ("actions") ! A.className "actions" $ do 
     H.a ! key ("delete") ! A.className "action-delete" #! onClick (pure $ OpenDeleteModal (show user.id)) $ do 
      H.span 
      ! A.className "dashicons dashicons-trash" 
      ! A.alt "Delete" 
      ! A.title "Delete" 
      $ text "" 

Aber die Typen nicht vereinigen:

268 H.tr ! key user.id ! A.className "user-item" $ do 
        ^^^^ 

Could not match type 

    { id :: String 
    | t0 
    } 

with type 

    User 

while checking that type User 
    is at least as general as type { id :: String 
           | t0 
           } 
while checking that expression user 
    has type { id :: String 
      | t0 
      } 
while checking type of property accessor user.id 
in value declaration userRow 

where t0 is an unknown type 

Ich kann nicht sehen was ich falsch mache. Es scheint mir, dass der Benutzertyp ein „id“ Mitglied hat, die ein String ist, und daher ist zumindest so allgemein wie

type { id :: String 
    | t0 
    } 

Antwort

2

User ein newtype um einen Datensatz, so dass es hüllt den Rekord auf. Um auf die Datensatzfelder zugreifen zu können, müssen Sie diese zuerst entpacken. Der einfachste Weg, dies in Ihrer Situation zu tun, ist die Musterübereinstimmung auf dem user Argument:

userRow :: User -> HTML Event 
userRow (User user) = 
    H.tr ! key user.id ! A.className "user-item" $ do 
    ... 
Verwandte Themen