Category型クラス
computationを表す型クラス
Hask圏以外にも様々な圏を統一的に表現できる
概要
Hask圏では、対象を型、射を関数とみなしていたが、
更に一般化して、対象を型、射をcomputationとして定義する
あとから見れば順序が逆だが、普通のHaskellerはHask圏の存在から知るのでこういう説明になるmrsekut.icon
inputをoutputに「どのように変換するか」がインスタンスとなるので、
computationを表す型クラスと、捉えることができる
故に、computationの具体例はすべてCategory型クラスのインスタンスにできる
Categoryのインスタンスが圏
Categoryそのものは「圏の定義」なので、圏よりも上の次元の概念である
例えば、->で構成されたCategoryが、Hask圏である
つまり、Hask圏は、「関数の圏」である
#??
Hask圏は、Categoryで定義できる圏の部分圏になっている?
直感的にはそう思えるが、確認はしていないmrsekut.icon
docs
定義
射の視点からの圏の定義なので、「合成」と「恒等射」のみ定義すれば十分mrsekut.icon
code:hs
class Category cat where
id :: cat a a -- 恒等射
(.) :: cat b c -> cat a b -> cat a c -- 合成
cat a bはcomputation
a型の値からb型の値を生み出すことを表す
便利関数
Control.Categoryモジュール内に定義されている
code:hs
-- 右から左への合成
(<<<) :: Category h => h b c -> h a b -> h a c
(<<<) = (.)
-- 左から右への合成
(>>>) :: Category h => h a b -> h b c -> h a c
(>>>) = flip (.) -- もしくは、f >>> g = g.f
インスタンスの例
普通の関数
code:hs
instance Category (->) where
id = id -- 実際は、GHC.Base.id
(.) = (.) -- 実際は、(GCH.Base..)
関数名が同じだとエラーになるので、実際はこんなふうに定義されている
Kleisli mのインスタンス化 ref
code:hs
instance Monad m => Category (Kleisli m) where
id :: a -> m a
id = return
(.) :: (b -> m c) -> (a -> m b) -> (a -> m c)
g . f = g <=< f
cat a bがa -> m bになるような型コンストラクタcatのことを「Kleisli m」と呼ぶらしい
#??
Arrow型クラスとの関係性
逆に、Arrow以外で使われているものってあるの?
つまり、なんでCategoryとArrowを分けた?
どういう基準で?
なぜarrはCateogryにではなく、Arrowに定義されている?
arrは一般的な関手なのだから、Categoryにあってもおかしくないような気もするが
実際に使っている例
HaskellでBrainfuck処理系#5f96e20319827000001ada57
参考
『関数プログラミングの楽しみ』 10章
敢えて関数名とか定義とずらしているんだろうけど、逆に混乱を招く感じもするmrsekut.icon
Category と Arrow — Avendia
順序だった基本
https://hackage.haskell.org/package/base-4.10.0.0/docs/Control-Category.html
https://qiita.com/CyLomw/items/a618b7c7326d9abede63
https://qiita.com/CyLomw/items/ff1e5d1600291c952c5e
https://qiita.com/CyLomw/items/a874cee33c69653f53c6