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
```