2011-01-02 15 views
6

Estaba tratando de usar la actualización de registros para un registro existencial cuando me encontré con un error. Un Google rápido me llevó a feature request #2595, que lo muestra como implementado para GHC en la versión 6.8.3. Estoy usando 6.10.4, así que yo creo que debería funcionar, pero el código de ejemplo de la solicitud de función:Haskell: Actualización de registros para tipos existenciales

{-# LANGUAGE ExistentialQuantification,Rank2Types #-} 
module Foo where 

data Foo = forall a . Foo { foo :: a -> a, bar :: Int } 

x :: Foo 
x = Foo { foo = id, bar = 3 } 

f :: Foo -> Foo 
f rec = rec { foo = id } 

g :: Foo -> Foo 
g rec = rec { bar = 3 } 

producir los mismos errores que se quejó de la solicitud de función:

test.hs:10:8: 
    Record update for the non-Haskell-98 data type `Foo' is not (yet) supported 
    Use pattern-matching instead 
    In the expression: rec {foo = id} 
    In the definition of `f': f rec = rec {foo = id} 

test.hs:13:8: 
    Record update for the non-Haskell-98 data type `Foo' is not (yet) supported 
    Use pattern-matching instead 
    In the expression: rec {bar = 3} 
    In the definition of `g': g rec = rec {bar = 3} 

¿Se eliminó esta función de forma consciente en algún momento o debo presentar un informe de error?

Respuesta

5

En realidad, el deslizamiento de Trac dice que se implementó en la versión 6.12 - el error fue encontrado en la versión 6.8.3. Entonces estás usando una versión que es más antigua que la solución.

Además, la entrada del registro de cambios para la corrección parece indicar que no está completamente solucionada; todavía estarías recibiendo el primer error, pero no el segundo. Si todavía no hay un informe de fallas para el resto del problema, yo diría que adelante y archive.

+2

Ah. Gracias por salvarme de cometer un error tonto suponiendo que debería arreglarse en mi versión. Desactivado para actualizar GHC! – rampion

+0

Ah, mensaje de error nuevo y diferente, tal como lo dijo. Pero uno que piensa que estoy haciendo algo mal, no es que sea imposible. – rampion

3

¡Todavía hay otra manera!


Si cambia la definición de tipo de datos de

data Foo = forall a . Foo { foo :: a -> a, bar :: Int } 

a

data Foo = Foo { foo :: forall a . a -> a, bar :: Int } 

, entonces se compila sin error. - usando ghc-6.12.2.20100531

Cuestiones relacionadas