signos signo segundo quinto que primer para niños menos mayor matematicas mas los imprimir igual grado enseñar ejercicios ejemplos como codigo f# delegates

f# - signo - ¿Qué hace que FSharpFunc<> sea más rápido que Func<>?



signo mayor o igual ≤ en el codigo ascii (2)

Tengo curiosidad por las mejoras de rendimiento que se han realizado para FSharpFunc <>. ¿Es el hecho de que no contiene delegados múltiples, por lo que no hay necesidad de recorrer todas las referencias al disparar una llamada de función? Algo más ?


(Creo que ahora se llaman FSharpFunc lugar de FastFunc ).

Se representa como un tipo con un solo método abstracto (Invocar), que creo que evita algunos de los gastos generales que se obtienen con los verdaderos delegados. Y para múltiples parámetros al curry, le permite llamar con todos los parámetros ''a la vez'' en lugar de uno por uno (por ejemplo, para que se pueda invocar a fxy en el CLR como f(x,y) lugar de f(x)(y) .

¿Hay algo mas? No recuerdo ahora mismo. Puede consultar el código fuente en prim-types.fs en FSharp.Core en la distribución de origen que viene con la versión CTP.


Creo que la principal motivación para usar FSharpFunc<> lugar de Func<> o cualquier otro delegado es que no puede crear una clase que heredaría de un tipo de delegado (al principio, esto suena razonable, pero en .NET, el delegado es en realidad solo una clase especial, por lo que en principio puede ser posible permitir esto). ¿Por qué se necesita esto?

Si escribe una función en F #, entonces se trata (en un número relativamente reducido de casos, pero bastante importantes) en forma de curry. Por ejemplo, int -> int -> int es en realidad un tipo de función int -> (int -> int) (currying significa que escribe una función usando solo funciones de un solo parámetro - si la llama con el primer argumento, obtener una función como resultado y puede invocar la función devuelta con el segundo argumento).

Si F # usara delegados, el tipo sería algo como Func<int, Func<int, int>> . Como mencionó Brian, la invocación fxy se traduciría en dos invocaciones: f(x)(y) . Sin embargo, este tipo de invocación es el más común (la especificación de un solo argumento se llama aplicación de función parcial ). Entonces, cuando F # compila una función como esta, crea una clase heredada con un método de invocación optimizado, para que pueda invocarse como f.Invoke(x, y) :

class @some_F#_name@ : Func<int, Func<int, int>> { public int Invoke(int arg1, int arg2) { /* optimized call */ } }

Desafortunadamente, no es posible crear dicha clase heredando de Func estándar (porque es un delegado), por lo que F # tiene que declarar su propio tipo que se puede usar como una clase base ...