カリー化（Juliaで解説）

「カリー化」という概念があります。カリー化とは、複数の引数を持つ関数を、いくつかの関数の組み合わせで表現することを指します。ここではJuliaで解説します。

例えば、次のようなコードでは、複数の引数を持つ「add」という関数を定義しています。

```Julia
# 複数の引数を持つ関数
function add(x, y)
    return x + y
end

# 関数を使用する
println(add(1, 2))
println(add(3, 4))
println(add(5, 6))

```
このコードを実行すると、次のような出力が得られます。

```Julia
3
7
11

```
このように、複数の引数を持つ「add」という関数を定義し、その関数を使用しています。

一方、juliaでは、このような複数の引数を持つ関数を、単一の引数を持つ関数の組み合わせで表現することができます。例えば、次のようなコードでは、「add」という関数をカリー化した形で定義しています。


```Julia
# 複数の引数を持つ関数をカリー化した形で定義する
function add(x)
    function(y)
        return x + y
    end
end

# 関数を使用する
println(add(1)(2))
println(add(3)(4))
println(add(5)(6))

```
このコードを実行すると、次のような出力が得られます。
```Julia
3
7
11

```
このように、カリー化を使用することで、複数の引数を持つ関数を、単一の引数を持つ関数の組み合わせで表現することができます。

## メリット
カリー化によって、複数の引数を持つ関数を、単一の引数を持つ関数の組み合わせで表現することができるため、次のようなメリットがあります。

### 関数を再利用しやすくなる
カリー化を使用することで、同じ引数を持つ複数の関数を1つの関数で表現することができます。そのため、同じ処理を行う複数の関数を定義する必要がなくなり、再利用性が向上します。
例えば上記の例ですと以下のような使い方もあります
```Julia
add10 = add(10)
println(add10(5))

# 15

```


### コードをスマートに記述できる
カリー化を使用することで、複数の引数を持つ関数を、単一の引数を持つ関数の組み合わせで表現することができます。このため、複数の引数を持つ関数を書くよりも、単一の引数を持つ関数の組み合わせで書く方が、コードがスマートに書けるようになります。

### 関数をパイプラインで繋げやすくなる
カリー化を使用することで、複数の引数を持つ関数を、単一の引数を持つ関数の組み合わせで表現することができます。そのため、複数の関数を「パイプライン」と呼ばれる形で繋げることができます。このため、関数をパイプラインで繋げることで、よりスマートなプログラムを書くことができます。

## カリー化のデメリット
カリー化を使用することには、いくつかのデメリットがあります。ここでは、その代表的なものを紹介します。

### コードがわかりづらくなる
カリー化を使用することで、関数の定義が複雑になります。元々は、単純な複数の引数を持つ関数が、カリー化を使用した形で定義されることになります。このため、その関数を使用するためには、カリー化を理解する必要があります。しかし、カリー化は一般的ではないため、カリー化を使用した関数を理解し難いときもあり、コードがわかりづらくなることがあります。


### デバッグが難しくなる
カリー化を使用することで、関数の定義が複雑になるため、デバッグが難しくなる可能性があります。例えば、カリー化を使用した関数でエラーが発生した場合、そのエラーが発生した箇所を特定するのは困難である可能性があります。例えば上記の例ですとadd10は関数ではないと誤解してしまい、println(add10)としてしまう恐れがあります。

## 参考図書
[１から始めるプログラミング](https://amzn.to/3HHR7Yv)
<a href="https://www.amazon.co.jp/1%E3%81%8B%E3%82%89%E5%A7%8B%E3%82%81%E3%82%8B-Julia%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0-%E9%80%B2%E8%97%A4-%E8%A3%95%E4%B9%8B/dp/433902905X?crid=2JGVUDQSK5GJQ&keywords=julia+%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%A8%80%E8%AA%9E&qid=1671346628&sprefix=julia+%2Caps%2C224&sr=8-1&linkCode=li3&tag=buzz06-22&linkId=8f7deba521f52f812d35ecdbe756cc10&language=ja_JP&ref_=as_li_ss_il" target="_blank"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=433902905X&Format=_SL250_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=buzz06-22&language=ja_JP" ></a><img src="https://ir-jp.amazon-adsystem.com/e/ir?t=buzz06-22&language=ja_JP&l=li3&o=9&a=433902905X" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />

[Juliaプログラミングクックブック](https://amzn.to/3PFfb0a)
<a href="https://www.amazon.co.jp/Julia%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E3%82%AF%E3%83%83%E3%82%AF%E3%83%96%E3%83%83%E3%82%AF-%E2%80%95%E8%A8%80%E8%AA%9E%E4%BB%95%E6%A7%98%E3%81%8B%E3%82%89%E3%83%87%E3%83%BC%E3%82%BF%E5%88%86%E6%9E%90%E3%80%81%E6%A9%9F%E6%A2%B0%E5%AD%A6%E7%BF%92%E3%80%81%E6%95%B0%E5%80%A4%E8%A8%88%E7%AE%97%E3%81%BE%E3%81%A7-Bogumi%C5%82-Kami%C5%84ski/dp/4873118891?crid=2JGVUDQSK5GJQ&keywords=julia+%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%A8%80%E8%AA%9E&qid=1671346628&sprefix=julia+%2Caps%2C224&sr=8-2&linkCode=li3&tag=buzz06-22&linkId=4e34b4b620932164412ec18acff914a8&language=ja_JP&ref_=as_li_ss_il" target="_blank"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=4873118891&Format=_SL250_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=buzz06-22&language=ja_JP" ></a><img src="https://ir-jp.amazon-adsystem.com/e/ir?t=buzz06-22&language=ja_JP&l=li3&o=9&a=4873118891" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />

[天才プログラマー タンメイが教える Julia超入門](https://amzn.to/3FJRpeW)
<a href="https://www.amazon.co.jp/%E5%A4%A9%E6%89%8D%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9E%E3%83%BC-%E3%82%BF%E3%83%B3%E3%83%A1%E3%82%A4%E3%81%8C%E6%95%99%E3%81%88%E3%82%8B-Julia%E8%B6%85%E5%85%A5%E9%96%80-Tanmay-Bakshi/dp/4807920219?crid=2JGVUDQSK5GJQ&keywords=julia+%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%A8%80%E8%AA%9E&qid=1671346628&sprefix=julia+%2Caps%2C224&sr=8-10&linkCode=li3&tag=buzz06-22&linkId=bf79aa67b5c5956c8fd26f9436401dc6&language=ja_JP&ref_=as_li_ss_il" target="_blank"><img border="0" src="//ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=4807920219&Format=_SL250_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=buzz06-22&language=ja_JP" ></a><img src="https://ir-jp.amazon-adsystem.com/e/ir?t=buzz06-22&language=ja_JP&l=li3&o=9&a=4807920219" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />