質問

F#で、次のクラスが与えられます。

type Foo() =
    member this.Bar<'t> (arg0:string) = ignore()

なぜ次のコンパイルがあるのですか:

let f = new Foo()
f.Bar<Int32> "string"

以下はコンパイルされませんが、

let f = new Foo()
"string" |> f.Bar<Int32> //The compiler returns the error: "Unexpected type application"
役に立ちましたか?

解決

方法をファーストクラスの値として扱うときにタイプパラメーターを提供することはサポートされていないようです。私はチェックしました F#仕様 そして、ここにいくつかの重要なビットがあります:

14.2.2アイテム資格のあるルックアップ
アプリケーション式が始まる場合:

  • <types> expr, 、使用します <types> タイプの引数として expr 表現の引数として。
  • expr, 、次に、exprを式の引数として使用します。
  • それ以外の場合は、表現の引数またはタイプの引数を使用しません。
  • 方法]ににラベルが付けられている場合 RequiresExplicitTypeArguments 属性次に、明示的なタイプの引数が与えられている必要があります。

タイプの引数と引数を指定すると、最初のケースが適用されますが、ご覧のとおり、仕様にも実際の引数が必要です。しかし、この背後にある動機が何であるかはよくわかりません。

とにかく、メンバーのタイプ署名の任意の場所でタイプパラメーターを使用する場合、次のようなタイプアノテーションを使用して指定できます。

type Foo() = 
  member this.Bar<´T> (arg0:string) : ´T = 
    Unchecked.defaultof<´T>

let f = new Foo()
"string" |> (f.Bar : _ -> Int32)

一方、署名のどこにもタイプパラメーターを使用しない場合、そもそもなぜ必要なのかよくわかりません。ランタイム処理のみに必要な場合は、ランタイムタイプの表現を引数として取得できる場合があります。

type Foo() = 
  member this.Bar (t:Type) (arg0:string) = ()

let f = new Foo() 
"string" |> f.Bar typeof<Int32>
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top