65 votes

DatatypeContexts Obsolète dans les Dernières GHC: Pourquoi?

Je viens de faire quelques Haskell développement, et j'ai recompilé quelques vieux code sur une nouvelle version de GHC:

The Glorious Glasgow Haskell Compilation System, version 7.2.1

Et quand je l'ai fait, j'ai reçu le message d'erreur suivant:

Avertissement: -XDatatypeContexts est obsolète: Il a été largement considéré comme un misfeature, et a été supprimée à partir du langage Haskell.

Qui s'affiche lorsque vous disposez d'un code dans le format suivant:

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

Ma question est: Pourquoi cette fonctionnalité obsolète en premier lieu et de ce que je suis censé faire à la place pour obtenir le même ou une fonctionnalité similaire?

95voto

C. A. McCann Points 56834

Il est déconseillé parce qu'il était un misfeature, et ne l'ont pas fait ont tout de fonctionnalité utile! Il lui force un tas de contraintes supplémentaires dans d'autres endroits. En particulier, lorsque le pattern matching sur un type, vous seriez forcé d'ajouter une contrainte, plutôt que, comme on pourrait l'espérer) obtenir l'accès à un contexte, sur la base des connaissances que l'on doit d'avoir été disponible pour construire de la valeur dans la première place.

Le "remplacement", qui fonctionne dans l'autre sens et pistes connues contextes pour vous est d' utiliser GADT-les déclarations de style plutôt:

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

GADTs en général sont plus souples dans de nombreuses autres façons, mais pour ce cas particulier ce qui se passe, c'est que la création d' une valeur besoins de l' Ord de la contrainte, qui est ensuite effectuée avec la valeur, et le pattern matching sur le constructeur tire en arrière. Donc, vous n'avez même pas besoin de contexte sur les fonctions de l'utiliser, parce que vous savez qu'en vertu de l'attendent à quelque chose de type MyType a, vous obtiendrez un Ord a contrainte.

9voto

ivanm Points 3108

En général, il faut encore ajouter l' Ord a de la contrainte à n'importe quelle fonction qui utilise votre MyType type, et en tant que tel n'est pas aussi utile que cela puisse paraître. Pour plus d'informations sur pourquoi ils ont été enlevés, voir http://hackage.haskell.org/trac/haskell-prime/wiki/NoDatatypeContexts

0voto

Paulo Oliva Points 101

J'avais aussi cette erreur. ntc2 la suggestion a fonctionné pour moi, sauf qu'il faut avec un petit " t "dans " TypeContext", cabal install --ghc-option '-XDatatypeContexts' <package>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X