2

私は F# を学び始めましたが、C# との構文の主な違いの 1 つは、型推論が C# よりもはるかに多く使用されていることです。これは通常、F# の利点の 1 つとして提示されます。型推論が利点として提示されるのはなぜですか?

クラス階層と、それとは異なるクラスを使用するコードがあるとします。強力な型付けにより、任意のメソッドで使用されているクラスをすばやく検出できます。型推論ではそれほど明白ではないため、ヒントを使用して、どのクラスが使用されているかを理解する必要があります。型推論を使用して F# コードを読みやすくするための手法はありますか?

4

1 に答える 1

7

この質問は、F# でオブジェクト指向プログラミング (複雑なクラス階層など) を使用していることを前提としています。確かにそうすることができますが、OO の概念を使用すると、主に相互運用性や .NET ライブラリでの一部の F# 機能のラップに役立ちます。

コードを理解する。関数型スタイルでコードを記述すると、型推論がより便利になります。コードが短くなりますが、何が起こっているのかを理解するのにも役立ちます。たとえば、map関数をリスト ( SelectLINQ のメソッド) に上書きする場合:

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>があると推測します。測定単位がどのように機能するかを理解し、単位情報を含む型を推測します。この機能は非常に便利ですが、すべてのユニットを手で書かなければならない場合 (型が長くなるため) は使いにくいでしょう。一般に、(常に) 入力する必要がないため、より正確な型を使用できます。

于 2013-05-22T11:12:59.753 に答える