| > You'd get
| >
| >         instance Eq [T] => Eq T
| >
| > which will make the type checker loop for sure.
| 
| Actually not.
| 
| swan(102)% cat Deriving.hs
| newtype N = N [N] deriving Eq

What it's doing is *first* trying the new newtype-deriving stuff,
failing (because recursive) and then trying old vanilla deriving,
getting
        instance Eq N where
           (==) (N a) (N b) = a == b

You can't do that when the class isn't a standard class that GHC knows
about. The point about the new newtype-deriving stuff is that it works
for ANY class. From
        newtype Foo = Foo T deriving( C )
we generate
        instance C T => C Foo
and use the (C T) dictionary for (C Foo).  But there has to be some way
to stop instance deduction looping.  Usually that's by making instance
decls have only type vars to the left of the =>, but here it's by making
sure the newtype is non-recursive.

Simon

| 
| n1 = N []
| n2 = N []
| n3 = N [n1]
| n4 = N [n1,n2]
| 
| main = mapM_ print [ n1 == n2, n2 == n3, n3 == n4 ]
| swan(103)% ghci Deriving
|    ___         ___ _
|   / _ \ /\  /\/ __(_)
|  / /_\// /_/ / /  | |      GHC Interactive, version 5.04.3, for
Haskell 98.
| 
| / /_\\/ __  / /___| |      http://www.haskell.org/ghc/
| \____/\/ /_/\____/|_|      Type :? for help.
| 
| Loading package base ... linking ... done.
| Loading package haskell98 ... linking ... done.
| Compiling Main             ( Deriving.hs, interpreted )
| Ok, modules loaded: Main.
| *Main> main
| True
| False
| False
| *Main>
| 
| >  I'm not sure what a
| > safe approximation might be.
| 
| Would one need to approximate?  Could one try to type check and bail
out if
| that fails?
| 
| >  But I'll put your example in a comment in
| > the source code as an example of a safe one that's rejected!
| >
| > Simon
| >
| > | -----Original Message-----
| > | From: [EMAIL PROTECTED]
| > [mailto:[EMAIL PROTECTED] On
| > | Behalf Of Dean Herington
| > | Sent: 28 July 2003 23:01
| > | To: [EMAIL PROTECTED]
| > | Subject: can't derive Monad
| > |
| > | The following may not be a bug, but it surprised me.  Why does the
| > | circularity cause GHC fits?
| > |
| > |
| > | swan(106)% cat NestStateT.hs
| > | {-# OPTIONS -fglasgow-exts #-}
| > |
| > | import Control.Monad.State
| > |
| > | newtype S1 = S1 [T1 ()]
| > | newtype T1 a = T1 (StateT S1 IO a )
| > |   deriving Monad
| > |
| > | main = undefined
| > | swan(105)% ghci NestStateT.hs
| > |    ___         ___ _
| > |   / _ \ /\  /\/ __(_)
| > |  / /_\// /_/ / /  | |      GHC Interactive, version 5.04.3, for
| > Haskell
| > | 98.
| > | / /_\\/ __  / /___| |      http://www.haskell.org/ghc/
| > | \____/\/ /_/\____/|_|      Type :? for help.
| > |
| > | Loading package base ... linking ... done.
| > | Loading package haskell98 ... linking ... done.
| > | Compiling Main             ( NestStateT.hs, interpreted )
| > |
| > | NestStateT.hs:6:
| > |     Can't make a derived instance of `Monad T1'
| > |     (too hard for cunning newtype deriving)
| > |     When deriving instances for type `T1'
| > | Failed, modules loaded: none.
| > | Prelude>
| 


_______________________________________________
Glasgow-haskell-bugs mailing list
[EMAIL PROTECTED]
http://www.haskell.org/mailman/listinfo/glasgow-haskell-bugs

Reply via email to