2011-01-02 16 views
6

Próbowałem użyć aktualizacji rekordu dla rekordu egzystencjalnego, gdy wystąpił błąd. Szybki google doprowadził mnie do feature request #2595, który pokazuje go jako zaimplementowany dla GHC w wersji 6.8.3. Używam 6.10.4, tak że myślę, że to powinno działać, ale przykładowy kod z żądania cecha:Haskell: Aktualizacja rekordu dla typów egzystencjalnych

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

uzyskując te same błędy jak skarżył się we wniosku cecha:

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} 

Czy w pewnym momencie została ona świadomie upuszczona, czy też powinienem zgłosić zgłoszenie błędu?

Odpowiedz

5

W rzeczywistości, komunikat Trac mówi, że został zaimplementowany w wersji 6.12 - błąd został znaleziony w wersji 6.8.3. Używasz wersji starszej niż poprawka.

Również wpis dziennika zmian dotyczący poprawki wydaje się wskazywać, że nie został on całkowicie naprawiony; nadal dostaniesz pierwszy błąd, ale nie drugi. Jeśli nie ma już raportu o błędzie dla reszty problemu, powiedziałbym, proszę, zrób plik.

+2

Ah. Dziękuję za uratowanie mnie przed popełnieniem głupiego błędu, zakładając, że powinien on zostać naprawiony w mojej wersji. Off, aby przejść do aktualizacji GHC! – rampion

+0

Ah, nowy i inny komunikat o błędzie, tak jak powiedziałeś. Ale taki, który myśli, że robię coś złego, nie, że to niemożliwe. – rampion

3

Jest jeszcze inny sposób!


przypadku zmiany definicji typu danych z

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

do

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

, następnie kompiluje bez błędów. - używając ghc-6.12.2.20100531