2011-01-02 22 views
6

Stavo cercando di utilizzare l'aggiornamento dei record per un record esistenziale quando ho riscontrato un errore. Un rapido google mi ha portato a feature request #2595, che lo mostra come implementato per GHC nella versione 6.8.3. Sto utilizzando 6.10.4, quindi mi piacerebbe pensare che dovrebbe funzionare, ma il codice di esempio dalla richiesta di funzionalità:Haskell: Aggiornamento record per tipi esistenziali

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

produrrà gli stessi errori, come lamentato nella richiesta di funzionalità:

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} 

Questa funzione è stata ignorata a un certo punto oppure dovrei presentare una segnalazione di errore?

risposta

5

In realtà, lo slittamento Trac dice che è stato implementato nella versione 6.12 - il bug era trovato nella versione 6.8.3. Quindi stai usando una versione più vecchia della correzione.

Inoltre, la voce di registro delle modifiche per la correzione sembra indicare che non è completamente risolto; avresti ancora ricevuto il primo errore, ma non il secondo. Se non c'è già una segnalazione di bug per il resto del problema, direi di andare avanti e archiviare.

+2

Ah. Grazie per avermi salvato facendo un errore stupido assumendo che dovrebbe essere corretto nella mia versione. Off per andare ad aggiornare GHC! – rampion

+0

Ah, nuovo e diverso messaggio di errore, proprio come hai detto tu. Ma uno che pensa che sto facendo qualcosa di sbagliato, non che sia impossibile. – rampion

3

C'è ancora un altro modo!


Se si modifica la definizione del tipo di dati da

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

a

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

, allora compila senza errori. - using ghc-6.12.2.20100531

Problemi correlati