F#コンパイルエラー:予期しないタイプアプリケーション
-
02-10-2019 - |
質問
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>
所属していません StackOverflow