Pregunta

En F #, dada la siguiente clase:

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

¿Por qué la siguiente compilación:

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

Mientras que el siguiente no se compilará:

let f = new Foo()
"string" |> f.Bar<Int32> //The compiler returns the error: "Unexpected type application"
¿Fue útil?

Solución

Parece que el suministro de parámetros de tipo cuando no se admite método de tratamiento como un valor de primera clase. Comprobé el F # especificación y aquí son algunos bits importantes:

14.2.2 artículo Calificado de búsqueda
[Si la expresión de solicitud comienza con:]

  • <types> expr , a continuación, utilizar <types> como los argumentos de tipo y expr como la expresión argumento.
  • expr , a continuación, utilizar expr según el argumento de expresión.
  • de lo contrario usar ningún argumento expresión o escribir argumentos.
  • Si el [método] se etiqueta con el atributo RequiresExplicitTypeArguments entonces argumentos de tipo explícitas debe tener ha dado.

Si especifica argumentos de tipo y argumentos, a continuación, se aplica el primer caso, pero como se puede ver, la especificación requiere algunos argumentos reales también. No estoy muy seguro de lo que es la motivación detrás de esto, sin embargo.

De todos modos, si se utiliza el parámetro de tipo en cualquier lugar en la declaración de tipo de la pieza, a continuación, se puede especificar que el uso de anotaciones de tipo siguiente:

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

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

Por otro lado, si no se utiliza el parámetro cualquier tipo en la firma, entonces yo no estoy muy seguro de por qué lo necesita, en primer lugar. Si lo necesita sólo para algún tipo de procesamiento en tiempo de ejecución, entonces usted puede ser capaz de tomar la representación de tipo en tiempo de ejecución como un argumento:

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

let f = new Foo() 
"string" |> f.Bar typeof<Int32>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top