3歳娘「パパ、関数をカリー化して？」

# 再就職する前のワイ
ワイ「あー、今日は休みやな」
ワイ「いうて**昨日も一昨日も休み**やったけど」

娘（**3歳**）「パパ、お絵かきしよ」

ワイ「ええで」

娘「あれ描いて。あの・・・**アンパンマ（ｎ**」

ワイ「**おっとそこまでや**」
ワイ「著作権のあるものを言うたらアカン」
ワイ「あれやな？アンパン**パーソン**のことやな？」
ワイ「描いたるで」
ワイ「チョイチョイチョイ、と」
ワイ「こうやな」

娘「わあ。上手。」
娘「次は**食パンマ（ｎ**」

ワイ「食パン**パーソン**やな？」
ワイ「描いたる描いたる」
ワイ「チョイチョイチョイ、と」
ワイ「こうや」
ワイ「ついでに**バイキンパーソン**も描いたる」

娘「すごいね。上手だね。」
娘「じゃあ、次は・・・」

娘「**カリー化された関数を書いて**」

ワイ「（**おっと？**）」
ワイ「カリー・・・**カレーパンパーソン**のことかいな？」

娘「ちがう、**カリー化された関数**書いて」

ワイ「お、おう」
ワイ「**分かるで〜**」
ワイ「**カリー化された関数が欲しい年頃**やもんな」

よめ太郎「（**分かるんかい**）」
よめ太郎「（**どんな話の合わせ方や・・・**）」

ワイ「ええけど、そんなもん何に使うんや」

娘「カリー化された関数を**部分適用**して」
娘「**3を足すだけの関数**を作ってほしいの」

ワイ「え、ええ・・・？」

娘「**みんな持ってるの**」
娘「**私だけ持ってないの**」

ワイ「（いや、そのセリフは**おねだりの常套句**やけど）」
ワイ「（**この文脈では無茶**やろ・・・）」
ワイ「（いや、最近の子はホンマに**みんな関数を持ってる**んか・・・？）」
ワイ「（・・・まあ、**娘ちゃんが喜ぶならどっちでもええか**・・・）」

ワイ「わ、**分かるで〜**」
ワイ「ワイが子供の頃も**3を足すだけの関数が流行ったもんや**」

よめ太郎「（**分かり過ぎやろ**）」
よめ太郎「（もはや**何でも分かる**人になってるやん）」
よめ太郎「（ていうかもう、筆者が書きたいことを書くために**ストーリーむちゃくちゃ**なってるやん・・・）」

ワイ「さあ、関数をカリー化していくで〜」

# カリー化とは

ワイ「たしか、**カリー化**いうんは」

```javascript
function tashizann(hikisu1, hikisu2) {
    return hikisu1 + hikisu2;
}
```

ワイ「例えば**↑**こういう普通の足し算関数を」

```javascript
tashizann(3, 5);
```

ワイ「**↑**こういう風に**2つの引数を渡す**んやなくて」

```javascript
tashizann(3)(5);
```

ワイ「**↑**こういう風に**1つずつ引数を渡す**関数に変換することやったな」
ワイ「そうするには・・・」
ワイ「どないすればええんや」

ワイ「要は`tashizann(3)`の部分が、戻り値として**関数を返してくれれば**」
ワイ「**返ってきたその関数に**、引数として`5`をぶち込んで」
ワイ「実行してやればええねんな」
ワイ「ということは・・・」

```javascript
function tashizann(hikisu1) {

}
```

ワイ「**↑**こんな感じで」
ワイ「`tashizann`が最初に受け取る引数は**1つだけ**」
ワイ「今回の例で言えば`3`だけを受け取るようにする、と」
ワイ「ほんで」

```javascript
function tashizann(hikisu1) {
    return function(){

    }
}
```
ワイ「**↑**こうや」
ワイ「`tashizann`は戻り値として**関数を返す**んや・・・」

ワイ「ほんで、その**返した関数**に`5`をぶち込みたいから」
ワイ「**内側の関数**にも**引数を1つ**指定せなあかんのやな」

```javascript
function tashizann(hikisu1) {
    return function(hikisu2){

    }
}
```

ワイ「こうや」
ワイ「これで`hikisu2`に`5`が入ってくるはずや」

ワイ「ほんで、その**内側の関数**が**最終的に返す値**は」
ワイ「`3 + 5`やから・・・」
ワイ「`return hikisu1 + hikisu2;`ってしてやればええんやな？」

```javascript
function tashizann(hikisu1) {
    return function(hikisu2){
        return hikisu1 + hikisu2;
    }
}
```

ワイ「**↑**こうやな」

ワイ「試してみよか」

```javascript
const kekka = tashizann(3)(5);

alert(kekka);
```

> アラート結果：
> **8**

ワイ「おお」
ワイ「とりあえず、**2つの引数を受け取る`tashizann`関数**を」
ワイ「**1つの引数を受け取る関数**を**ネストしたもの**に変換できたで」

# Next: 部分適用
ワイ「**カリー化**は出来たから、次は**部分適用**や」
ワイ「さっきカリー化した関数を使って、**3を足すだけの関数**を生成すればええんやな」
ワイ「さっきの`tashizann`という関数に`3`だけを渡すと」
ワイ「**関数が返ってくる**はずやから」
ワイ「その**返ってきた関数**を**定数に入れて保存**しとけばええんや」

```javascript
const tasu3 = tashizann(3);
```

ワイ「**↑**こうやな」
ワイ「これで、`tashizann`を**部分適用**して`tasu3`いう関数を作ることが出来たはずやで」

ワイ「実際に`tasu3`を使って、試してみよか」

```javascript
const kekka2 = tasu3(5);

alert(kekka2);
```

> アラート結果：
> **8**

ワイ「おお、できたで」

娘（**3歳**）「わーい！」
娘「これで**3を足し放題**だ〜！！！」

ワイ「・・・ホンマにこんなもんが欲しかったんか？」

娘「何言ってるの」
娘「**実務でもけっこう使える**よ？」

ワイ「（**実務！？**）」
ワイ「（**義務教育もまだ**やのに**もう実務を視野に・・・！？**）」
ワイ「（**末恐ろしい子やな・・・**）」

娘「**Haskell**や**Elm**なんかだと、関数が**デフォルトでカリー化**されてるんだから」

ワイ「せ、せやな（**知らんけど**）」

# そんなこんなで晩ごはん

ワイ「いただきますやで〜」
ワイ「はぁ、明日から新しい職場で働くんやな〜」
ワイ「ワイはちゃんとやっていけるんやろか」
ワイ「同僚のみんなのレベルについていけるんやろか」
ワイ「毎日プログラミングのお勉強はしとるけど、それでもまだ不安や・・・」

娘「パパ」
娘「前もって先のことを考えたり、心配しておくのは」
娘「基本的には良いことだと思うけど」
娘「それで考えすぎて心が疲れちゃうくらいなら」
娘「いったん考えるのをやめて、今このご飯が美味しいってことにフォーカスを当ててみよ？」

娘「まだ来てない明日のことで傷つくより、」
娘「目の前にあるご飯の美味しさを、集中して味わおうよ」
娘「そのほうが心も安らいで、むしろ明日の力になるんだよ」

ワイ「せやな・・・」
ワイ「ありがとう娘ちゃん・・・」
ワイ「ウマい・・・ウマいで・・・」

よめ太郎「（できた子や・・・）」
よめ太郎「（**ワイの血やな・・・**）」


**〜おしまい〜**

# 追記1: アロー関数式
アロー関数式を使って書くとここまでシンプルにできるで。

```javascript
const tashizann = hikisu1 => hikisu2 => hikisu1 + hikisu2;
```

# 追記2: カリー化や部分適用のメリット
例えば

```javascript
const styleChange = prop => value => elm => elm.style[prop] = value;
```

**↑**こんな関数を作っておいて、

```javascript
document.querySelectorAll(".className").forEach(styleChange("color")("red"));
```

**↑**こんな感じで即席関数を作ってforEachメソッドに渡せたり・・・とかですかね。
ぶっちゃけ使い所はあんまり分かってません・・・。