Su ejemplo contiene algunas cosas esto funcionaría de manera diferente en un lenguaje funcional:
- la clase es mutable - en los lenguajes funcionales, se utiliza un tipo inmutable
- Estás usando
current_time
para obtener la hora actual, pero esto no es una función pura (depende de algún estado de cambio global). En pure idiomas funcionales (Haskell), esto no está permitido (y debe usar mónadas), pero la mayoría de los lenguajes funcionales impuros (F #, OCaml) lo permiten.
- Su función
main
utiliza un bucle: los bucles generalmente se desaconsejan en los lenguajes funcionales (aunque algunos los admiten).
La solución # F idiomática sería tratar con el primer y el último punto de la siguiente manera:
let currentTime() =
System.DateTime.Now
type State(startTime) =
static member Start() =
State(currentTime())
member x.IsCompleted =
(currentTime() - startTime).TotalSeconds > 30.0
member x.Progress =
(currentTime() - startTime).TotalSeconds/30.0
let main() =
let s = State.Start()
let rec loop() =
if not s.IsCompleted then
printf "%A" s.Progress
loop()
loop()
printf "finished"
El tipo State
es inmutable en el sentido de que nunca cambia el valor de su ámbito local. No es puramente funcional, porque depende de la hora actual (cambiante), pero eso no es un problema en F # (solo tienes que ser consciente de eso).Si necesita algún método que modifique el estado (que no), el método devolverá una nueva instancia de State
(al igual que .NET string
).
La función main
está escrita usando recursion en lugar de un bucle, en este caso, realmente no importa (el bucle también estaría bien en F #). El punto de utilizar una recursión es que podría pasar el estado actual como argumento y usar una nueva instancia al hacer una llamada recursiva (que esencialmente cambia el estado actual durante el cálculo).
Ver también http://stackoverflow.com/questions/5773070/how-are-mutable-arrays-implemented-in-haskell y http://stackoverflow.com/questions/tagged/haskell+monads –