2011-01-02 2 views
6

J'essayais d'utiliser la mise à jour d'enregistrement pour un enregistrement existentiel lorsque j'ai rencontré une erreur. Un rapide google m'a conduit à feature request #2595, qui le montre comme implémenté pour GHC dans la version 6.8.3. J'utilise 6.10.4, donc je pense que cela devrait fonctionner, mais le code exemple de la demande de fonctionnalité:Haskell: Mise à jour d'enregistrement pour les types existentiels

{-# 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 } 

donnent les mêmes erreurs que dénoncées dans la demande de fonctionnalité:

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} 

Était-ce une fonctionnalité consciemment abandonnée à un moment donné, ou devrais-je déposer un rapport de bogue?

Répondre

5

En fait, le bordereau Trac indique qu'il a été implémenté dans la version 6.12 - le bogue était trouvé dans la version 6.8.3. Vous utilisez donc une version plus ancienne que le correctif. En outre, l'entrée changelog pour le correctif semble indiquer qu'il n'est pas complètement corrigé; vous auriez toujours la première erreur, mais pas la seconde. S'il n'y a pas déjà un rapport de bug pour le reste du problème, je dirais aller de l'avant et classer.

+2

Ah. Merci de m'avoir sauvé de faire une erreur stupide en supposant qu'il devrait être corrigé dans ma version. Off pour aller mettre à jour GHC! – rampion

+0

Ah, nouveau et différent message d'erreur, comme vous l'avez dit. Mais celui qui pense que je fais quelque chose de mal, pas que c'est impossible. – rampion

3

Il y a encore un autre moyen!


Si vous modifiez la définition du type de données à partir

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

à

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

, il compile sans erreur. - en utilisant ghc-6.12.2.20100531

Questions connexes