f#

f# - Undocumented `when` uso de palabras clave en FSharp.Core



(1)

Buscando información sobre los parámetros de tipo resueltos estáticamente para funciones en línea, me topé con las definiciones de varios operadores primitivos en FSharp.Core:

let inline (+) (x: ^T) (y: ^U) : ^V = CheckedAdditionDynamic<(^T),(^U),(^V)> x y when ^T : int32 and ^U : int32 = (# "add.ovf" x y : int32 #) when ^T : float and ^U : float = (# "add" x y : float #) // <snip> when ^T : ^T = ((^T or ^U): (static member (+) : ^T * ^U -> ^V) (x,y))

Como se puede ver en el fragmento de código de arriba, when palabra clave se usa en el formato de: when expr1 = expr2 para varios tipos incorporados. Supongo que esto es una especie de compilador equivalente a "si T = int usa opcode add.ovf, de lo contrario si ..., si no lo hace".

Sin embargo, no pude encontrar una sola referencia / explicación para este tipo de sintaxis en la documentación de F #. ¿Podría alguien con algún conocimiento interno de F # explicar lo que está pasando en el fragmento de arriba?


El usuario Carsten ha proporcionado el siguiente comentario a esta respuesta, ya que considera que es incorrecto.

El problema es que, when usa tal como está aquí, no tiene nada que ver con los usos documentados (parece que se denomina optimización condicional estática y no debe usarse fuera de las bibliotecas principales). De hecho, continúe e intente usarlo. Verá que no puede hacerlo a menos que use los trucos mencionados en la respuesta de John (otra pregunta)

El usuario Carsten agregó un comentario adicional a esta respuesta:

Agregué un comentario. No creo que mi suposición basada valga la pena como una respuesta. Esperaba que uno de los informantes que andaban por ahí diera una respuesta oficial.

La respuesta a la que se hace referencia en el primer comentario de Carsten es del usuario John Palmer en abril de 2013, que enlaza con esta respuesta que proporcionó en la sintaxis (# ..... #) , ¿Qué es la sintaxis (# ... #) que se ve en F3? implementación de la biblioteca estándar?

Puede usar esto pero tiene que especificar los --compiling-fslib (no documentados) y --standalone en su código.

El usuario MisterMetaphor proporcionó una respuesta citando una publicación en un foro que decía lo siguiente:

IL incrustado en los códigos F #. ¿Esta característica es oficialmente compatible?

Realmente no. El propósito del 99.9% de esta función es para las operaciones definidas en FSharp.Core.dll (llamadas fslib.dll en 1.9.2.9 y anteriores).

Para otros usos de la palabra clave when vea lo siguiente.

Este documento de Microsoft describe el uso de la palabra clave when para condiciones adicionales de concordancia, Expresiones de coincidencia (F #) .

Este documento de Microsoft describe el uso de la palabra clave when para expresar restricciones para parámetros de tipo genérico, Restricciones (F #) .

También vea este documento de Microsoft que describe la coincidencia de patrones con la palabra clave when en varias configuraciones, Coincidencia de patrones (F #) .

El documento de coincidencia de patrones dice lo siguiente junto con varios ejemplos.

Los patrones son reglas para transformar los datos de entrada. Se utilizan en todo el lenguaje F # para comparar datos con una estructura o estructuras lógicas, descomponer datos en partes constituyentes o extraer información de datos de varias maneras.

El documento Match Expression dice lo siguiente junto con un ejemplo.

Puede usar una cláusula when para especificar una condición adicional que la variable debe cumplir para que coincida con un patrón. Tal cláusula se conoce como un guardia. La expresión que sigue a la palabra clave when no se evalúa a menos que se haga una coincidencia con el patrón asociado con esa guarda.