14

次のクラスの関数が必要です。

class InterleavedHomomorphic x where
  interleaveHomomorphism :: (forall a . f a -> g a) -> x f -> x g

明らかに、私が発明した名前は、いかなる意味でも正式な用語ではなく、上記の型クラスはあまりエレガントではありません。これは名前を持つ概念ですか、それともいくつかのライブラリで実装されていますか? これを行うためのより合理的な方法はありますか?


この関数の目的は、fいくつかのデータに注釈を付けるコンテキストがあることです (この質問のためのランダムなデータ構造の例です) Foo:Bar

data Foo f = One (f (Bar f)) | Product (f (Foo f)) (f (Foo f))
data Bar f = Zero | Succ (f (Bar f))

ポリモーフィックな方法でデータのコンテキストを変換したいと思います。コンテキスト間の準同型性のみを知っており、(必然的に) データ自体を気にする必要はありません。これは、上記の例ではinstance InterleavedHomomorphic Fooandを指定することで実行できます。instance InterleavedHomomorphic Bar

4

3 に答える 3

17

したがって、fgが適切な関手でforall a. f a -> g aあると仮定すると、自然な変換になります。もう少しきれいにすることができます:

type f ~> g = forall a. f a -> g a

このような自然な変換により、Haskell Functor のカテゴリを形成できます。そのため、そこから他のカテゴリへの Functor が得られます。

通常の Haskell Functor の手順に従ってx、Functor を他の Functor にマッピングする endfunctor を持つことはおそらく理にかなっているでしょう。これはあなたが持っているものと似ていますが、同一ではありません:

class FFunctor x where
  ffmap :: (f ~> g) -> (x f ~> x g)

ただし、あなたの場合x f、 andx gはファンクターでx f -> x gはなく、自然な変換ではなく通常の関数です。それでも、パターンは興味をそそるほど十分に近いです。

これを念頭に置いて、これxはまだ 2 つの異なるカテゴリの間のちょうどファンクタの例のようです。Functor のカテゴリから、xさまざまな構造を持つ s のカテゴリに移動します。xのような可能な各は、 と のようFooなオブジェクトFoo []Foo Maybe、それらの間の変換 ( Foo [] -> Foo Maybe) を含むカテゴリを形成します。通常の ( ) 関数をファンクター ( ) のイメージの関数に「リフト」するのと同じように、関数はinterleaveHomomorphism自然な変換をこれらのに「リフト」します。x-morphismsfmapa -> bf a -> f b

そうです: あなたの型クラスは、Functor2 つの異なるカテゴリの間を除いて、 と同じようにファンクターです。主に のような構造の特定の名前がわからないため、特定の名前はわかりませんx

より一般的に言えば、特定の名前が意味を成すかどうかさえわかりません。この時点で、おそらく、任意の 2 つのカテゴリ間を行き来する優れたジェネリック ファンクター型クラスが必要になります。たぶん次のようなもの:

class (Category catA, Category catB) => GFunctor f catA catB where
  gfmap :: catA a b -> catB (f a) (f b)

これはおそらくどこかのライブラリに既に存在します。

(->)残念ながら、異なるファンクターを定義するこの特定のアプローチは、すでにカテゴリであるため、余分な newtype ノイズの束を必要とします。実際、すべてのタイプを適切に並べるのは少し面倒です。

したがって、それを anXFunctorまたは something と呼ぶのがおそらく最も簡単です。さらに、しゃれの可能性を想像してみてください。

編集:このようなタイプをcategories提供するように見えますCFunctorが、少し賢いです:

class (Category r, Category s) => CFunctor f r s | f r -> s, f s -> r where
  cmap :: r a b -> s (f a) (f b)

ただし、これでも一般的かどうかはわかりません。種類よりも多形性を高めたいと思うかもしれません。

于 2014-06-06T22:45:03.590 に答える
0

Bar fFree Monad のように見えますFree f ()

次にFoodo1 つまたは 2 つの<-. そこから続くのかな…

于 2014-06-07T06:40:43.407 に答える
0

価値があるのは、例の簡略化されたバージョンを次のように言い換えることができます

data Bar' r = Zero | Succ r
type Bar f = fix (Bar' . f)

自然な変換のすべてのペアに対して、自然な変換eta1 :: f ~> geta2 :: Bar' ~> h得られます(eta2 . eta1) :: (Bar' . f) ~> (h . g)。そして、この自然な変換を不動点に持ち上げると、明らかな方法で を得ることができfixed (eta2 . eta1) :: Bar f -> fix (h . g)ます。したがって、「インターリーブ準同型」は、 がある場合のこの構成の特殊なケースにすぎませんeta2 = id

全体として、これはかなり標準的な構造です (特に がfモナドまたはコモナドの場合)。ただし、広く認識されている特定の名前があるかどうかはわかりません。

于 2014-06-08T02:01:53.750 に答える