関数とは
関数は、あらゆるプログラミング言語において、プログラムの "実行" の基本となる単位です。他の言語の場合と同様に、F#の関数にも "関数名" と "関数の本体(= 処理内容)" があります。また、パラメータや引数を受け取ることもできます。
F#ではさらに、関数型プログラミングの構成要素もサポートしています。たとえば、関数を値として処理できたり、名前のない関数を式(= ラムダ式)として使用できたりします。また、関数合成を利用して新しい関数を作成できたり、カリー化関数や、関数の引数の部分適用による関数の暗黙の定義などもサポートされています。
関数を定義するには "letキーワード" を使用します。また、再帰関数の場合は "let recキーワード" を使用します。
構文
F#の関数を定義する構文は以下のような形式になります。
// 通常の関数宣言
let [ inline ] function-name parameter-list [ : return-type ] = function-body
// 再帰関数の宣言
let rec function-name parameter-list = function-body
要素名 | 内容 |
---|---|
let / let rec | let束縛キーワード |
function-name | 関数名 |
parameter-list | パラメータ / 引数 |
function-body | 処理内容 |
inline | オプション: 関数をinline化する場合, 追記 |
:return-type | オプション: 返り値の型を明示的に指定する場合, 追記 |
簡単な定義例
関数の簡単な定義の例を見ていきましょう。
(1) まずはシンプルな関数宣言の例を見ていきます
// 引数を取らず、"Hello, World!!" と標準出力に表示する関数
// 引数なしの場合は、() をparameter-list に指定します
let showHello () = printfn "Hello, World!!"
// 2つの引数をとって、足し算をする関数
// parameter-list に a と b を指定しています
let plus a b = a + b
// 2つの引数をとって、引き算をする関数
// inlineオプションを指定しています
let inline sub a b = a - b
(2) 次に、返り値の型を指定している関数の宣言例を見ていきます
// 引数を取らず、"Hello, World!!" と標準出力に表示する関数
// unit型を返すことを明示しています
let showHello () : unit = printfn "Hello, World!!"
// 2つの引数をとって、足し算をする関数
// double型を返すことを明示しています
let plus a b : double = a + b
(3) 次に、引数の値にも型指定をしている関数の宣言例を見ていきます
// 2つの引数をとって、足し算をする関数
// int型を2つ引数にとり、int型を返すことを明示しています
let plus (a:int) (b:int) : int = a + b
// 引数の型指定は, 任意の引数にのみ適用することも可能
// 今回は第一引数と返り値にのみ、明示的に型指定をしています
let sub (a:int) b : int = a - b
その他
関数定義の方法には、let束縛以外にも do束縛 や ラムダ式 などの方法があります。詳細については、別の章で紹介したいと思います。
また、F#においては、関数はファーストクラス(= 第一級)の値です。もっと簡単に言うと、関数も "数値" や "文字列" のような基本的な 値 と同じように扱うことができるということです。
そのため、F#では関数も数値も同じように let束縛 できるわけですね。すぐには、この便利さがわからないかもしれませんが、徐々にわかるようになると思います。
ここではその便利さの説明はしませんが、いずれどこかの章か項で紹介したいと思います。