loops - tiempo - ciclo infinito en la programación funcional?
for programacion (4)
- Me preguntaba: ¿se pueden hacer bucles infinitos en la programación funcional?
ejemplo: cuando se utiliza la API de Windows para obtener mensajes de Windows, por lo general se implementa en un bucle.
Sé que es posible realizar una función que continuará en la recursión indefinidamente. Espero que esto genere un desbordamiento de la pila.
¿El ciclo infinito es el modo de pensar equivocado para la programación funcional?
¿Es la interfaz del sistema operativo o el hardware el problema?
no me parece que un programa funcional / os pueda seguir corriendo solo
Tengo un poco de experiencia escribiendo programas funcionales, pero esto siempre me ha molestado. por favor comparta sus pensamientos / ideas sobre estos temas
Como otros han publicado, es posible un ciclo infinito a través de las repeticiones de cola .
Por ejemplo, loop()
se ejecutará efectivamente como un bucle infinito (en el espacio de pila constante) ya que el compilador puede optimizar la llamada de loop
recursiva al final.
let loop() = do {
println("foo")
loop()
}
Pero
¿El ciclo infinito es el modo de pensar equivocado para la programación funcional?
todavía tengo un punto. Considere su ejemplo de Windows-API con el bucle infinito. Eso es todo menos funcional. Recuerde: funcional significa pensar en valores (y lo que significan). Por lo tanto, uno preferiría adoptar un enfoque reactivo / basado en eventos como ese [código pseudo-funcional]
(onClick form1)
|> Event.subscribe (/pt-> do { print $ "I was clicked at " ++ (show pt) })
Asi que
no me parece que un programa funcional / os pueda seguir corriendo solo
es técnicamente incorrecto, puede implementar bucles infinitos, pero a menudo no hay un punto (funcional) al hacerlo. ¿Por qué debería uno necesitar eso a excepción de algún tipo de encuesta IO? Transformar los valores de una manera puramente funcional debería terminar siendo significativa.
Puede tener infinita recursividad de cola si su compilador lo reconoce. Algunos lenguajes, por ejemplo, el esquema, requieren que los compiladores reconozcan recursividad final y no le asignen espacio de pila.
Editar No me refiero a estar en desacuerdo con las otras respuestas, pero los bucles recursivos de cola "infinitos" son una expresión común para tratar con el mundo exterior. El siguiente ejemplo está tomado de Real World Haskell , y es representativo de la expresión idiomática.
mainloop :: Handle -> Handle -> IO ()
mainloop inh outh =
do ineof <- hIsEOF inh
if ineof
then return ()
else do inpStr <- hGetLine inh
hPutStrLn outh (map toUpper inpStr)
mainloop inh outh
En esencia, consideramos el mundo exterior como una corriente .
La mayoría, si no todos, los usos de "bucles infinitos" en la programación funcional pueden ser modelados por co-recursión . Otras respuestas hasta ahora han apuntado a la recursión general, pero el uso irrestricto de la recursión es posiblemente un enfoque deficiente, ya que puede conducir a un código mal estructurado.
La gran mayoría del código en un programa puramente funcional debe escribirse en el subconjunto total, es decir, usar patrones tales como recursión estructural o co-recursión (que aseguran la finalización y el progreso) en lugar de retroceder a la recursión general. Con suerte, las versiones futuras de GHC incluirán soporte directo para detectar algún subconjunto total de Haskell y emitir advertencias para el código que no se puede probar que finalice o avance.
Si usa recursividad de cola , efectivamente tiene una iteración, como un ciclo for / while. Por lo tanto, supongo que puedes tener un bucle infinito sin desbordamiento de pila.
A su pregunta: "¿el ciclo infinito es la configuración mental equivocada para la programación funcional?" tal vez esto ayude: - Mientras o Recursion de cola en F #, ¿qué usar cuando?