Skip to content

Deriving Data at higher kinds

Here's what Lennart Spitzner wanted to do:

> {-# LANGUAGE StandaloneDeriving #-}
> {-# LANGUAGE DeriveDataTypeable #-}
> {-# LANGUAGE FlexibleInstances #-}
> 
> import Data.Data ( Data )
>
> data Foo f = Foo (f Bool) (f Int)
> 
> deriving instance Data (Foo [])
> deriving instance Data (Foo Maybe)

Of course you can't derive Data for Foo because we don't know what f is, so Lennart is making multiple instances, one for each instance of f. It's a bit clumsy. What we would really like is

deriving instance (forall a. Data  => Data (f a)) => Data (Foo f)

but we don't have higher order instances yet! So Lennart is manually making two instances.

This should work, but he gets

> Main.hs: line 45, column 1:
>   Multiple declarations of ‘$cr2C’
>     Declared at: Main.hs:44:1
>                  Main.hs:45:1
> Main.hs: line 45, column 1:
>   Multiple declarations of ‘$tr2D’
>     Declared at: Main.hs:44:1
>                  Main.hs:45:1
Trac metadata
Trac field Value
Version 8.0.1
Type Bug
TypeOfFailure OtherFailure
Priority normal
Resolution Unresolved
Component Compiler
Test case
Differential revisions
BlockedBy
Related
Blocking
CC
Operating system
Architecture
To upload designs, you'll need to enable LFS and have an admin enable hashed storage. More information