冪と関数適用
普通の関数適用と冪の関係を見てみる
「関数適用」を以下の要素で見る
全ての関数全体の集合
入力全体の集合
出力全体の集合
関数適用とは以下の組み合わせである
(全ての関数全体の集合x入力全体の集合)→出力全体の集合
一つの関数を選んで、一つの入力を選べば、一つの出力が得られる
冪の詳細については、冪のページに任すとして、雑に書くとこういうものである https://gyazo.com/c9cd3f600fa89e53ef931a54ddd0092c
$ X,Yは圏$ \mathscr{A}の対象
$ Y^Xが冪
table:上の説明との対応
X 入力全体の集合
Y 出力全体の集合
Y^X 全ての関数全体の集合 この要素が関数fになる
evalは関数適用を表す射
つまり、「関数」である射、よりメタ
$ Aの部分は$ \mathscr{A}の任意の対象
射$ aのところの存在意義?がわからない
$ a:X\times A\to Yはなに?
ここで2引数関数を考える
2つの引数を取る関数$ fを考える
$ f: X\times Y\to Z
code:hs
f :: X -> Y -> Z
f = undefined
$ fをカリー化することを考える
code:hs
f :: A -> B -> C -- A -> (B -> C) と見る
f = undefined
g :: B -> C
g = f a
すると1引数関数の連鎖に変換できる
このカリー化も圏論的に考えることができる
まずは2引数関数$ f:X\times Y\to Zがある
https://gyazo.com/80a5f8aafca8fd946550da8f534d1f7c
これを、↓こうする!
https://gyazo.com/ee60a8146eb5c08af1f602091e9c14c2
直感的になるように少し順序を入れ替えているmrsekut.icon
可換図式の意味としては、実線がある状況の下で、点線にあたる唯一の射が存在する、ということだ つまり、$ \mathrm{eval}\circ (f'\times 1_Y)=fが成り立つような射$ f':X\to(Y\to Z)が存在する、ということを主張している
$ fも$ f'も同じ関数ではあるけど、引数に対する意識が異なる
これはカリー化そのものだ
3引数も考えてみる
code:hs
f :: W -> X -> Y -> Z
g :: X -> Y -> Z
h :: Y -> Z
https://gyazo.com/32e920f79cf0de923e777f945f984564
どうにかもっときれいに書けないものかmrsekut.icon
https://gyazo.com/122767c622961d92c7a986b22d223cb8
こういうこと?mrsekut.icon
点線の位置が変わっている
Haskellのuncurry関数は、2引数関数を一つのタプルを取る関数に変換する
Haskellはカリー化がデフォルトなのでuncurryするなら、タプルを取るしかない
code:hs
uncurry :: (a -> b -> c) -> (a,b) -> c
times = uncurry (*)
times (3,4) -- > 12
参考