2013-10-07 15 views
5
type NI = Int 
type Age = Int 
type Balance = Int 
type Person = (NI, Age, Balance) 
type Bank = [Person] 


sumAllAccounts :: NI -> Bank -> Int 
sumAllAccounts n l = filter niMatch l 
    where niMatch n (a,_,_) 
     | n == a = True 
     | otherwise = False 

Wenn ich diese Funktion zu starten erhalte ich eine Art FehlerHaskell Typ Fehler mit dem

couldnt match type (Person, t0, t1) -> Bool with Bool 

Jedoch, wenn ich machen das, wo seine eigene Funktion funktioniert es

personNIMatchs :: NI -> Person -> Bool 
personNIMatchs n (a,_,_) 
    | n == a = True 
    | otherwise = False 
+0

Bitte geben Sie die Definition von 'Bank' an. – luqui

Antwort

7

die am Werfen wir einen Blick typ von filter

filter :: (a -> Bool) -> [a]-> [a] 

Die Art der niMatch ist NI -> Person -> Bool

So Haskell a mit NI vereint, aber Person -> Bool funktioniert nicht! Das ist kein Bool, daher Ihre etwas verwirrende Fehlermeldung. Um dies zu sehen visuell Haskell Vereinigen

a -> Bool 
--^ ^unification error! 
    NI -> (Person -> Bool) 

Jetzt gehe ich davon aus, dass type Bank = [Person] dann

Sie wollen einfach nur
sumAllAccounts n = sum . map getBalance . filter matchNI 
    where matchNI (a, _, _) = a == n 
     getBalance (_, _, b) = b 
-- I've added the code here to actually sum the balances here 
-- without it, you're returning a Bank of all a persons accounts. 

Aber wir können dies besser machen! Lassen Sie uns die idiomatische Haskell-Methode machen und speichern Person als ein Rekord.

newtype Person = Person { 
    ni :: NI, 
    age :: Age, 
    balance :: Balance 
} deriving (Eq, Show) 

sumAllAccounts :: NI -> Bank -> Balance 
sumAllAccounts n = sum . map balance . filter ((==n) . ni) 

Viel besser, jetzt können wir die automatisch erzeugten Getters verwenden.

Verwandte Themen