3 ms·
Any function matching the type St -> (a, St) can viewed as `State St' parameterized over `a'. There are several behaviors that organize such functions, su
by Iceland_jack 2y ago
Any function matching the type
St -> (a, St)
can viewed as `State St' parameterized over `a'. There are several behaviors that organize such functions, such as Monad which "overloads the semicolon" to work on stateful computations. Another behavior implements a stateful interface: `MonadState St'.
get :: St -> (St, St)
put :: St -> (St -> ((), St))
With type classes in Haskell, behaviour is type-directed so in order to reap the benefits we declare a new type.
{-# Language DerivingVia #-}
{-# Language GADTSyntax #-}
-- get :: My St
-- put :: St -> My ()
newtype My a where
My :: (St -> (a, St)) -> My a
deriving (Functor, Applicative, Monad, MonadState St, MonadFix)
via State St
- greener_grass 2y agoIs there are correct way around? St -> (a, St) vs St -> (St, a) I've found both in the wild and it can be very confusing!
- chuckadams 2y agoThe order doesn’t matter as long as you’re consistent, but Control.Monad.State uses the first, and you’ll have a bad time (in Haskell anyway) if you’re not compatible with that.
- RandomThoughts3 2y agoIt’s the same thing. Order doesn’t matter in the tuple. Just use a bind which is in line with the signature of the type you want to use.