2011-09-15 8 views
60

Estaba haciendo un poco de desarrollo Haskell y recompilado un código de edad en una nueva versión de GHC:DatatypeContexts obsoletos en el último GHC: ¿por qué?

The Glorious Glasgow Haskell Compilation System, version 7.2.1 

Y cuando lo hice, recibí el siguiente error:

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

que aparece cuando tener el código en el siguiente formato:

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

Mi pregunta es: ¿por qué esta función está desfasada y en primer lugar, y lo que se supone que tengo que hacer? en lugar de lograr la misma o similar funcionalidad?

+11

Simplemente elimine el contexto y su código seguirá funcionando. – augustss

+0

Si obtiene un error relacionado al intentar 'cabal instalar ', intente con 'cabal install --ghc-option '-XDataTypeContexts' '. – ntc2

Respuesta

86

Está obsoleta, ya que era un misfeature, y en realidad no tienen cualquier funcionalidad útil! Todo lo que hizo fue forzar un grupo de restricciones adicionales en otros lugares. En particular, cuando la coincidencia de patrones en tal tipo, se vería obligado a agregar una restricción, en lugar de (como se podría esperar inicialmente) acceder a un contexto, en base al conocimiento de que uno debe haber estado disponible para construir el valor en primer lugar.

El "reemplazo", que en realidad funciona a la inversa y rastrea los contextos conocidos para usted, es use GADT-style declarations instead:

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

GADTs en general son más flexibles en muchas otras maneras también, pero para este caso particular, lo que sucede es que creando un valor necesita la restricción Ord, que luego se lleva junto con el valor, y la coincidencia de patrones en el constructor lo saca de nuevo. Por lo tanto, ni siquiera necesita el contexto de las funciones que lo utilizan, porque sabe que en virtud de esperar algo del tipo MyType a, obtendrá una restricción Ord a.

+0

La última frase parece un poco confusa: lo que extrae del constructor de GADT no es la restricción, sino la (s) instancia (s) que satisfacen la restricción. – dfeuer

+0

Pero si hay demasiados constructores ¿no se vuelve demasiado detallado para repetir 'Ord a' para cada uno? – fakedrake

+1

@fakedrake Quiero decir que esto no debería aparecer a menudo de todos modos. Casi siempre no quieres restringir tus tipos así. Un ejemplo de por qué es que hace que sea imposible hacer que su tipo sea 'Functor',' Plegable', 'Traversable',' Applicative', 'Monad',' Alternative', 'MonadPlus',' Arrow', etc. – semicolon

-1

También recibí este error. La sugerencia de ntc2 funcionó para mí, excepto que debería ser con una 't' pequeña en 'TypeContext', es decir, cabal install --ghc-option '-XDatatypeContexts' <package>

Cuestiones relacionadas