Я все еще справляюсь с определением и использованием Стрелок в Haskell. При определении новых стрелок мне гораздо проще думать с точки зрения *** или &&&, а не с первой и второй, поскольку большую часть времени я хочу проводить специальную обработку для комбинации двух стрелок.
Однако класс Arrow не позволяет определять стрелку в терминах arr и *** или &&& и требует определения first для включения. Это означает, что я вынужден написать код, подобный следующему -
instance Arrow X where
arr f = ...
f (***) g = ...
first f = f *** arr id
Мне кажется, что не было бы никакого вреда, если бы мы включили определение по умолчанию 'first' в модуль Control.Arrow. Это позволило бы нам выбирать между определением первого или ***.
Есть ли веская причина, по которой определение по умолчанию first не было включено в класс Arrow? Единственная причина, по которой я могу придумать, состоит в том, что пользователь может опустить определение first и *** обоих, и тогда у вас будут круговые определения, но разве это единственная причина?