Я читал "The Typeclassopedia" Брент Йорги в Monad.Reader # 13 и обнаружил, что "the functor hierachy" является взаимозависимым от "категории hierachy", как показано на рисунке .1. 
И, согласно автору, ArrowApply == Monad, особенно, что предыдущий - это просто экземпляр класса типа, который можно использовать, когда
"мы хотели бы вычислить стрелку из промежуточных результатов и использовать эту вычисленную стрелку для продолжения вычисления. Это сила, данная нам ArrowApply."
Но как мы можем объединить эти вещи? Я имею в виду, что есть некоторые функции управления потоком как в Monad, так и в Arrow (например, if и else vs. ArrowChoice, или forM vs. ArrowLoop), а некоторые функции кажутся "отсутствующими" в Monad ((***), (|||) или first). Все это похоже на то, что нам нужно сделать выбор между использованием системы Monad или Arrow для построения потока вычислений побочных эффектов и потерять некоторые функции в другой системе.