logo       

Re: can't derive Monad: msg#00083

lang.haskell.glasgow.bugs

Subject: Re: can't derive Monad

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


<Prev in Thread] Current Thread [Next in Thread>
Google Custom Search

News | FAQ | advertise