generated at
Category型クラス
Hask圏以外にも様々な圏を統一的に表現できる

概要
Hask圏では、対象を型、射を関数とみなしていたが、
更に一般化して、対象を型、射をcomputationとして定義する
あとから見れば順序が逆だが、普通のHaskellerはHask圏の存在から知るのでこういう説明になるmrsekut
inputをoutputに「どのように変換するか」がインスタンスとなるので、
computationを表す型クラスと、捉えることができる
故に、computationの具体例はすべてCategory型クラスのインスタンスにできる
Categoryのインスタンスが圏
Categoryそのものは「圏の定義」なので、圏よりも上の次元の概念である
例えば、 -> で構成されたCategoryが、Hask圏である
つまり、Hask圏は、「関数の圏」である


Hask圏は、Categoryで定義できる圏の部分圏になっている?
直感的にはそう思えるが、確認はしていないmrsekut



定義
射の視点からのの定義なので、「合成」と「恒等射」のみ定義すれば十分mrsekut
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モジュール内に定義されている
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`


インスタンスの例
普通の関数
hs
instance Category (->) where id = id -- 実際は、GHC.Base.id (.) = (.) -- 実際は、(GCH.Base..)
関数名が同じだとエラーになるので、実際はこんなふうに定義されている
Kleisli mのインスタンス化 ref
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にあってもおかしくないような気もするが



実際に使っている例


参考
敢えて関数名とか定義とずらしているんだろうけど、逆に混乱を招く感じもするmrsekut
順序だった基本