> For the complete documentation index, see [llms.txt](https://kurohasu.gitbook.io/fsharpabout/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://kurohasu.gitbook.io/fsharpabout/functions/fc.md).

# 関数合成とカリー化

### 関数合成とは？

関数合成は複数の関数を合体させて一つの関数として処理できるようになります\
例えば以下の関数があったとしましょう

$$
f(x)=x+2　　g(y)=y\*2
$$

f(x)は引数xに２を加算する関数、g(y)は引数yを2倍する関数です\
これを合体させ「引数rを2倍したのちに+2する関数」k(r)を数式で表現すると次のようになります\
g(r)の計算をし、それを引数にf(x)の計算を行っています

$$
k(r)=f(g(r))
$$

これを元にF#における関数合成を見ていきましょう\ <br>

### 合成演算子

合成演算子は２つ以上の関数を合体させ関数を返します\
左から順に関数1,関数2...と順番に処理されていきます

```
構文:関数1>>関数2>>..関数n
```

### パイプライン演算子

パイプライン演算子は関数と値を受け取り、値を返します\
合成演算子同様、左から順に処理されていきます\
値や戻り値が自動で次の関数に渡されるため、主に関数を連続で呼び出すときに用いられます

```
構文:<値> |>関数1 追加の引数|>関数2|>...関数n
```

### 高階関数

高階関数は[こちら](/fsharpabout/basic/def-fun.md)で取り上げたように関数を引数にとる関数とするものです

```
構文:let 高階関数(引関数)=
    処理...

呼び出し:高階関数(引関数(引関数の引数))
```

### 実装例

さきほどのf(g(r))を実装してみましょう

```fsharp
//f(x)とg(y)を定義
let f(x)=x+2
let g(y)=y*2

//1 合成演算
let k1=g >> f

//2 パイプライン
let k2(arg)=g (arg)|> f

//3　高階関数
let k3(f1,f2,garg)=
    f1( f2(garg) )


//呼び出し
let a1=k1(2)
let a2=k2(2)
let a3=k3(f,g,2)

```

### カリー化について

{% hint style="info" %}
カリー化とは、複数の引数をとる関数を、引数が「もとの関数の最初の引数」で戻り値が「もとの関数の残りの引数を取り結果を返す関数」であるような関数にすること([Wikipedia](https://ja.wikipedia.org/wiki/%E3%82%AB%E3%83%AA%E3%83%BC%E5%8C%96)より)
{% endhint %}

簡単に言うと\
・最初の引数がカリー化関数の引数\
・残りの引数が戻り値に使用\
ということです

引数`a,b,c`を受け取る関数`func(a,b,c)`をカリー化すると\
・関数の引数:`a`\
・戻り値に使用する引数:`b,c`\
というように分解できます
