Hello
I am going through Walder's "Monads for Functional Programming" document.
On page 9, there is a piece of code that provides the definition of return and bind for the State Monad

I have pasted two variations of the code. The first one matches the definition given in the book.
The second one is what I came up with. 

-- State Monad variation 
-- Retain the eval function as such
-- Modify M , unit, * definitions


type M a = State->(a, State)
type State = Int

unit  :: a -> M a
unit a = (\e->(a,e))

star :: M a -> (a -> M b) -> M b
m `star` k = (\x -> let (a, aState) = m x in
             let (b, bState) = k a aState in
              (b, bState))


-- State Monad variation -- Retain the eval function as such -- Modify M , unit, * definitions type M a = State->(a, State) type State = Int unit :: a -> M a unit a = (\e->(a,e)) star :: M a -> (a -> M b) -> M b m `star` k = (\x -> let (a, aState) = m x (b, bState) = k a aState in (b, bState))


In the first definition of star, there are two let statements, while I found that one let statement would do the work anyway, as done in the second defintion of start

I am not able to understand if there is any semantic implication in this syntatic variation of let.

Please help.

Thanks
--
Regards
Lakshmi Narasimhan T V