
On 2016-06-15 11:54 AM, martin wrote:
Paticularly I am having difficulties with the *->* instances. E.g. why is the state "s" in the state monad the fixed type and the "a" the type parameter? When I am writing state code without the State monad the two look like equal candidates. Why not have "State a" monad, which threads an a-typed value and spits out states?
You mean like this? newtype MyState a s = Mk {unMk :: a -> (s, a)} thread_a_and_spit_out_s :: MyState a s -> a -> s thread_a_and_spit_out_s (Mk h) a = case h a of (s, _) -> s instance Monad (MyState a) where -- return :: s -> MyState a s return s = Mk (\a -> (s, a)) -- (>>=) :: MyState a s -> (s -> MyState a t) -> MyState a t Mk h >>= k = Mk (\a0 -> case h a0 of (s, a1) -> unMk (k s) a1) instance Functor (MyState a) where -- fmap :: (s -> t) -> MyState a s -> MyState a t fmap f (Mk h) = Mk (\a0 -> case (h a0) of (s, a1) -> (f s, a1)) instance Applicative (MyState a) where pure = return mf <*> mx = mf >>= \f -> mx >>= \x -> return (f x)
While we're at it: would someone be so kind and explain what exactly is meant by an "effect"? I know that in haskell this is not the same as a "side effect" as there are no side-effects in haskell.
It is just a change of attitude. I say "effect" when it is a purpose of my program, in fact likely a main purpose. I say "side effect" when it is not a purpose of my program. But since I write programs by intelligent design rather than by evolution, of course everything my program does is on purpose. The name "side effect" was coined when people had dispute over whether "function" should mean inert mathematical function or interactive computational procedure.