solución solucion raíces raiz raices radicales khan ecuaciones cuadrada con como academy math f# functional-programming units-of-measurement

math - solucion - solución de raíces



Raíces cuadradas seguras para la unidad (2)

@kvb tiene razón, más generalmente:

Si tiene un algoritmo que no sea de unidad consciente (por ejemplo, escriba ''raíz de cubo'') y desea colocar unidades en él, puede envolver el algoritmo en una función con la firma de tipo correcta y usar, por ejemplo, "flotar" en '' descarta las unidades a medida que ingresan y el enfoque de box y downcast para ''agregar'' las unidades apropiadas en el camino de salida.

En la versión RTM (después de Beta2), F # tendrá funciones de biblioteca primitivas para las ''unidades de adición'', ya que el enfoque de caja y descarga es actualmente un truco para superar la falta de estas primitivas en el lenguaje / biblioteca .

Me preguntaba cómo es posible escribir una función de raíz cuadrada (sqrt) definida por el usuario de forma que interactúe correctamente con el sistema de unidades de F #.

Cómo debería ser:

let sqrt (x : float<''u ^ 2>) = let x'' = x / 1.0<''u ^ 2> // Delete unit (x ** 0.5) * 1.0<''u> // Reassign unit

Pero esto no se permite debido a que las constantes distintas de cero no pueden tener unidades genéricas .

¿Hay alguna manera de escribir esta función? Con el sqrt incorporado funciona bien, entonces, ¿qué magia hace?


Permitir constantes genéricas distintas de cero haría muy fácil romper la seguridad del sistema de tipos para las unidades (véanse los documentos de Andrew Kennedy). Creo que la respuesta a su última pregunta es que sqrt es de hecho magia en algún sentido en el sentido de que no debería ser posible definir una función paramétrica con esa firma de tipo a través de medios normales. Sin embargo, es posible hacer lo que quiera (al menos en la versión actual de F #) aprovechando el boxeo y el casting:

let sqrt (x : float<''u^2>) = let x'' = (float x) ** 0.5 (* delete unit and calculate sqrt *) ((box x'') :?> float<''u>)