2016-09-19 4 views
1

Ich frage mich, was (answers entry) in totnChars entry = myLoop (answers entry) ist. Bedeutet dies, dass der Eintrag vom Typ answers sein muss? Aber ist nicht entry vom Typ Entryt?Eine Haskell-Funktion verstehen

type Question = [Char] 
type Answer = [Char] 
type Music = [Char] 
data Entryt = MyEntry { 
         questions :: [Question], 
         answers :: [Answer], 
         music :: Music, 
         time :: Float 
         } deriving (Show, Eq) 



totnChars :: Entryt -> Int 
totnChars entry = myLoop (answers entry) 

myLoop :: [Answer] -> Int 
myLoop [] = 0 
myLoop (x:rest) = (nChars x 0) + (myLoop rest) 
+1

Der Typ von 'Antworten' ist' Enquiryt -> [Answer] '. – pyon

+0

Was gewinnen wir, indem wir explizit schreiben (Antworteintrag)? – DoubleOseven

Antwort

5

answers ist eine Getterfunktion, die eine Antwortliste mit gegebenen Einträgen abruft. Daher definiert totnChars entry = myLoop (answers entry) eine Funktion, die einen Eintrag akzeptiert und myLoop auf die Antwortliste dieses Eintrags anwendet.

Bedeutet dies, dass der Eintrag vom Typ Antworten sein muss?

Nein, die Syntax zu sagen, dass etwas von einem bestimmten Typ expression :: Type wäre sein muss, aber answers ist kein Typ. Typnamen beginnen immer mit Großbuchstaben in Haskell. Sie können einen Typ Variable mit dem Namen answers einführen, aber das würde keinen Sinn ergeben. Und das ist absolut nicht das, was hier passiert. answers entry ist nur eine einfache alte Funktionsanwendung.

Aber ist Eintrag vom Typ Entryt nicht?

Ja, ist es.

3

answers hat keine Art [Answer]. Es hat Typ Entryt -> [Answer].

"Aber warum?" Sie können fragen.

Jede Entryt hat ihre eigene Liste von Antworten, die von einem Entryt zu einem anderen variieren können. answers ist also eine Funktion, die eine Entryt übernimmt und ihre Liste der Antworten zurückgibt.