冪と関数適用
普通の関数適用と冪の関係を見てみる
「関数適用」を以下の要素で見る
全ての関数全体の集合
入力全体の集合
出力全体の集合
関数適用とは以下の組み合わせである
( 全ての関数全体の集合
x 入力全体の集合
)→ 出力全体の集合
一つの関数を選んで、一つの入力を選べば、一つの出力が得られる
冪の詳細については、
冪のページに任すとして、雑に書くとこういうものである
X,Yは圏\mathscr{A}の対象
Y^Xが冪
上の説明との対応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
hs f :: X -> Y -> Z
f = undefined
fをカリー化することを考える
hsf :: A -> B -> C -- A -> (B -> C) と見る
f = undefined
g :: B -> C
g = f a
すると1引数関数の連鎖に変換できる
このカリー化も圏論的に考えることができる
まずは2引数関数f:X\times Y\to Zがある
これを、↓こうする!
直感的になるように少し順序を入れ替えている

可換図式の意味としては、実線がある状況の下で、点線にあたる唯一の射が存在する、ということだ
つまり、\mathrm{eval}\circ (f'\times 1_Y)=fが成り立つような射f':X\to(Y\to Z)が存在する、ということを主張している
fもf'も同じ関数ではあるけど、引数に対する意識が異なる
これはカリー化そのものだ
3引数も考えてみる
hsf :: W -> X -> Y -> Z
g :: X -> Y -> Z
h :: Y -> Z
どうにかもっときれいに書けないものか

こういうこと?

点線の位置が変わっている
Haskellのuncurry関数は、2引数関数を一つのタプルを取る関数に変換する
Haskellはカリー化がデフォルトなのでuncurryするなら、タプルを取るしかない
hsuncurry :: (a -> b -> c) -> (a,b) -> c
times = uncurry (*)
times (3,4) -- > 12
参考