2016-06-20 7 views
8

im folgenden Code der Suche:Ist es üblich, denselben Namen für den Datentyp und den Wertkonstruktor in Haskell zu verwenden?

data Point = Point Float Float deriving (Show) 
data Shape = Circle Point Float | Rectangle Point Point deriving (Show) 

, die aus dem Buch ein Haskell für viel Gutes Lernen Sie, die mit dem folgenden Text, um dieses Codebeispiel begleitet:

Beachten Sie, dass, wenn ein Punkt definiert, , wir haben den gleichen Namen für den Datentyp und den Wertkonstruktor verwendet. Dies hat keine besondere Bedeutung, obwohl es üblich ist, denselben Namen wie den Typ zu verwenden, wenn es nur einen Wertkonstruktor gibt.

Jetzt ist meine Vermutung ist, dass data Point = ... der Datentyp ist, und ... = Point Float... ist der Wert Konstruktor.

Meine Frage ist: Ist es üblich, den gleichen Namen für den Datentyp und Wert Konstruktor in Haskell zu verwenden?

+2

Ja, es ist. Wir verwenden jedoch normalerweise 'newtype' anstelle von' data'. Zum Beispiel wird 'State' normalerweise wie folgt definiert:' newtype State s a = Zustand {runState :: s -> (a, s)} '. –

+2

@AaditMShah Das funktioniert nur für einzelne Feldkonstruktoren. Wenn Sie nicht jedes Mal ein Tupel entpacken wollen, können Sie 'newtype' nicht für den erwähnten' Point' verwenden. – Zeta

+1

ich mir einmal darauf hingewiesen, als ich Haskell zu jemand zu erklären, dass in einigen Sprachen (zum Beispiel Java), der Konstruktor * immer * denselben Namen wie der Art hat. Für jemanden, der zu Haskell kommt, kann es verwirrend sein, verschiedene Konstruktornamen zu haben. – user2297560

Antwort

9

Aus meiner begrenzten Erfahrung: Ja. Es macht auch Sinn. Warum würdest du Point anders hier anrufen? Es beschreibt perfekt den Datentyp und ist auch klar für den Mustervergleich zu verwenden, wie dies

myFunc :: Point -> Bool 
myFunc (Point 0 0) = True 
myFunc _ = False 

Es ist eindeutig, da Sie nur den Datentyp in der Art Signatur der Funktion setzen können.

+2

Es macht sehr viel Sinn. Der einzige Nachteil ist, dass es für Anfänger, die zuerst die Sprache lernen, etwas verwirrend ist. Es ist schwer zu verstehen, dass "Point" zwei verschiedene Dinge in verschiedenen Kontexten repräsentiert. Dies sollte keinen Einfluss darauf haben, wie Sie Code in Ihren Projekten oder bei der Arbeit schreiben, aber wenn Sie jemals einen einführenden Lehrplan rund um Haskell entwerfen müssen, sollten Sie daran denken. –