8

次のようなクラスを作成しようとすると

type MyType () =
    let func<'T> () = ()

コンパイラはエラーがあると言っています:

明示的な型パラメーターは、モジュールまたはメンバーのバインディングでのみ使用できます

しかし、MSDNは次のように述べています。

モジュールレベル、型、または計算式でのletバインディングは、明示的な型パラメーターを持つことができます。関数定義内などの式のletバインディングは、型パラメーターを持つことができません。

ドキュメントとコンパイラが異なることを言うのはなぜですか?

4

2 に答える 2

5

letこれは、クラス内のバインディングに対する構文上の制限のようです。ただし、ジェネリックローカル関数を定義することはできます。型アノテーションで型パラメーターを指定するだけです。

type MyType () =
   let func (x : 'T) : 'T = x

仕様ではクラス定義が次の構造を持っていると規定されているため、これが仕様によって明示的に構文的に禁止されているとは思いません。

type type-name patopt as-defnopt =
      class-inherits-decl opt
      class-function-or-value-defns opttype -
      defn-elements

class-or-value-defnは次のように定義されます。

class-function-or-value-defn:=属性opt staticopt let recoptfunction -or-value-defns

ここで、function-or-value-defnsは、明示的な型パラメーターを持つ関数定義です。

function-defn:=
inlineopt accessopt ident-or-op typar-defns opt arguments-pats return-typeopt = expr

于 2012-11-15T11:42:50.903 に答える
3

Tomasの答えに追加するには、タイプパラメータが必要であるが、そのタイプの値がない場合は、ファントムタイプパラメータを持つタイプを使用できます。例えば:

open System

type Foo() =
    member x.PrintType<'T> () = printfn "%s" typeof<'T>.Name

type TypeParameter<'a> = TP

let foo = Foo ()

let callFoo (typeParameter : TypeParameter<'a>) =
    foo.PrintType<'a> ()

callFoo (TP : TypeParameter<string>)
callFoo (TP : TypeParameter<DateTime>)
于 2015-09-02T05:40:20.917 に答える