Estoy tratando de implementar una función de temporizador genérica en OCaml que tendrá como entrada una función de aridad arbitraria y tipo 'r volver y devuelve una función con:temporizador genérica en OCaml
- la misma aridad y los tipos de parámetros de entrada , y
- retorno tipo
float * 'r
donde el flotador sería una métrica del tiempo pasado en la función (por ejemplo reportado porSys.time()
)
El problema es que no puedo implementarlo de forma que pueda manejar funciones de cualquier tipo. P.ej. el siguiente código:
let timer f = let timerf x y = let t0 = Sys.time() in let result = f x y in let diff = Sys.time() -. t0 in diff, result in timerf
funciona sólo con funciones de aridad de entrada 2. No es obvio para mí cómo generalizar que para manejar las funciones de cualquier aridad. Esperaba que las aplicaciones de función parcial de alguna manera mágicamente resolverían el enigma, pero no puedo hacerlo funcionar.
Si sabes que la función no hace nada interesante cuando se aplica parcialmente (como la mayoría de las funciones), entonces ni siquiera necesitas la abstracción. Es suficiente llamar 'timer (g x1 x2 ... xN-1) xN'. –
@AndreasRossberg: Gracias, incorporé su punto en mi respuesta. – pad