Стрелка и Монада, две независимые точки зрения для составления вычислений?

Я читал «Типеклассопедию» Брента Йорги в Monad.Reader # 13 и обнаружил, что «иерархия функторов» взаимозависима от «иерархии категорий» как показано на Рисунке 1.

Figure.1

И, по словам автора, ArrowApply == Monad , тем более, что предыдущий является просто экземпляром класса типа, который можно использовать, когда

«мы хотели бы иметь возможность вычислять стрелку из промежуточных результатов и используйте эту вычисленную стрелку для продолжения вычислений. Это сила, данная нам ArrowApply »

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

17
задан duplode 2 January 2017 в 23:13
поделиться