首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >抛出异常w/ `forever`?

抛出异常w/ `forever`?
EN

Stack Overflow用户
提问于 2016-05-20 11:15:10
回答 1查看 121关注 0票数 1

看着forever

代码语言:javascript
复制
λ: import Control.Monad
λ: :t forever
forever :: Monad m => m a -> m b

为什么forever $ Just 42会在几秒钟后抛出异常?

代码语言:javascript
复制
λ: forever $ Just 42
*** Exception: <<loop>>

但是forever $ return 4没有(至少在几秒钟后)?

代码语言:javascript
复制
λ: forever $ return 4
^C^C^C^Z
[1]+  Stopped                 ghci
EN

回答 1

Stack Overflow用户

发布于 2016-05-28 11:42:40

为了不深入到实现的细节(我并不完全熟悉),我将转而解释为什么这种行为是可取的,以及它来自哪里。

forever被定义为

代码语言:javascript
复制
forever x = do
    x
    forever x

这相当于

代码语言:javascript
复制
forever x = x >> forever x

所以如果我们看一下

代码语言:javascript
复制
fr x = forever (return x)

我们有

代码语言:javascript
复制
fr x = forever (return x)
     = return x >> forever (return x)
     = return x >>= \_ -> fr x
     = (\_ -> fr x) x
     = fr x

所以,基本上,fr x是一个无限循环。

现在在Haskell中,无限循环和错误是相同的。以下是error的一种可能实现

代码语言:javascript
复制
error s = error s

现在,GHC选择区分这两种类型的循环。

纯代码中的无限循环是错误的。一般来说,我们并不打算输入一个值,我们正在寻找一个值,而不是副作用。因此,在Maybe中,无限循环以错误结束。

然而,在有效的代码中无限循环是很常见的!代码可能在等待机器上发生的其他事情,或者用户输入,或者其他什么。

所以在IO中,我们有一个实际的无限循环,一个有意义的循环。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37337369

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档