17

多くの場合、Applicativeなしpureのようなもの、またはのようなものがありますがMonad、はありませんreturnsemigroupoidパッケージは、これらのケースをとでカバーしApplyますBindArrow今、私は、意味のある関数を定義できないという点で同様の状況にありarrますが、他の関数は完全に理にかなっていると思います。

関数とその逆関数を保持する型を定義しました。

import Control.Category

data Rev a b = Rev (a -> b) (b -> a)

reverse (Rev f g) = Rev g f
apply (Rev f _) x = f x
applyReverse (Rev _ g) y = g y
compose (Rev f f') (Rev g g') = Rev ((Prelude..) f g) ((Prelude..) g' f') 

instance Category Rev where
  id = Rev Prelude.id Prelude.id
  (.) x y = compose x y 

今は実装できませんArrowが、何か弱いものがあります。

--"Ow" is an "Arrow" without "arr"
class Category a => Ow a where
  first :: a b c -> a (b,d) (c,d)
  first f = stars f Control.Category.id

  second :: a b c -> a (d,b) (d,c)
  second f = stars Control.Category.id f

  --same as (***)
  stars :: a b c -> a b' c' -> a (b,b') (c,c')

 ...
 import Control.Arrow 

 instance Ow Rev where
    stars (Rev f f') (Rev g g') = Rev (f *** g) (f' *** g')  

&&&と定義されておりf &&& g = arr (\b -> (b,b)) >>> f *** g、元に戻せないため、同等の実装はできないと思います(\b -> (b,b))。それでも、この弱い型クラスが役立つと思いますか?理論的な観点からも意味がありますか?

4

2 に答える 2

10

このアプローチは、「There and Back Again:Arrows for invertibleprogramming」で検討されました:http ://citeseer.ist.psu.edu/viewdoc/summary?doi = 10.1.1.153.9383

あなたが遭遇している正確な理由のために、これはより広く取り上げられなかった悪いアプローチであることが判明しました。最近では、Tillmann Rendelが、双矢印の代わりに部分同型を使用する反転可能な構文への楽しいアプローチを作成しました(http://www.informatik.uni-marburg.de/~rendel/rendel10invertible.pdf)。これは、人々が使用して遊ぶためのハッキングにパッケージ化されています:http: //hackage.haskell.org/package/invertible-syntax

arrとはいえ、矢印のない矢印はある程度意味があると思います。そのようなものは、可逆関数をキャプチャするための適切な手段ではないと思います。

編集:AdamMegaczのGeneralizedArrows(http://www.cs.berkeley.edu/~megacz/garrows/)もあります。これらは可逆プログラミングにも役立たないかもしれませんが(基本的な型クラスは不可逆であるように見えますが)、arr強すぎる他の状況でも使用できますが、他の矢印操作は理にかなっている場合があります。

于 2011-08-09T14:28:37.123 に答える
9

圏論の観点から、Category型クラスは、型コンストラクターによってHaskellで矢印を簡単に記述できるすべてのカテゴリーを記述します。この上に構築したいほとんどすべての追加機能は、新しいプリミティブ矢印または矢印作成関数の形で、トータル関数を使用して実装できれば、ある程度意味があります。唯一の注意点は、表現力を追加すると、でよくあるように、他の要件を破ることができるということarrです。

逆関数の特定の例は、すべての矢印が同型であるカテゴリを説明しています。完全にそして完全に期待された衝撃的なひねりの中で、EdwardKmettはすでにHackageにこれを実装しています。

このarr関数は、Haskell関数からインスタンスまでの(圏論の意味での)ファンクターにほぼ相当し、Arrowオブジェクトは同じままになります(つまり、型パラメーター)。arrから削除するだけで...何か他のものが得られます。これは、少なくともプリミティブとしてとArrow同等のものを追加せずに、それ自体ではおそらくあまり有用ではありません。arr fstarr snd

とのプリミティブを追加し、 2つの入力から新しい矢印を作成するfstと、製品のカテゴリが得られるはずです。これは、理論的な観点からは絶対に賢明であり、反転可能な矢印とは互換性がありません。あなたが見つけた理由で再利用します。snd(&&&)

于 2011-08-09T15:24:54.177 に答える