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