2016-03-29 14 views
-1

Dies ist der newtype:Was bedeutet der Typ?

newtype Combine a b = Combine { unCombine :: (a -> b) } 

Ich habe Probleme zu verstehen, viele Dinge über diese Linie zu haben, aber die erste ist, die Klammern. Was sind sie und was machen sie hier - erstellen Sie eine Funktion aus zwei Eingabedatentypen?

+1

Wenn newtype Sie verwirrt, dann empfehle ich Ihnen, ein oder zwei Tutorials zu lesen und hängen Sie auf #haskell at irc.freenode.net um Fragen zu stellen. Sind Ihnen die Konzepte algebraischer Datentypen neu? Es ist in Ordnung, ja zu sagen! Ich habe festgestellt, dass dieses Konzept viele Menschen verwirrt, wenn ich über Haskell spreche. –

Antwort

4

Die Klammern ermöglichen die Datensatzsyntax.

newtype Combine a b = Combine (a -> b) 

unCombine :: Combine a b -> (a -> b) 
unCombine (Combine a) = a 

Nehmen Syntax erstellt die unCombine Funktion automatisch für Sie, so dass Sie es für sich selbst nicht definieren müssen: Es kann kurze Hand für die folgenden in Betracht gezogen werden. Es ist praktisch, wenn Ihre Typen viele Typparameter haben.

+0

Ich verstehe nicht, was das Ding macht. Aber ich denke, das ist etwas für eine andere Frage. Wird mit Annahme bis morgen warten. –

+3

Es macht wirklich nichts. Es ist nur ein Wrapper um eine Funktion, die ein Argument vom Typ "a" nimmt und einen Wert vom Typ "b" zurückgibt. Nach, sagen wir 'let f = Combine (\ x -> x + 3)', könnten Sie '(unCombine f) 5' ausführen und es würde 8. zurückgeben. – chepner

+3

Beachten Sie, dass die Record-Syntax ** nicht ** genau dem entspricht über dem Code. Zum Beispiel kann man mit der Record-Syntax '(ID kombinieren) {unCombine = const 1} 'machen. Das ist nur ein Teil von dem, was sie tun können. – Bakuriu