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"
È stato utile?

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 e expr 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>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top