Use 'case'. Instead of
| let MkStateT m2 = k a
| m2 s1 )
say
case k a of
MkStateT m2 -> m2 s1
Simon
| -----Original Message-----
| From: mathieu [mailto:[EMAIL PROTECTED]]
| Sent: 10 October 2002 21:42
| To: ghc users
| Subject: brain explosion in polymorphic state monad
|
| Hello,
|
| I am trying to define a polymorphic state monad using glasgow
extensions and I got a
| brain explosion of ghc when i try to compile it.
|
| Here is the code :
|
| newtype StateT s m a = MkStateT (s -> m (a, s))
|
| instance Monad m => Monad (StateT s m) where
| return x = MkStateT (\s -> return (x, s))
| MkStateT m1 >>= k =
| MkStateT
| (\s0 -> do (a, s1) <- m1 s0
| let MkStateT m2 = k a
| m2 s1 )
|
| data Thread a = forall b . MkThread (StateT (Thread b) [] a)
|
| instance Monad Thread where
| return = MkThread . return
| MkThread p >>= k = MkThread ( do x <- p
| let MkThread p' = k x
| p' )
|
| I got this error :
| My brain just exploded.
| I can't handle pattern bindings for existentially-quantified
constructors.
| In the binding group
| MkThread p' = k x
| In the first argument of `MkThread', namely
| `(do
| x <- p
| let MkThread p' = k x
| p')'
| In the definition of `>>=':
| MkThread (do
| x <- p
| let MkThread p' = k x
| p')
|
| How can i define (>>=) for my thread monad ?
|
| Thanks in advance for any piece of advice,
| Mathieu
|
| --
| There are only 10 types of people in the world:
| Those who understand binary and those who don't.
| _______________________________________________
| Glasgow-haskell-users mailing list
| [EMAIL PROTECTED]
| http://www.haskell.org/mailman/listinfo/glasgow-haskell-users
_______________________________________________
Glasgow-haskell-users mailing list
[EMAIL PROTECTED]
http://www.haskell.org/mailman/listinfo/glasgow-haskell-users