2013-09-21 2 views
22

Non riesco a compilare questa riga di codice in Haskell ma funziona sul sistema del mio professore. Io uso ghci versione 7.6.2.Riga di codice Haskell non compilata: "Contesto di tipi di dati illegali"

data Eq a => Shape a = Shape a 

Più precisamente, questo è l'errore che sto ottenendo

[1 of 1] Compiling Main    (test.hs, interpreted) 

test.hs:1:6: 
Illegal datatype context (use -XDatatypeContexts): Eq a => 
Failed, modules loaded: none. 

Qual è l'errore qui?

Grazie

+0

Possibile duplicato di [Come risolvere "contesto di tipi di dati illegali" (utilizzare -XDatatypeContexts)?] (Http://stackoverflow.com/questions/22622399/how-to-fix-illegal-datatype-context-use-xdatatypecontexts) – wizzup

risposta

31

Probabilmente il tuo professore sta usando una versione precedente di GHC. La linea che hai pubblicato utilizza una funzione che è stata rimossa da poco tempo. Le soluzioni possibili sono:

  1. Rimuovere Eq a => e scrittura data Shape a = Shape a.

  2. Come dice GHC, dare il flag -XDatatypeContexts per riattivare la funzione rimossa.

Più in dettaglio: la Eq a => parte della vostra dichiarazione del tipo è chiamato un contesto tipo di dati. La sua unica funzione è limitare il tipo di costruttore Shape, in modo che invece di Shape :: a -> Shape a si ottenga Shape :: Eq a => a -> Shape a. Non ti evita di dover scrivere Eq a in firme di tipo che includono Shape s, e in effetti ti richiederà persino di scriverle quando non dovresti altrimenti. Una volta era utile quando i campi severi nei tipi di dati richiedevano un vincolo di classe, ma quella funzione era stata rimossa molto tempo fa.

In breve, la rimozione del contesto è quasi sempre un miglioramento del programma, pertanto sono stati rimossi dallo standard di lingua Haskell 2011. Dal momento che GHC 7.0.1 è stata un'opzione per disattivarli e dal 7.2.1 è stata l'impostazione predefinita.

+0

Sicuramente lo scopo di una tale restrizione non è di salvare il mio dover scrivere qualcosa ma di migliorare la sicurezza del tipo proprio costringendomi a scrivere più di quanto avrei altrimenti necessario? – Psachnodaimonia

+0

Mi spiace, digitare la sicurezza non è proprio la parola che sto cercando. Sto pensando che aggiungere il contesto crea un collegamento più stretto tra le possibilità sintattiche dei programmi e la mia intenzione semantica, e così facendo il controllo dei tipi renderà impossibili alcuni errori semantici. – Psachnodaimonia

+0

@Psachnodaimonia: non è un punto di vista irragionevole, ma penso che questa particolare caratteristica sia più confusa che utile, dal momento che molte persone si aspettano che si comporti diversamente da come funziona. –

5

Penso che il messaggio di errore è chiaro in quello che dice. Hai bisogno di un'estensione per questo.

{-# LANGUAGE DatatypeContexts #-} 
data Eq a => Foo a = Foo a 

Sebbene questa estensione utilizzato per essere per impostazione predefinita ma partendo da ghc 7,6, il suo utilizzo è considerato deprecated e verrà rimossa in futuro. Quindi il tuo professore potrebbe usare una versione precedente di ghc.

+0

Invece di aggiungere ogni volta quella riga (non so nemmeno cosa faccia esattamente), ho deciso di usare 'data Foo a = Foo a eq. Grazie per la risposta :) – Goutham

+1

Vincola i tipi' Foo' può prendere, avere un'istanza di Eq. Supponiamo che 'Bar' sia un tipo senza alcuna istanza' Eq', non puoi avere il tipo 'Foo Bar'. D'altra parte, derivando da 'Eq' deriverà un'istanza' Eq' predefinita per 'Foo'. Puoi avere un tipo 'Foo Bar' (dove' Bar' non ha l'istanza 'Eq') ma non puoi usare' == 'su di esso. – Satvik