Haskellの双圏

ボブ

バイカテゴリの型クラスを定義し、カテゴリ、ファ​​ンクター、自然変換のバイカテゴリでインスタンス化しようとしています。

{-# LANGUAGE NoImplicitPrelude, MultiParamTypeClasses, 
    TypeOperators, KindSignatures, Rank2Types, 
    ScopedTypeVariables, FlexibleInstances, InstanceSigs #-}

カテゴリのクラスは次のとおりです。

class Category (c :: * -> * -> *) where
  id :: c x x
  (.) ::c y z -> c x y -> c x z

ファンクターのクラスは次のとおりです。

class Functor c d f where
  fmap :: c x y -> d (f x) (f y)

ファンクターの構成は次のとおりです。

newtype Comp g f t = Comp (g (f t))

2つのファンクターの構成はファンクターである必要があります。ただし、次のインスタンス化は、範囲外であるためfHaskellでは受け入れられgません。fmapここでどのように定義しますか?

instance Functor c e (Comp g f) where
  fmap :: c x y -> e (Comp g f x) (Comp g f y) 
  fmap = fmap g . fmap f

自然変換は次のとおりです(パラメーターcはここでは使用されませんが、以下の次のインスタンス化に役立ちます)。

newtype NT f g (c :: * -> * -> *) d =
  NT {unNT :: forall x. d (f x) (g x) }

バイカテゴリのクラスは次のとおりです(演算子.|.-はそれぞれ2セルの垂直方向と水平方向の構成です)。

class Bicategory
  (bicat :: (* -> *) -> (* -> *) -> (* -> * -> *) -> (* -> * -> *) -> *)
  comp where
  id1 :: Category d => bicat f f c d
  (.|) :: Category d => bicat g h c d -> bicat f g c d -> bicat f h c d
  (.-) :: bicat g g' d e -> bicat f f' c d -> bicat (g `comp` f) (g' `comp` f') c e

カテゴリ、ファ​​ンクタ、および自然変換は、2つのカテゴリを形成する必要があります。ただし、次のインスタンス化はHaskellによって受け入れられ.-ません。これは、自然変換の水平構成の定義では、gがスコープ内にないためです。(.-)ここで水平方向の構成をどのように定義しますか?

instance Bicategory NT Comp where
  id1 = NT id
  n .| m = NT (unNT n . unNT m)
  (n :: NT g g' d e) .- m = NT (unNT n . fmap g (unNT m))
暴れ

のレコードゲッターを定義して、ファンクターの作成を少し簡単にしましょうCompose(省略の必要はありません。私たちは友達の中にいます)。

newtype Compose g f t = Compose { unCompose :: g (f t) }
-- Compose    :: g (f t) -> Compose g f t
-- unCompose  :: Compose g f t -> g (f t)

を作成するにCompose g fFunctor c d、関数をカテゴリに分類する方法が必要なので、次のようにd定義しましょう。

class Category c => Arr c where
  arr :: (x -> y) -> c x y -- stolen from Control.Arrow.Arrow

これで、必要なものがすべて揃いました。

instance (Functor c d f, Functor d e g, Arr e) => Functor c e (Compose g f) where
  -- c                      :: c x y
  -- fmap_cdf c             :: d (f x) (f y)
  -- fmap_deg (fmap_cdf c)  :: e (g (f x)) (g (f y))
  -- arr Compose            :: e (g (f y)) (Compose g f y)
  -- arr unCompose          :: e (Compose g f x) (g (f x))
  -- arr Compose . fmap_deg (fmap_cdf c) . arr unCompose 
  --                        :: e (Compose g f x) (Compose g f y)
  fmap c = arr Compose . fmap_deg (fmap_cdf c) . arr unCompose
    where fmap_cdf :: forall x y. c x y -> d (f x) (f y)
          fmap_cdf = fmap
          fmap_deg :: forall x y. d x y -> e (g x) (g y)
          fmap_deg = fmap

ここではAllowAmbiguousTypes(GHC 7.8で)使用する必要があります。カテゴリdが完全に消えて、あいまいになっているためです。

今のためにBicategory

単純化しましょうNT-そのファントムパラメータは必要ありません。

newtype NT c f g = NT { unNT :: forall x. c (f x) (g x) }

これで、より簡単なBicategory定義を作成できます。

class Bicategory (bicat :: (* -> * -> *) -> (* -> *) -> (* -> *) -> *) comp where
  id1   :: Category c => bicat c f f
  (.|)  :: Category c => bicat c g h -> bicat c f g -> bicat c f h
  (.-)  :: (Functor c d g, Arr d) => bicat d g g' -> bicat c f f' -> bicat d (comp g f) (comp g' f')

実装できるもの:

instance Bicategory NT Compose where
  id1 = NT id
  NT n .| NT m = NT (n . m)
  -- m              :: c (f x) (f' x)
  -- fmap m         :: d (g (f x)) (g (f' x))
  -- n              :: d (g (f' x)) (g' (f' x))
  -- n . fmap m     :: d (g (f x)) (g' (f' x))
  -- arr Compose    :: d (g' (f' x)) (Compose g' f' x)
  -- arr unCompose  :: d (Compose g f x) (g (f x))
  -- arr Compose . n . fmap m . arr unCompose
  --                :: d (Compose g f x) (Compose g' f' x)
  NT n .- NT m = NT $ arr Compose . n . fmap m . arr unCompose

これが完全なコードの要点ですGHC-7.8.2で正常にコンパイルされます。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

Haskell:モノイド圏の射の合成

分類Dev

`join`と` fmap join`はHaskellで等しいですか(圏論の観点から)?

分類Dev

対流圏でのDBSecurityGroupIngressの設定

分類Dev

中間圏とcoreosの主な違い

分類Dev

カレークラスのために、Haskellでローカルに小さなデカルト閉圏を考えるのはなぜ公正なのですか?

分類Dev

集合の圏で、なぜ単集合集合は終末なのか?

分類Dev

カートピー:大圏距離線の高解像度

分類Dev

住所を最寄りの大都市圏にマッピング

分類Dev

Rのhist()が途切れている完全圏

分類Dev

Rのhist()が途切れている完全圏

分類Dev

対流圏DynamoDBTimeToLiveSpecification

分類Dev

プログラマーのための圏論からのbifunctorの理解-Ch。8

分類Dev

圏論用語でのLispの「quote」特殊形式とは何ですか?

分類Dev

私の課した条件は圏論・集合論に名前があるの?

分類Dev

ecoinventv.3.5で生物圏フローを呼び出す際のエラー

分類Dev

関数出力に2列のデータがある場合に変更(地圏)

分類Dev

マラソンを利用した中間圏のサービス間通信

分類Dev

地圏との距離のマトリックス:微積分の繰り返しを避ける

分類Dev

圏論POVからの適用ファンクターの定義は何ですか?

分類Dev

クライスリ圏の構成と無限のリストを折りたたむ

分類Dev

adehabitatHRの行動圏分析では、データをどの形式にする必要がありますか?

分類Dev

圏論における「フィルター」とはどのような射ですか?

分類Dev

圏論における「フィルター」とはどのような射ですか?

分類Dev

ISBN-10およびISBN-13を英語圏以外の国に拡張する正規表現

分類Dev

Dockerルートの変更は中間圏dcosによって登録されません

分類Dev

圏論からの適用におけるマップ関数は何をしますか?

分類Dev

双軸の位置設定不可

分類Dev

Pythonの磁気双極子

分類Dev

MySQL大圏距離(Haversine式)

Related 関連記事

  1. 1

    Haskell:モノイド圏の射の合成

  2. 2

    `join`と` fmap join`はHaskellで等しいですか(圏論の観点から)?

  3. 3

    対流圏でのDBSecurityGroupIngressの設定

  4. 4

    中間圏とcoreosの主な違い

  5. 5

    カレークラスのために、Haskellでローカルに小さなデカルト閉圏を考えるのはなぜ公正なのですか?

  6. 6

    集合の圏で、なぜ単集合集合は終末なのか?

  7. 7

    カートピー:大圏距離線の高解像度

  8. 8

    住所を最寄りの大都市圏にマッピング

  9. 9

    Rのhist()が途切れている完全圏

  10. 10

    Rのhist()が途切れている完全圏

  11. 11

    対流圏DynamoDBTimeToLiveSpecification

  12. 12

    プログラマーのための圏論からのbifunctorの理解-Ch。8

  13. 13

    圏論用語でのLispの「quote」特殊形式とは何ですか?

  14. 14

    私の課した条件は圏論・集合論に名前があるの?

  15. 15

    ecoinventv.3.5で生物圏フローを呼び出す際のエラー

  16. 16

    関数出力に2列のデータがある場合に変更(地圏)

  17. 17

    マラソンを利用した中間圏のサービス間通信

  18. 18

    地圏との距離のマトリックス:微積分の繰り返しを避ける

  19. 19

    圏論POVからの適用ファンクターの定義は何ですか?

  20. 20

    クライスリ圏の構成と無限のリストを折りたたむ

  21. 21

    adehabitatHRの行動圏分析では、データをどの形式にする必要がありますか?

  22. 22

    圏論における「フィルター」とはどのような射ですか?

  23. 23

    圏論における「フィルター」とはどのような射ですか?

  24. 24

    ISBN-10およびISBN-13を英語圏以外の国に拡張する正規表現

  25. 25

    Dockerルートの変更は中間圏dcosによって登録されません

  26. 26

    圏論からの適用におけるマップ関数は何をしますか?

  27. 27

    双軸の位置設定不可

  28. 28

    Pythonの磁気双極子

  29. 29

    MySQL大圏距離(Haversine式)

ホットタグ

アーカイブ