カテゴリは非常に単純な概念です。
カテゴリは、オブジェクトとそれらの間に向けられた矢印で構成されます。 したがって、カテゴリはグラフィカルに表現するのが非常に簡単です。 オブジェクトは円または点の形で描画でき、矢印はそれらの間の単なる矢印です。 (変更のために、時々子豚のようなオブジェクトと花火のような矢印を描画します。)しかし、カテゴリーの本質は構成です。 または、必要に応じて、構成の本質はカテゴリです。 矢印は、オブジェクト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:
f ∷ A → B
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. , , , : .