12

私はまだ、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 クラスに含まれていないのには正当な理由がありますか? 私が考えることができる唯一の理由は、ユーザーが最初と *** の両方の定義を省略して、循環定義を作成する可能性があることですが、それが唯一の理由ですか?

4

2 に答える 2

5

Data.Monoid には、同様の不足している代替のminimal-complete-definition: mconcat があります。Arrow と同様に、パフォーマンス上の理由から、この代替手段がありません。mappend a b = mconcat[a,b]mconcat でのパターン マッチングのために非効率的です。

矢印を使用すると、非効率性はそれほど明白ではありませんが、より残忍です: 最適化できないことを考えてみてくださいarr id:

CleisliArrow を矢印の例として使用すると、次のようになります。

first f (x,y) = do
    x' <- f x
    return (x',y)

そして、それは次のようになります。

first f (x,y) = do
    x' <- f x
    y' <- arr id y
    return (x',y')

arr 関数は id 関数とパターン一致できないため、その関数をラップするために追加のオーバーヘッドを導入する必要があります。

于 2011-06-07T09:42:47.227 に答える
4

実際、誰かがデフォルトのメソッドを書くのを止めたのは循環性だと思います。しかし、@camccann が指摘したように、これで誰もが停止するはずです。変更を提案してください!

于 2011-06-02T18:52:56.353 に答える