1

ほとんどのプログラミング言語には、コンパイル時に型に基づいて実装を選択する何らかの方法があります。関数のオーバーロードは、これを行う一般的な方法です。テンプレートを使用する (C++ または D で、おそらく制約付きで) ことも別のオプションです。

しかし、F# では、クラス メソッドを使用せずにこれを行う方法を見つけることができないため、カリー化などのいくつかの優れたプロパティが失われます。

let f (a:int) = 

与えるDuplicate definition of 'f'

F# には静的に解決された型パラメーターがありますが、これをどのように使用できるかわかりません..

let f (a:^T) =
    match T with

The value or constructor of T is not definedで与えますmatch T

let f (a:^T) =
    match a with
    | :> int as i -> 

与えるUnexpected symbol ':>' in expression

let f (a:^T) =
    match ^a with
    | :> int as i -> 

与えるUnexpected infix operator in expression

4

1 に答える 1

4

型ごとに異なる動作をする、通常の F# 関数である関数を作成する場合は、静的メンバー制約を使用してそれを実行できます。ただし、慣用的な F# コードを記述したい場合は、他のオプションがあります。

  • 静的メンバー制約を使用してこれを行う方法を示す良い例を次に示します。

  • F# コレクションは、タイプごとに異なるモジュールを使用するためArray.mapList.mapSeq.mapなどがあります。これは、機能的な F# ライブラリの慣用的なスタイルです。

  • FSharpChartは、オーバーロードされたメソッドを使用するライブラリの例です。Chart.Line [ ... ]静的メソッドを使用できるため、記述して適切なオーバーロードを選択できることに注意してください。

  • 一般的な数値コードを書きたい場合は、このトピックをカバーするチュートリアルを最近書きました

そのため、静的制約を使用する前に少し注意が必要です。これは完全に慣用的なものではなく (標準ライブラリでは一般的に使用されていないなど)、混乱を招く可能性があります。しかし、それは非常に強力で、確かに便利です。

重要なのは、他の言語でうまく機能するパターンに従うだけでは、F# で最良の結果が得られない可能性があるということです。やろうとしていることの具体的な例を提供できれば、より良い結果が得られる可能性があります。

于 2013-08-21T19:35:14.067 に答える