カテゴリ:構成の本質

これは、「プログラマー向けのカテゴリー理論」シリーズの2番目の記事です。



カテゴリは非常に単純な概念です。



カテゴリは、オブジェクトとそれらの間に向けられた矢印で構成されます。 したがって、カテゴリはグラフィカルに表現するのが非常に簡単です。 オブジェクトは円または点の形で描画でき、矢印はそれらの間の単なる矢印です。 (変更のために、時々子豚のようなオブジェクトと花火のような矢印を描画します。)しかし、カテゴリーの本質は構成です。 または、必要に応じて、構成の本質はカテゴリです。 矢印は、オブジェクトAからオブジェクトBへの矢印と、オブジェクトBからCへの別の矢印がある場合、AからCへの矢印、それらの合成がなければならないように配置されています。



画像



このカテゴリでは、AからBへの矢印とBからCへの矢印がある場合、AとCからの矢印があります。これは合成と呼ばれます。 このスキームは、十分な同一のモルフィズムがないため、カテゴリの完全な定義ではありません(以下を参照)。



関数としての矢印



あまりにも抽象的なでたらめですか? 絶望しないでください。 いくつかの例を見てみましょう。 関数として、射とも呼ばれる矢印を考えてください。 タイプAの引数を取り、タイプBの値を返す関数fがあります。Bを取り、Cを返す別の関数gがあります。結果をfからgに渡すことで結合できます。 Aを取り、Cを返す新しい関数について説明しました。



数学では、そのような構成は関数間の小さな円で示されます:gf。 右から左への構成順序に注意してください。 これは一部の人々にとって混乱を招きます。 Unixでのパイプ指定との類似性を確認できます。たとえば、次のとおりです。

lsof | grep Chrome

      
      





>> F#, -. Haskell -. , g∘f «g f.»



. f, A B:

B f(A a);

      
      





:

C g(B b);

      
      





:

C g_after_f(A a)
{
    return g(f(a));
}

      
      





-: g(f(a));, .

, ++, , .

: ++14 ( , ):



template <typename T>
struct function_arg: public function_arg<decltype(&T::operator())> {};

template<typename ReturnType, typename Arg>
struct function_arg<ReturnType(Arg) const> {
	using type = Arg;
};

template<typename ClassType, typename ReturnType, typename Arg>
struct function_arg<ReturnType(ClassType::*)(Arg) const> {
	using type = Arg;
};

template<typename T>
using function_arg_t = typename function_arg<T>::type;

template<typename F, typename G>
auto compose(F&& f, G&& g) {
	return [f = std::forward<F>(f), g = std::forward<G>(g)]
		(function_arg_t<F>&& a) {return g(f(std::forward<function_arg_t<F>>(a)));};
}

      
      





, Haskell. :

f :: A -> B

      
      





:

g :: B -> C

      
      





:

g . f

      
      





, Haskell, C++ . Haskell Unicode , :

g ∘ f

      
      





Unicode:

fAB

      
      





Haskell : « ...» . ( Unicode).





, .



1. . , f, g h, ( , ), , . , :

h∘(g∘f) = (h∘g)∘f = h∘g∘f

      
      





() Haskell:

f :: A -> B
g :: B -> C
h :: C -> D
h . (g . f) == (h . g) . f == h . g . f

      
      





«» , .

, , .



2. A , . . — , , A A , . idA ( ). , f A B,

f∘idA = f

      
      







idB∘f = f

      
      





, , . , , . C++ :

template<class T> T id(T x) { return x; }

      
      





: -, :

template<class T> auto id(T&& x) { return std::forward<T>(x); }

      
      





, C++ , , ( , , , , , ).



Haskell, — ( Prelude). :

id :: a -> a
id x = x

      
      





, Haskell . , . , , .



Haskell — : x. . , , . — , . , ( , ).



— . — , x.



Haskell.



( , -Haskell), :

f . id == f
id . f == f

      
      





: - — , ? , ? — . , , .



, id, . , , , . , , . — , . — .



: (). . , .





. - . , , : ? , , , . : ? , — , . « x EAX.» , , , — - . ( , ). ? . , , . , , . : . , .



. . . , « - », , 7 ± 2 «» . , , . , . , , , . , , . , .



?

, , . ( , , — , , ).

— , , .

— , , .

, , , , . - , — . — . , .



— , . . , — — . -, ( , ). : , :) - , ( , ), , . , , , .



.



:

:



,





P.S. , , , : .



All Articles