2011-09-15 11 views
60

Stavo solo facendo un po 'di sviluppo Haskell e ho ricompilato qualche vecchio codice su una nuova versione del GHC:DatatypeContexts Deprecated in Latest GHC: Why?

The Glorious Glasgow Haskell Compilation System, version 7.2.1 

E quando l'ho fatto ho ricevuto il seguente errore:

Warning: -XDatatypeContexts is deprecated: It was widely considered a misfeature, and has been removed from the Haskell language.

che appare quando si avere il codice nel seguente formato:

data Ord a => MyType a 
    = ConstructorOne a 
    = ConstructorTwo a a 

la mia domanda è: Perché questa funzione deprecato in primo luogo, e cosa dovrei fare io per ottenere la stessa funzionalità o simili?

+11

Basta rimuovere il contesto e il codice funzionerà ancora. – augustss

+0

Se stai ricevendo un errore correlato quando si cerca 'cabala installare ', quindi provare 'cabala installare --ghc-opzione '' -XDataTypeContexts '. – ntc2

risposta

86

E 'sconsigliato perché era un misfeature, e in realtà non hanno qualsiasi funzionalità utile! Tutto ciò che ha fatto è stato costringere un sacco di vincoli extra in altre posizioni. In particolare, quando si esegue la corrispondenza dei pattern su un tipo di questo tipo, si dovrebbe forzare ad aggiungere un vincolo, piuttosto che (come si potrebbe inizialmente sperare) ottenere l'accesso a un contesto, in base alla consapevolezza che uno deve essere disponibile per costruire il valore innanzitutto.

La "sostituzione", che funziona in realtà il contrario e traccia i contesti noti per voi, è quello di use GADT-style declarations instead:

data MyType a where 
    ConstructorOne :: Ord a => a -> MyType a 
    ConstructorTwo :: Ord a => a -> a -> MyType a 

GADTs, in generale, sono più flessibili in molti altri modi, ma per questo caso particolare ciò che accade è che crea un valore ha bisogno del vincolo Ord, che viene poi portato insieme al valore, e la corrispondenza del modello sul costruttore lo ritira. Quindi non hai nemmeno bisogno del contesto sulle funzioni che lo utilizzano, perché sai che, in virtù del previsto qualcosa di tipo MyType a, avrai un vincolo Ord a con esso.

+0

L'ultima frase sembra un po 'poco chiara: ciò che si tira dal costruttore GADT non è il vincolo ma piuttosto l'istanza (s) che soddisfa il vincolo. – dfeuer

+0

Ma se ci sono troppi costruttori non diventa troppo prolisso ripetere "Ord a" per ognuno? – fakedrake

+1

@fakedrake Voglio dire che questo non dovrebbe venire spesso in ogni caso. Quasi sempre non vuoi limitare i tuoi tipi in questo modo. Un esempio per il motivo è che essa rende impossibile per rendere il vostro tipo di un Functor', 'Foldable',' Traversable', 'Applicative',' Monad', 'Alternative',' MonadPlus', '' Arrow' e così via. – semicolon

-1

Ho ricevuto anche questo errore. Il suggerimento di ntc2 ha funzionato per me, tranne che dovrebbe essere con "t" piccolo in "TypeContext", ovvero cabal install --ghc-option '-XDatatypeContexts' <package>