関数について詳しく知る
コードが反復しているように見える状況は、よくあります。 多くの場所で同じことを行う場合や、わずかな違いしかない場合です。 このような状況では、コードを再利用する方法を検討してください。 この状況に対処する方法は、これらの式を抽出して 1 つ以上の関数を作成することです。 関数は、多くのプログラミング言語で基本的な構成要素となっており、F# も例外ではありません。
関数
関数は、1 つ以上の式で構成された本文を持つ名前付き参照です。 パラメーターを持たせることもできます。 関数は、let キーワードと関数の名前で始まります。 次に代入演算子があり、その演算子の右に関数本体があります。
関数の構文を次に示します。
let <function name> <parameters> = <function body>
実際の関数例は、前の構文の例で示したとおり、次のようになります。
let add a b = a + b
この例では、関数の名前は add で、パラメーターは a と b です。 この関数本体では 2 つのパラメーターが加算 (a+b) され、結果が返されます。
戻り値
最初の例で見たように、返されるものを示す return キーワードはありません。 F# では、関数の最後の行に指定されている情報が、返されるものです。 次の複数行の関数について考えてみましょう。
let addAndMultiply a b c =
let sum = a + b
let product = sum * c
product
最後の行に product を配置することで、何が返されるかがわかります。 では、このような関数を呼び出すにはどうすればよいでしょうか。
関数を呼び出す
関数を呼び出すには、関数の名前を使用し、使用したいパラメーターを空白文字で区切って追加します。 たとえば、addAndMultiply() 関数を呼び出すには、次のコードを入力します。
addAndMultiply 2 3 3 // 15
この関数の結果を表示するには、変数に代入するか、次のように直接出力できます。
let sum = addAndMultiply 2 3 3
printfn "%i" sum
// OR
printfn "%i" (addAndMultiply 2 3 3)
推論される型
次のコードを見てみましょう。
let add a b = a + b
let sum = add 2 2
let concat = add "hello" "world" // will give compilation error
このコードは最後の行で失敗し、次のメッセージが表示されます。
error FS0001: This expression was expected to have type
'int'
but here has type
'string'
このエラーの理由は、F# では、使用する必要があるパラメーターの型が既に決定され、整数に決定されているためです。 整数に決定された理由は、2 番目の行 let sum = add 2 2 の情報によるものです。 関数 add() は、パラメーターの型が確実に整数であることを示す方法で使用されていました。
2 番目の行が存在しない場合、コードは次のように機能します。
let add a b = a + b
// let sum = add 2 2
let concat = add "hello" "world" // will work
コンパイラは、関数の最初の使用が文字列を使用して行われていることを確認しており、パラメーターの型が文字列であるという結論を出します。 したがって、コンテキストと最初の使用により型が推測されます。
明示的な型
パラメーターが受け取る型と、関数によって返されるものの両方について明示的にしたい場合があります。 コンパイラが必要としない可能性が高い場合でも、明示的にすることで可読性が高まります。
たとえば、次の関数について検討してみましょう。
let convert a =
int a
型を追加するには、次のように :<type> を追加します。
let convert (a:string) =
int a
パラメーターは、コード string によって、型 let convert (a:string) を持つようになりました。 戻り値の型を追加することで、より明示的にすることができるようになりました。 これを行うには、パラメーターの後にもう 1 つ :<type> を追加します。
let convert (a:string) :int =
int a
今度は、(a:string) のようにかっこでパラメーターを囲みます。 戻り値の型は、最後に発生する :<type> の注釈 :int です。 F# でも、十分ほとんどのシナリオを把握できますが、コードをより明示的にする必要がある場合もあります。 型を追加するもう 1 つの利点は、何が起こっているかを他の開発者が簡単に把握できるようになることです。