2015-05-04 21 views
5

Nel Haskell 98 report, ho trovato questo:Haskell: Perché non sono permessi i costruttori del tipo infisso?

La sintassi per espressioni di tipo Haskell è dato sopra. Proprio come i valori dei dati vengono creati utilizzando i costruttori di dati, i valori di tipo vengono creati dai costruttori di tipi. Come con i costruttori di dati, i nomi dei costruttori di tipi iniziano con lettere maiuscole. A differenza dei costruttori di dati, i costruttori di tipo infisso non sono consentiti (diversi da (->)).

Non ci sono ragioni per perché di tipo infisso costruttori non sono ammessi sono dati. In Agda e simili, i costruttori di tipi infissi sono all'ordine del giorno. Perché non in Haskell?

+2

Haskell appropriato potrebbe non permetterlo, ma GHC ha estensioni che fanno https://downloads.haskell.org/~ghc/latest/docs/html/users_guide/data-type-extensions.html – jamshidh

risposta

10

Non fa parte dello standard Haskell, ma come jamshidh indica che è ancora possibile in GHC. L'avvertenza è che i costruttori dati (non digitare costruttori) devono iniziare con i due punti:

{-# LANGUAGE TypeOperators #-} 

data a + b = a :+ b 

f :: a + b -> a 
f (a :+ b) = a 

g :: a + b -> b 
g (a :+ b) = b 
+4

Non è necessario abilitare 'TypeOperators' per il costruttore infisso con': 'ma può scrivere' data A ab = a:> b derivando Show' – Michael

4

Giusto per essere del tutto chiaro: Haskell 98 e Haskell 2000, sia permettono infissa costruttori valore come

data Complex r = r :+ r 

Qui il costruttore di valori (:+) è fisso, come in 5 :+ 7.

È necessaria solo l'estensione TypeOperators per i costruttori di tipo che sono infissi. Ad esempio,

data x ??! y = Left x | Right y 

Qui il tipo di costruzione (??!) è infisso, come nel Int ??! Bool.

Problemi correlati