Proposal: Warn about ArrowLoop instance for Kleisli Arrows

Heinrich Apfelmus apfelmus at
Sun Oct 9 16:14:32 CEST 2011

Henning Thielemann wrote:
> On Sun, 9 Oct 2011, Heinrich Apfelmus wrote:
>> I recently noticed that the instance
>>    MonadFix m => ArrowLoop (Kleisli m)
>> does not fulfill the ArrowLoop laws for most monads, rendering it either
>> useless or dangerous for the unwary. Removing it would be the correct
>> thing to do, but I think that the sensible thing to do is to merely
>> document said fact at the instance declaration in the haddocks. This
>> way, the few monads that do support an ArrowLoop instance (most notably
>> the lazy state monad) can keep their instance while everyone else is 
>> warned.
> .... and since the lazy state monad does not fulfill the Functor laws, 
> there is no monad at all, where the ArrowLoop instance is correct?

Ah, I don't intend to haggle over  seq  and  _|_. In my view, the 
ArrowLoop instance for the lazy state monad fulfills the 
right-tightening law just fine.

The trouble is with monads where you cannot a write a function

    first :: (a -> M b) -> ((a,d) -> M (b,d))

that allows you to "lazily observe" the second parameter  d  without 
forcing  a  to some extend. The lazy state monad allows you to write

    first m
       = \p -> m (fst p) >>= \b -> return (b,snd p)
       = \p s -> let (b,s') = m (fst p) s in ((b,snd p),s')

and you can extract the  d  component from the result just fine. But, 
according to the literature, you can't something similar for monads 
where  >>=  is strict in the first argument, like Maybe or [] or IO or 
various monad transformer stacks.

Best regards,
Heinrich Apfelmus


More information about the Libraries mailing list