Implement record update for existential and GADT data types
Ganesh writes: The most important thing for me is supporting record update for existentially quantified data records, as in the error below.
In general I also find working with code that involves existential type variables quite hard work - for example I can't use foo as a record selector either, even if I immediately do something that seals the existential type back up again.
I don't understand this stuff well enough to be sure whether it's an impredicativity issue or not, though.
Foo.hs:11: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}
Program is:
{-# LANGUAGE 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 }
Simon says: Ah now I see. The relevant comment, TcExpr line 465, says
-- Doing record updates on
-- GADTs and/or existentials is more than my tiny
-- brain can cope with today
Should be fixable, even with a tiny brain.
Trac metadata
| Trac field | Value |
|---|---|
| Version | 6.8.3 |
| Type | FeatureRequest |
| TypeOfFailure | OtherFailure |
| Priority | normal |
| Resolution | Unresolved |
| Component | Compiler |
| Test case | |
| Differential revisions | |
| BlockedBy | |
| Related | |
| Blocking | |
| CC | |
| Operating system | Unknown |
| Architecture | Unknown |