> 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/basic/def-fun.md).

# 関数を定義する

そもそも関数とは？

関数は、ある処理をするプログラムをひとまとめにしたもので一度定義すれば呼び出すだけで何度でも使用できます。関数の宣言には「let」を用います

### 関数の定義

以下が関数を定義する構文です

```
構文:let <関数名>(<引数>)=
        処理...
        戻り値
```

{% hint style="info" %}
引数\
->関数を実行するときに渡す値\
戻り値\
->関数を実行した後戻す値\
(戻り値が無い場合、自動でunitを返します)\
\
また変数の宣言時と同様に引数、戻り値のデータ型の指定も可能です
{% endhint %}

### 関数の呼び出し

関数の呼び出しには関数名と引数に渡す値を記述するだけでOKです

```
構文:<関数名>(<引数>)

(型の表現:<引数の型> -> <戻り値の型>)
```

### 実装例

```fsharp
//①Hello Function!と表示する関数「Hi」
//引数->unit(なし)
//戻り値->unit(なし)
let Hi()=
    printfn "Hello Function!"


//呼び出し
Hi()
```

```fsharp
// ②引数を+3して戻す関数「add3」
//引数->int
//戻り値->int
let add3(x):int=    //関数名():データ型　と記述すると戻り値のデータ型を指定できます
    x+3

//呼び出し
let r=add3(5)    //5を引数にadd3()を呼び出す->r=8になる
```

```fsharp
//③引数の配列の要素を*2して返す関数「arraydouble」
//引数->int[](1次元整数配列)
//戻り値->int[]
let arraydouble(ar:int[])=
    let mutable back=Array.copy arr
    back<-Array.map (fun atai->atai*2) back    //back[]の全要素を*2する
    back    //back[]を戻す
    
//呼び出し
let k=arraydouble([|2;67;32;1;0|])
```

```fsharp
//④引数の積を返す関数「kakezan」
//引数->int*int(int型の引数が２つ)
//戻り値->int
let kakezan(x:int,y:int)=
    x*y
    
//呼び出し
let num=kakezan(3,5)
```

{% hint style="success" %}
また、inline 関数名() と記述するとインライン関数として扱えます\
(インライン関数にすることでパフォーマンスの向上に繋がります)
{% endhint %}

それだけでなくF#では再帰関数、匿名関数（ラムダ式）、関数合成を扱う事も出来ます\
次章では関数プログラミングとしての機能を紹介します
