[Haskell-cafe] expanding do notation / StateMonad example from
tutorial all about monads
Lemmih
lemmih at gmail.com
Sat Dec 31 15:07:36 EST 2005
On 12/31/05, Marc Weber <marco-oweber at gmx.de> wrote:
> Hi.. I'm still struggling with monads ;-)
>
> In the tutorial "All about monads" there is the function getOne used:
>
> getOne:: (Random a) => (a,a) -> State StdGen a
> getOne bound = do g <-get
> (x,g')= return $ randomR bounds g
> put g'
> return x
>
> In the haskell "Yet another Haskell tutorial" by Hal Daume it is said
> that
> do {fp <- e; es}
>
> is translated to:
> let ok p = do {es} ;
> ok _ = fail "..."
> in e >>= ok
>
> Using this rule I was able to expand the first "<-" of getOne:
> getOne2 :: (Random a) => (a,a) -> State StdGen a
> getOne2 bounds = let ok g = do (x,g') <- return $ randomR bounds g
> put g'
> return x
> ok _ = fail "asd"
> in get >>= ok
>
> but I couldn't manage to also expand the second.
> My attempt is:
> getOne3 :: (Random a) => (a,a) -> State StdGen a
> getOne3 bounds = let ok g = do let ok2 (x,g') = do { put g'; return x } --
> ok2 _ = fail "2"
> in (return $ randomR bounds g >>= ok2
> ok _ = fail "1"
> in get >>= ok
> But I get this compile error in at the line marked by a trailing --:
> "The last statement in a 'do' construct must be an expression"
>
> Can you help me?
Omit the 'do' in 'do let ok2'.
--
Friendly,
Lemmih
More information about the Haskell-Cafe
mailing list