函手
functor。関手
關手とは書かない
圈 C から圈 D への對應 F で、圈の射の演算を保存するものを函手$ F:{\bf C}\to{\bf D}と呼ぶ 圖式的に描けば、$ a\xrightarrow{f}bが$ F(a)\xrightarrow{F(f)}F(b)に對應する
恆等射$ a\xrightarrow{\rm id}aは$ F(a)\xrightarrow{F({\rm id})}F(a)に對應する $ a\xrightarrow{f}b\xrightarrow{g}cつまり合成射$ a\xrightarrow{f;g}cは$ F(a)\xrightarrow{F(f;g)=F(f);F(g)}F(c)に對應する code:mmd
flowchart LR
subgraph C
end
subgraph D
end
a-.F.->Fa
b-.F.->Fb
c-.F.->Fc
f-.F.->Ff
g-.F.->Fg
fg-.F.->FfFg
%% 恆等射の對應も重要だが省略する
ScalaScala.iconに於いては、型 F[T] と型構築子 def F[T](t: T): F[T] が函手であるとは、函數 f が def f(a: A): B = b である時に、F[A](a).map[B](f) == F[B](b) となる method def map[B](f: A => B): F[B] が定義されてゐる事を言ふ 恆等函數と合成函數は當然保存する樣に定義する
この型でない map method を定義する事はまづ無い筈なので、map method が定義されてゐればたぶん函手である 例 : Seq 型。List 型。Option 型。Try 型。Either 型。Future 型
fold method、withFilter method、flatMap method、for 內包表記等はこの應用として在るので、函手の image は持っておかう fold method が有れば Foldable 型
flatMap method が有れば Monad 型
更に withFilter method が有れば MonadPlus 型
Ruby の Enumerable とは似てゐるが異なる發想が基になってゐる事を讀み取って欲しい
型 class として定義すると