Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops 函数式编程中的无限循环? 我在想:在函数式编程中可以实现无限循环吗_Loops_Recursion_Functional Programming - Fatal编程技术网

Loops 函数式编程中的无限循环? 我在想:在函数式编程中可以实现无限循环吗

Loops 函数式编程中的无限循环? 我在想:在函数式编程中可以实现无限循环吗,loops,recursion,functional-programming,Loops,Recursion,Functional Programming,示例:当使用windows API获取windows消息时,它通常在循环中实现 我知道有可能使函数无限期地进入递归。我预计这将导致堆栈溢出 无限循环是函数式编程的错误思维吗 是操作系统的接口还是硬件的问题 在我看来,一个功能性程序/o.s.似乎无法自行运行 我有一点编写函数式程序的经验,但这一直困扰着我。 请分享您对这些问题的想法/见解如果您的编译器认识到这一点,您可以拥有无限。某些语言,例如scheme,要求编译器识别尾部递归,并且不为其分配堆栈空间 编辑我并不想不同意其他答案,但“无限”

示例:当使用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的某些子集,并对无法证明终止或进展的代码发出警告。

尝试谷歌搜索“尾部递归”。谢谢大家的输入。我不认为函数式编程可以摆脱无限递归(很高兴知道)。感谢您提供的信息和您的见解。我喜欢反应式编程的想法。举个例子来说明为什么你会这么做:程序的核心通常最好表现为世界状态中潜在的无限变换序列(例如,吃豆人即将吃到药丸,吃豆人已经吃到药丸,等等)。在我的经验中,这也是无限循环最常见的情况。