can't derive Monad

Dean Herington heringto at cs.unc.edu
Tue Jul 29 16:26:12 EDT 2003


Simon Peyton-Jones wrote:

> Just conservatism.  Imagine
>
>         newtype T = MkT [T] deriving(Eq)
>
> 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

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: glasgow-haskell-bugs-admin at haskell.org
> [mailto:glasgow-haskell-bugs-admin at haskell.org] On
> | Behalf Of Dean Herington
> | Sent: 28 July 2003 23:01
> | To: glasgow-haskell-bugs at haskell.org
> | 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>




More information about the Glasgow-haskell-bugs mailing list