F# と C# の記法比較

MSDN F# リファレンスを使い C# と記法を比較する

値 Values

元ネタ http://msdn.microsoft.com/ja-jp/library/dd233185.aspx

値の束縛

束縛とは、名前と定義を関連付けることを意味します。 let キーワードは、次の例のように、値のバインディングを行います。

F#

let a = 1
let b = 100u
let str = "text"

// A function value binding.

let f x = x + 1

正確には const をつけて変更できないようにするのだが、コード的には変更しなければ良い。

C#

const int a = 1;
const char b = (char)100;
const string str = "text";
// A function value binding.
Func<int, int> f = x => x + 1;

変更不可である理由

純粋な関数型言語では、変数は存在せず、関数は数学関数として厳密に機能します。 手順型言語のコードでは変数割り当てを使用して値を変更しますが、関数型言語の等価なコードには、入力される変更不可の値、変更不可の関数、および出力される別の変更不可の値があります。 この数学的な厳密性により、プログラムの動作についての強力な推論が実現します。 この強力な推論により、コンパイラでコードをより厳密にチェックし、より効率的に最適化を行い、開発者が正しいコードを容易に理解および記述できるようになります。 したがって、関数型コードは、通常の手順型コードよりもデバッグが容易になるのが普通です。

要は、変更しないことを優先することによって、変更しているかもしれないリスク(変数の汚染)を減してデバッグを容易にする、ってこと。また、型推論を優先させるためには、変更しないことを優先するほうがよい。

変更可能な理由

変更可能な変数に初期値を割り当てるには、値を定義するときと同じ方法で、let キーワードを使用します。 ただし、次の例に示すように、<- 演算子を使用して、変更可能な変数の後に新しい値を割り当てることができます。

F#

let mutable x = 1
x <- x + 1

C# の場合は、変数>値になるので、数の変更は楽。

C#

int x = 1 ;
x = x + 1 ;