F # errore di compilazione: tipo di applicazione imprevisto
-
02-10-2019 - |
Domanda
In F #, data la seguente classe:
type Foo() =
member this.Bar<'t> (arg0:string) = ignore()
Perché il seguente compilazione:
let f = new Foo()
f.Bar<Int32> "string"
Mentre il seguente non verrà compilato:
let f = new Foo()
"string" |> f.Bar<Int32> //The compiler returns the error: "Unexpected type application"
Soluzione
Sembra che fornire parametri di tipo quando il metodo trattare come un valore prima classe non è supportata. Ho controllato il F # specifica e qui sono alcuni pezzi importanti:
14.2.2 Articolo-Qualificato Lookup
[Se l'espressione applicazione inizia con:]
<types>
expr , quindi utilizzare<types>
come argomenti di tipo eexpr
come espressione argomento.- expr , quindi utilizzare expr come l'argomento di espressione.
- altrimenti utilizzare alcun argomento espressione o digitare argomenti.
- Se il [Metodo] è etichettato con il attributo
RequiresExplicitTypeArguments
poi argomenti di tipo esplicite deve avere stato dato.
Se si specifica argomenti di tipo e gli argomenti, quindi il primo caso si applica, ma come si può vedere, la specifica richiede alcuni argomenti attuali troppo. Io non sono abbastanza sicuro che cosa è la motivazione alla base di questo, però.
In ogni caso, se si utilizza il parametro di tipo in qualsiasi parte del tipo di firma degli Stati, allora è possibile specificarlo utilizzando le annotazioni di tipo simile a questo:
type Foo() =
member this.Bar<´T> (arg0:string) : ´T =
Unchecked.defaultof<´T>
let f = new Foo()
"string" |> (f.Bar : _ -> Int32)
D'altra parte, se non si utilizza il parametro di tipo in qualsiasi punto della firma, allora io non sono del tutto sicuro perché è necessario in primo luogo. Se ne avete bisogno solo di un po 'di elaborazione runtime, allora si può essere in grado di prendere la rappresentazione tipo di runtime come argomento:
type Foo() =
member this.Bar (t:Type) (arg0:string) = ()
let f = new Foo()
"string" |> f.Bar typeof<Int32>