[Haskell-cafe] Type and State Confusion

Hans van Thiel hthiel.char at zonnet.nl
Tue Mar 13 08:41:02 EDT 2007


On Tue, 2007-03-13 at 00:47 -0400, Albert Y. C. Lai wrote:
> Hans van Thiel wrote:
> > sequence :: Monad m => [m a] -> m [a]
> >
> > You write:
> > The >>= used by sequence is the same >>= in the MyState monad,
> > since you instantiate m to MyState String. Therefore, sequence
> > performs all the state transformations correctly, since >>= is
> > correct.
> >
> > So the m becomes MyState String, and therefore the list elements
> > have type (MyState String Int), or the other way around. I
> > understand, from your explanation, how this works from there on,
> > but I'm still confused about what the Monad is. Is it MyState
> > which takes two types, or (MyState String) which takes one type?
> > Or neither? Does it involve some 'sort of currying' of type
> > parameters?
> >   
> 
> The monad is (MyState String) or generally (MyState a) which takes one 
> type. So this is some sort of currying of type parameters.
> 
> With this in mind, the rest is straightforward:
> 
> > data MyState a b = MyStateC ([a] -> ([a], b))
> >
> > This defines an algebraic data type (...why is it called algebraic?)
> > with two type variables and a unary constructor.
> >          
> >  instance Monad (MyState a) where
> >     return x = MyStateC (\tb -> (tb, x))
> >     (MyStateC st) >>= f =  
> >         MyStateC (\tb -> let                       
> >                            (newtb, y) = st tb
> >                            (MyStateC trans) = f y 
> >                          in trans newtb )
> >
> > Now, if the instantiated a has type String, Int or whatever, I
> > would understand, but the type of the Monad seems to be built up
> > from two types.
> 
> 
> The general type of return is
> 
>   return :: (Monad m) => b -> m b
> 
> Tailor-made to our case, m = MyState a,
> 
>   return :: b -> MyState a b
> 
> Similarly, the general type of >>= is
> 
>   (>>=) :: (Monad m) => m b -> (b -> m c) -> m c
> 
> Tailor-made to our case, m = MyState a,
> 
>   (>>=) :: MyState a b -> (b -> MyState a c) -> MyState a c
> 
> If we now consider
> 
>   foo >>= toMyState
> 
> then a=String, b=String, c=Int. Note again that the part (MyState a), or 
> now (MyState String), is the monad.

Got it! Many thanks.
> 
> 



More information about the Haskell-Cafe mailing list