Почему я не могу определить Haskell Экземпляр Arrow с точки зрения arr и *** / &&&

Я все еще пытаюсь определить и использовать стрелки в Haskell. При определении новых стрелок мне намного легче думать в терминах *** или &&&, а не в терминах первой и второй, так как большую часть времени мне нужна специальная обработка для объединения двух стрелок.

Однако класс Arrow не позволяет определять стрелку в терминах arr и *** или &&&, и требует включения определения first. Это означает, что я вынужден писать следующий код -

instance Arrow X where
  arr f = ...
  f (***) g = ...
  first f = f *** arr id

Мне кажется, что не было бы никакого вреда, если бы мы включили определение «first» по умолчанию также в модуль Control.Arrow. Это позволило бы нам выбирать между определением first или ***.

Есть ли веская причина, почему определение first по умолчанию не было включено в класс Arrow? Единственная причина, о которой я могу думать, это то, что пользователь может опустить определение first и *** обоих, и тогда у вас будут циклические определения, но это единственная причина?

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