Loops 函数式编程中的无限循环? 我在想:在函数式编程中可以实现无限循环吗
示例:当使用windows API获取windows消息时,它通常在循环中实现 我知道有可能使函数无限期地进入递归。我预计这将导致堆栈溢出Loops 函数式编程中的无限循环? 我在想:在函数式编程中可以实现无限循环吗,loops,recursion,functional-programming,Loops,Recursion,Functional Programming,示例:当使用windows API获取windows消息时,它通常在循环中实现 我知道有可能使函数无限期地进入递归。我预计这将导致堆栈溢出 无限循环是函数式编程的错误思维吗 是操作系统的接口还是硬件的问题 在我看来,一个功能性程序/o.s.似乎无法自行运行 我有一点编写函数式程序的经验,但这一直困扰着我。 请分享您对这些问题的想法/见解如果您的编译器认识到这一点,您可以拥有无限。某些语言,例如scheme,要求编译器识别尾部递归,并且不为其分配堆栈空间 编辑我并不想不同意其他答案,但“无限”
- 无限循环是函数式编程的错误思维吗
- 是操作系统的接口还是硬件的问题
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
mainloop::Handle->Handle->IO()
主回路输入输出=
如果使用ineof,则可以有效地进行迭代,如for/while循环。因此,我想您可以有一个无限循环,而不会出现堆栈溢出
对于您的问题:“无限循环是函数式编程的错误思维模式吗?”也许这会有所帮助:
-正如其他人所说的,一个无限循环是可能的
例如,loop()
将有效地作为一个无限循环运行(在恒定的堆栈空间中),因为编译器可以在最后优化loop
的尾部递归调用
let loop() = do {
println("foo")
loop()
}
但是
无限循环是函数式编程的错误思维吗
还是有道理。考虑无限循环的Windows API示例。那根本不是功能性的。记住——功能性意味着用价值观(以及它们的含义)来思考。因此,我们更愿意采用这样的反应式/基于事件的方法[伪功能代码]
(onClick form1)
|> Event.subscribe (\pt-> do { print $ "I was clicked at " ++ (show pt) })
所以
在我看来,一个功能性程序/o.s.似乎无法自行运行
这在技术上是错误的——您可以实现无限循环——但这样做通常没有(功能)意义。除了某种IO轮询之外,为什么还需要它呢?以纯函数的方式转换值应该是有意义的。函数式编程中“无限循环”的大多数(如果不是全部的话)都可以通过以下方式建模。到目前为止,其他的答案都指向一般的递归,但不受限制地使用递归可以说是一种糟糕的方法,因为它可能导致结构不良的代码
纯函数程序中的绝大多数代码都应该在整个子集中编写,即使用结构递归或协同递归(确保终止和进行)等模式,而不是退回到一般递归。希望GHC的未来版本将直接支持检测Haskell的某些子集,并对无法证明终止或进展的代码发出警告。尝试谷歌搜索“尾部递归”。谢谢大家的输入。我不认为函数式编程可以摆脱无限递归(很高兴知道)。感谢您提供的信息和您的见解。我喜欢反应式编程的想法。举个例子来说明为什么你会这么做:程序的核心通常最好表现为世界状态中潜在的无限变换序列(例如,吃豆人即将吃到药丸,吃豆人已经吃到药丸,等等)。在我的经验中,这也是无限循环最常见的情况。