unidades tiempo resueltos problemas para niños medida longitud ejercicios conversion f# units-of-measurement

f# - tiempo - unidades de medida para niños



F#Unidades de medida, problemas con genéricos (2)

Puede cambiar el primer ''compilador no me gusta'' a

let mutable error_s : float<''a> = 0.0<_>

y al compilador parece gustarle eso.

En cuanto a la segunda pregunta, no veo el mismo error que tú, y esto

[<Measure>] type km //define a unit of measure let someFloatFn x = x + 1.2 //this is a function which takes ''vanilla'' floats let MapSeqToNonUnitFunction (x:seq<float<_>>) = Seq.map (float >> someFloatFn) x let testList = [ 1 .. 4 ] |> List.map float |> List.map ((*) 1.0<km>) let testList2 = testList :> seq<_> let result = MapSeqToNonUnitFunction testList2 printfn "%A" result

compila para mí (aunque el upcast to seq <_> es un poco molesto, no estoy seguro si hay una manera fácil de deshacerse de él o no).

Además, creo que la convención es nombrar los parámetros de unidades ''u,'' v, ... en lugar de ''a,'' b, ...

( Todavía estoy golpeando con unidades de medida en F #)

Tengo un problema al hacer funciones ''genéricas'' que toman flotadores ''tipeados''.

La siguiente clase de maqueta está destinada a mantener las pestañas en un error acumulado en la posición, en función de un factor ''c''. Al compilador no le gusta que diga 0. <''A> en el cuerpo del tipo ("parámetro de tipo inesperado en literal de unidad de medida").

///Corrects cumulative error in position based on s and c type Corrector(s_init:float<''a>) = let deltaS ds c = sin (ds / c) //incremental error function //mutable values let mutable nominal_s = s_init let mutable error_s = 0.<''a> //<-- COMPILER NO LIKE ///Set new start pos and reset error to zero member sc.Reset(s) = nominal_s <- s error_s <- 0.<''a> //<-- COMPILER NO LIKE ///Pass in new pos and c to corrector, returns corrected s and current error member sc.Next(s:float<''a>, c:float<''a>) = let ds = s - nominal_s //distance since last request nominal_s <- s //update nominal s error_s <- error_s + (deltaS ds c) //calculate cumulative error (nominal_s + error_s, error_s) //pass back tuple

Creo que otra pregunta relacionada todavía tiene que ver con las funciones "genéricas".

En el siguiente código, lo que intento hacer es crear una función que tome un #seq de cualquier tipo de flotantes y aplicarlo a una función que solo acepte flotantes ''vainilla''. La tercera línea da un error de '' Restricción de valor '', y no veo ninguna salida. (Eliminar el # resuelve el problema, pero me gustaría evitar tener que escribir lo mismo para listas, secuencias, matrices, etc.)

[<Measure>] type km //define a unit of measure let someFloatFn x = x + 1.2 //this is a function which takes ''vanilla'' floats let MapSeqToNonUnitFunction (x:#seq<float<''a>>) = Seq.map (float >> someFloatFn) x let testList = [ 1 .. 4 ] |> List.map float |> List.map ((*) 1.0<km>) MapSeqToNonUnitFunction testList