この質問は、F# でオブジェクト指向プログラミング (複雑なクラス階層など) を使用していることを前提としています。確かにそうすることができますが、OO の概念を使用すると、主に相互運用性や .NET ライブラリでの一部の F# 機能のラップに役立ちます。
コードを理解する。関数型スタイルでコードを記述すると、型推論がより便利になります。コードが短くなりますが、何が起こっているのかを理解するのにも役立ちます。たとえば、map
関数をリスト ( Select
LINQ のメソッド) に上書きする場合:
let map f list =
seq { for el in list -> f el }
型推論により、関数の型は次のようになります。
val map : f:('a -> 'b) -> list:seq<'a> -> seq<'b>
これは、書きたかったことについての期待に一致します。引数f
は、型の'a
値を型の値に変換する関数で'b
あり、map
関数は値のリストを取り、'a
値のリストを生成し'b
ます。したがって、型推論を使用して、コードが期待どおりに動作することを簡単に確認できます。
一般化。自動一般化 (コメントで言及) とは、上記のコードが自動的に可能な限り再利用可能であることを意味します。C# では、次のように記述できます。
IEnumerable<int> Select(IEnumerable<int> list, Func<int, int> f) {
foreach(int el in list)
yield return f(el);
}
このメソッドは一般的ではありません。値Select
のコレクションに対してのみ機能しint
ます。しかし、これを制限する理由はありませんint
。同じコードがどの型でも機能します。型推論メカニズムは、そのような一般化を発見するのに役立ちます。
さらにチェック。最後に、推論のおかげで、F# 言語は、すべての型を明示的に記述しなければならない場合よりも、より簡単に多くのことをチェックできます。これは言語の多くの側面に当てはまりますが、測定単位を使用することで最もよく示されます。
let l = 1000.0<meter>
let s = 60.0<second>
let speed = l/s
F# コンパイラはspeed
、型float<meter/second>
があると推測します。測定単位がどのように機能するかを理解し、単位情報を含む型を推測します。この機能は非常に便利ですが、すべてのユニットを手で書かなければならない場合 (型が長くなるため) は使いにくいでしょう。一般に、(常に) 入力する必要がないため、より正確な型を使用できます。