Associated types don't work with record updates
(I couldn't find a more descriptive title, feel free to change it) When instantiating associated types with records, record update doesn't seem to work (at least in indirect uses). I think it should. If this is supposed to fail, then a more helpful error message might be very useful.
Here's the code:
{-# OPTIONS -findexed-types #-}
module Bug where
------------------------------------------------------------------------------
class C c where
data D1 c
class C c => D c where
works :: Int -> D1 c -> D1 c
buggy :: Int -> D1 c -> D1 c
buggy2 :: Int -> D1 c -> D1 c
------------------------------------------------------------------------------
data FooC = FooC
instance C FooC where
data D1 FooC = D1F { moo :: Int }
instance D FooC where
works x d = d -- d unchanged, so OK
buggy x d@(D1F { moo = k }) =
d { moo = k + x } -- d is updated wrong type--why?
buggy2 x d@(D1F { moo = k }) =
(d :: D1 FooC) { moo = k + x } -- type annotation doesn't work
GHC Output:
$ ghc67 -v -c Bug67.hs
Glasgow Haskell Compiler, Version 6.7.20070303, for Haskell 98, compiled by GHC version 6.7.20070303
Using package config file: /usr/local/lib/ghc-6.7.20070303/package.conf
wired-in package base mapped to base-2.0
wired-in package rts mapped to rts-1.0
wired-in package haskell98 mapped to haskell98-1.0
wired-in package template-haskell mapped to template-haskell-2.0
Hsc static flags: -static
Created temporary directory: /tmp/ghc422_0
*** Checking old interface for main:Bug:
*** Parser:
*** Renamer/typechecker:
Bug67.hs:25:4:
Couldn't match expected type `D1 FooC'
against inferred type `(Bug.:R2D1)'
In the expression: d {moo = k + x}
In the definition of `buggy':
buggy x (d@(D1F {moo = k})) = d {moo = k + x}
In the definition for method `buggy'
Bug67.hs:28:4:
Couldn't match expected type `D1 FooC'
against inferred type `(Bug.:R2D1)'
In the expression: (d :: D1 FooC) {moo = k + x}
In the definition of `buggy2':
buggy2 x (d@(D1F {moo = k})) = (d :: D1 FooC) {moo = k + x}
In the definition for method `buggy2'
Trac metadata
Trac field | Value |
---|---|
Version | 6.7 |
Type | Bug |
TypeOfFailure | OtherFailure |
Priority | normal |
Resolution | Unresolved |
Component | Compiler |
Test case | |
Differential revisions | |
BlockedBy | |
Related | |
Blocking | |
CC | |
Operating system | Unknown |
Architecture | Unknown |