2011-01-02 8 views
6

Ich habe versucht, Datensatzaktualisierung für einen existenziellen Datensatz zu verwenden, wenn ich auf einen Fehler stieß. Eine schnelle Google führte mich zu feature request #2595, die es als implementiert für GHC zurück in Version 6.8.3 zeigt. Ich verwende 6.10.4, also denke ich, würde es sollte funktionieren, aber der Beispiel-Code aus der Feature-Anfrage:Haskell: Datensatzaktualisierung für Existential-Typen

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

ergibt die gleichen Fehler wie die in der Feature-Anfrage klagte:

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} 

War das irgendwann ein bewusst fallen gelassenes Feature, oder sollte ich einen Fehlerbericht einreichen?

Antwort

5

Eigentlich sagt der Trac Slip, dass es in Version 6.12 implementiert wurde - der Fehler war gefunden in Version 6.8.3. Sie verwenden also eine ältere Version als das Update.

Auch der Changelog-Eintrag für das Update scheint anzuzeigen, dass es nicht vollständig behoben ist; Sie würden immer noch den ersten Fehler bekommen, nur nicht die Sekunde. Wenn es für den Rest des Problems noch keinen Fehlerbericht gibt, würde ich sagen, gehen Sie voran und feilen Sie.

+2

Ah. Danke, dass du mich davor bewahrt hast, einen dummen Fehler zu machen, indem ich annehme, dass es in meiner Version behoben werden sollte. Aus, um GHC zu aktualisieren! – rampion

+0

Ah, neue und andere Fehlermeldung, genau wie du gesagt hast. Aber jemand, der denkt, dass ich etwas falsch mache, nicht dass es unmöglich ist. – rampion

3

Es gibt noch einen anderen Weg!


Wenn Sie die Datentypdefinition von

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

zu

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

, dann kompiliert es ohne Fehler. - mit ghc-6.12.2.20100531