私はまだ、Haskell での Arrows の定義と使用について理解を深めています。新しい矢印を定義するときは、1 つ目と 2 つ目よりも *** や &&& で考える方がはるかに簡単です。ほとんどの場合、2 つの矢印が結合されたときに特別な処理が必要になるからです。
ただし、Arrow クラスでは、arr および *** または &&& に関して矢印を定義することはできず、first の定義を含める必要があります。これは、次のようなコードを書くことを余儀なくされていることを意味します -
instance Arrow X where
arr f = ...
f (***) g = ...
first f = f *** arr id
Control.Arrow モジュールに「first」のデフォルト定義を含めても害はないように思えます。これにより、first と *** のどちらを定義するかを選択できるようになります。
first のデフォルト定義が Arrow クラスに含まれていないのには正当な理由がありますか? 私が考えることができる唯一の理由は、ユーザーが最初と *** の両方の定義を省略して、循環定義を作成する可能性があることですが、それが唯一の理由ですか?