函数式编程中的无限循环?

sym*_*ont 8 recursion loops functional-programming

  • 我想知道:在函数式编程中可以完成无限循环吗?

示例:当使用Windows API获取Windows消息时,通常在循环中实现.

我知道有可能创建一个将无限期地进入递归的函数.我希望这会导致堆栈溢出.

  • 无限循环错误的功能编程思维定势?

  • 是操作系统的接口还是硬件的问题?

在我看来,功能程序/操作系统似乎不能单独运行

我在编写功能程序方面有一点经验,但这一直困扰着我.请分享您对这些问题的想法/见解

Joh*_*hnB 5

如果使用尾递归,则实际上有一个迭代,就像for/while循环一样.因此,我猜你可以有一个无限循环而不会出现堆栈溢出.

对于你的问题:"无限循环错误的功能编程心态?" 也许这会有所帮助: - 在F#中使用或Tail Recursion,什么时候使用?


Dar*_*rio 5

正如其他人所发布的,通过尾递归可以实现无限循环。

例如,将有效地作为无限循环运行(在恒定的堆栈空间中),因为编译器可以优化最后的loop()尾递归调用。loop

let loop() = do {
  println("foo")
  loop()
}
Run Code Online (Sandbox Code Playgroud)

对于函数式编程来说,无限循环是错误的思维模式吗?

还是有道理的。考虑带有无限循环的 Windows-API 示例。那根本就不是功能性的。请记住 - 功能性意味着思考价值观(及其含义)。因此,人们宁愿采用像[伪功能代码]这样的反应式/基于事件的方法

  (onClick form1)
|> Event.subscribe (\pt-> do { print $ "I was clicked at " ++ (show pt) })
Run Code Online (Sandbox Code Playgroud)

所以

在我看来,功能性程序/操作系统无法自行继续运行

从技术上讲是错误的 - 您可以实现无限循环 - 但这样做通常没有(功能)点。除了某种 IO 轮询之外,为什么还需要它?以纯粹功能性的方式转换价值观应该是有意义的。