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