Apparently the Monad instance for Proxy only requires a Functor m
constraint:
bind'
:: Functor m
=> Proxy a' a b' b m r
-> (r -> Proxy a' a b' b m r')
-> Proxy a' a b' b m r'
bind' p f = go p where
go p = case p of
Request a' k -> Request a' (go . k)
Respond b k -> Respond b (go . k)
M m -> M $ fmap go m
Pure r -> f r
I didn't find a discussion of this in my search, but if it is correct I
could imagine it has been noticed before.
When I was reading the definition of Proxy the 'Monad m' constraint seemed
odd. At first, the 'Monad m' constraint felt right since Proxy is acting
like a monad transformer over 'm'. But the "M" constructor means each step
of a Pipe computation may or may not involve an effect 'm', and in fact a
single "Pure" step does not. You can contrast this with something like
FreeT where every level of the FreeT type gets wrapped by 'm'. Just
writing the type of 'join' for FreeT makes it clear you need the type
constructor 'm' to admit 'join' too. But the type of 'join' for Proxy
clearly doesn't need this.
--
You received this message because you are subscribed to the Google Groups
"Haskell Pipes" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].