2016-06-20 17 views
8

Guardando il codice seguente:È comune utilizzare lo stesso nome per il tipo di dati e il costruttore di valori in Haskell?

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

che è dal libro Imparare una Haskell per la Gran Buono, che accompagna questo esempio di codice con il seguente testo:

Si noti che quando si definisce un punto , abbiamo usato lo stesso nome per il tipo di dati e il costruttore di valori. Questo non ha significato speciale, sebbene sia comune usare lo stesso nome del tipo se c'è un solo costruttore di valori.

Ora la mia ipotesi è che data Point = ... è il tipo di dati e ... = Point Float... è il costruttore di valore.

La mia domanda è: È comune utilizzare lo stesso nome per il tipo di dati e il costruttore di valori in Haskell?

+2

Sì, lo è. Tuttavia, di solito usiamo 'newtype' invece di' data'. Ad esempio, 'State' viene in genere definito come segue:' newtype State s a = State {runState :: s -> (a, s)} '. –

+2

@AaditMShah Questo funziona solo per i costruttori a campo singolo. A meno che non vogliate scartare una tupla ogni volta, non potete usare 'newtype' per il' Punto' menzionato. – Zeta

+1

Una volta mi è stato indicato quando stavo spiegando Haskell a qualcuno che in alcune lingue (ad es. Java), il costruttore * sempre * ha lo stesso nome del tipo. Quindi, per qualcuno che viene in Haskell, potrebbe essere difficile avere diversi nomi di costruttori. – user2297560

risposta

9

Dalla mia esperienza limitata: Sì. Ha anche senso. Perché dovresti chiamare Point in modo diverso qui? Esso descrive perfettamente il tipo di dati ed è anche chiaro da usare per il pattern matching come questo

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

È inequivocabile perché si può solo mettere il tipo di dati nella firma tipo di funzione.

+2

Ha molto senso. L'unico lato negativo è che è un po 'di confusione per i principianti imparare prima la lingua: è difficile seguire che "Point" rappresenta due cose diverse in contesti diversi. Questo non dovrebbe influenzare il modo in cui scrivi il codice nei tuoi progetti o al lavoro, ma se hai mai bisogno di progettare un curriculum introduttivo su Haskell è qualcosa da tenere a mente. –

Problemi correlati