[Haskell-beginners] Grappling with State Monad get

Olumide 50295 at web.de
Fri Aug 4 23:12:17 UTC 2017


Thanks Theodore.

I'm still pondering your answer and I've tried to write desugar the 
do-notation like so:

     stackyStack :: State Stack ()
     stackyStack = get >>= (\stackNow -> ... )

I can _sort of_ see how the type of stackyStack 'imposes' a type on the 
polymorphic function get, even though I'm not sure that I can precisely 
explain *exactly* how it happens. Here is my attempt:

Comparing the definition of bind

    (>>=) :: m a -> (a -> m b) -> m b

with the desugared form of stackyStack, it seems to me that a is 
stackNow is an [Int], and m is State [Int]. Is this correct?

On a not-too-unrelated note, why is the State (with upper case S) used 
in the following instance of the state monad

instance Monad (State s) where
     return x = State $ \s -> (x,s)
     (State h) >>= f = State $ \s ...

bearing in mind that Control.Monad.State does not expose its value 
constructor.

Thanks,

- Olumide

On 02/08/17 03:26, Theodore Lief Gannon wrote:
> Actually, get is constrained immediately to be State Stack Stack. If 
> later statements tried to use it as something else, it would be a type 
> error.
> 
> The types in a do block can only vary in their final parameter. The type 
> of stackyStack is State Stack (), so in that do block all the statements 
> must be forall a. State Stack a.
> 
> Now, check the type of get in GHCi:
> get :: State a a
> 
> We know that the first type parameter here is Stack, and the second 
> position is the same type, thus State Stack Stack.
> 
> 
> 
> On Tue, Aug 1, 2017 at 5:13 PM, Olumide <50295 at web.de 
> <mailto:50295 at web.de>> wrote:
> 
>     Of course 's' is not a type variable as its lowercase.
> 
>     Therefore, get is a monad 'constructed' by the state function, correct?
> 
>     So, in the do notation the lambda is extracted and used as per the
>     definition of bind. The context of which we speak therefore must
>     derive from the next expression(?) in the do notation, which is
>     somewhat confusing to determine in the example
> 
>          stackyStack :: State Stack ()
>          stackyStack = do
>              stackNow <- get
>              if stackNow == [1,2,3]
>                  then put [8,3,1]
>                  else put [9,2,1]
> 
>     Regards,
> 
>     - Olumide
> 
>     On 02/08/17 00:35, Theodore Lief Gannon wrote:
> 
>         's' here is not a type variable, it's an actual variable. \s ->
>         (s, s) defines a lambda function which takes any value, and
>         returns a tuple with that value in both positions.
> 
>         So yes, get is point-free, but the missing argument is right
>         there in-line. And yes, its type is simply implied from context.
> 
> 
>         On Aug 1, 2017 4:17 PM, "Olumide" <50295 at web.de
>         <mailto:50295 at web.de> <mailto:50295 at web.de
>         <mailto:50295 at web.de>>> wrote:
> 
>              Ahoy Haskellers,
> 
>              In the section "Getting and Setting State"
>              (http://learnyouahaskell.com/for-a-few-monads-more#state
>         <http://learnyouahaskell.com/for-a-few-monads-more#state>
>              <http://learnyouahaskell.com/for-a-few-monads-more#state
>         <http://learnyouahaskell.com/for-a-few-monads-more#state>>) in LYH
>              get is defined as
> 
>              get = state $ \s -> (s, s)
> 
>              How does does get determine the type s, is considering that
>         it has
>              no argument as per the definition given above? Or is the
>         definition
>              written in some sort of point-free notation where an
>         argument has
>              been dropped?
> 
>              I find the line stackNow <- get in the the function(?)
>         stackyStack
>              confusing for the same reason. I guess my difficulty is
>         that state $
>              \s ->(s , s) has a generic type (s) whereas the stackyStack
>         has a
>              concrete type. Is the type of s determined from the type of the
>              stateful computation/do notation?
> 
>              Regards,
> 
>              - Olumide
>              _______________________________________________
>              Beginners mailing list
>         Beginners at haskell.org <mailto:Beginners at haskell.org>
>         <mailto:Beginners at haskell.org <mailto:Beginners at haskell.org>>
>         http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
>         <http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners>
>              <http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
>         <http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners>>
> 
> 
> 
> 
>         _______________________________________________
>         Beginners mailing list
>         Beginners at haskell.org <mailto:Beginners at haskell.org>
>         http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
>         <http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners>
> 
>     _______________________________________________
>     Beginners mailing list
>     Beginners at haskell.org <mailto:Beginners at haskell.org>
>     http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
>     <http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners>
> 
> 
> 
> 
> _______________________________________________
> Beginners mailing list
> Beginners at haskell.org
> http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
> 


More information about the Beginners mailing list