Estoy intentando utilizar explicit member constraints en F #. La documentación dice "F # admite el conjunto completo de restricciones que admite el tiempo de ejecución de lenguaje común", pero si realmente compilo una clase con una restricción tan explícita, como la siguiente, obtengo un error bastante exótico.F # restricciones explícitas de miembro: La variable de tipo^T no se puede generalizar porque escaparía de su alcance
type MyType<'T when ^T: (static member (+) : ^T * ^T -> ^T)> =
member this.F a b = a + b
informa
FS0670 de error: Este código no es lo suficientemente genérico. La variable de tipo^T cuando^T: (miembro estático (+):^T *^T ->^T) no podría generalizarse porque escaparía a su alcance.
Y lo informa en el sitio de definición member this.F
. ¿Qué significa esto? ¿Cuál es el alcance relevante?
Hay una serie de enfoques compatibles con el lenguaje para hacer este tipo de trabajo. Se puede encontrar una buena exploración en here on StackOverflow, pero no he visto una explicación clara de por qué esta restricción genérica particular no puede 'escapar'.
Casi nunca es necesario especificar las restricciones de los miembros explícitamente. El compilador lo infiere (como en el ejemplo de wmeyer). – Daniel
La idea clave es que las restricciones explícitas de los miembros son una característica del compilador, no del tiempo de ejecución. Los documentos son correctos: F # admite todas las restricciones de CLR, pero el compilador admite aún más. – Daniel