Я читал "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 для построения потока вычислений побочных эффектов и потерять некоторые функции в другой системе.