В "Programming with Arrows" Хьюз утверждает
Прежде всего, обратите внимание, что как first, так и left легко реализуются с точки зрения приложения (подробности оставлены в качестве упражнения).
Из Control.Arrow left
можно реализовать как:
leftApp :: ArrowApply a => a b c -> a (Either b d) (Either c d)
leftApp f = arr ((\b -> (arr (\() -> b) >>> f >>> arr Left, ())) |||
(\d -> (arr (\() -> d) >>> arr Right, ()))) >>> app
Как реализовать first
только с arr
, >>>
и app
?