カテゴリ:構成の本質

これは、「プログラマー向けのカテゴリー理論」シリーズの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. , , , : .

Source: https://habr.com/ru/post/J246009/


All Articles