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