Короткий ответ - стрелки более общие, чем монады, а также более громоздкие в использовании. Таким образом, вы должны использовать Монады всякий раз, когда можете, оставляя использование Стрелок для случаев, когда Монады неприменимы.
Далее следует «живописный маршрут».
Джон Хьюз, человек, представивший Arrows, опубликовал две замечательные статьи, которые я рекомендую: «Обобщение монад на стрелки» и «Программирование со стрелками» . Эти две статьи легко читаются и дают ответ на ваш вопрос. Даже если некоторые люди не понимают всех деталей или кода в этих двух статьях, они наверняка найдут много информации и очень полезных объяснений о Монадах и Стрелах.
Теперь я выделю основные моменты из этих статей, которые относятся к вашему вопросу
Когда были представлены Монады, люди думали, что они всесильны. Действительно, монады несут в себе много энергии. Но в какой-то момент было обнаружено, что есть случаи, когда монады не могут быть применены. Эти случаи связаны с несколькими входами, особенно когда некоторые из входов являются статическими, а некоторые из входов являются динамическими. Итак, Джон Хьюз подошел и представил Стрелки.
Стрелки более общие, чем монады. Стрелки являются надмножеством монад. Они могут делать все, что делают Монады, и даже больше. Но их также сложнее использовать. Джон Хьюз рекомендует использовать Монады, когда это возможно, и использовать Стрелы, если вы не можете использовать Монады.
Я согласен с Джоном Хьюзом. Мне также напоминают цитату Эйнштейна: «Все должно быть сделано как можно проще, но не проще».
Конечно, все зависит от конкретной ситуации. Позволь мне объяснить.
Давайте предположим, что вы изучаете Haskell. Тогда было бы большой задачей сделать каждую программу, используя монадический подход, и переделать ее, используя подход, основанный на стрелках. Когда вы учитесь, вы должны стремиться изучить все возможности и реализовать все виды подходов. Таким образом, вы получите отличное понимание и сможете сравнить различные решения из первых рук.
Теперь давайте предположим, что вы хотите предоставить библиотеку сообществу. Что ж, вы обязаны людям, которые будут читать ваш код, что вам следует использовать подход, который легче всего понять и который все еще выполняет свою работу. Вы также обязаны людям, которые будут использовать ваш код, что вашему решению не хватает ненужной сложности. Таким образом, ваше решение будет проще в обслуживании и менее подвержено ошибкам и ошибкам.
Но что, если вы находитесь в пограничном случае? Допустим, вы не уверены, понадобится ли вам дополнительная сила Стрел или нет. Тогда что ты должен делать? Стоит ли начинать с монадического подхода, а затем, если возникнет такая необходимость, перейти на стрелочный? Или вы должны начать с Arrows с самого начала, избегая дорогостоящего перехода в середине проекта?
Опять же, мой ответ - попробовать первый подход: попробуйте использовать Монады, если можете. Если позже вы обнаружите, что не можете использовать монады, вам придется выдержать дорогостоящий переход, где вам придется перезапустить и повторить проект, чтобы использовать стрелки. Этот подход, безусловно, потребует больше времени и других ресурсов с вашей стороны. Но вы будете знать, что вы сделали правильную вещь, которая состояла в том, чтобы попытаться предложить самое простое, ясное и менее сложное решение.
Избежать ненужной сложности - это самое главное. Хотите верьте, хотите нет, но по этой причине концепции (такие как композиция функций, монады и стрелки) из теории категорий были введены в компьютерные науки. Иронический