看着forever
λ: import Control.Monad
λ: :t forever
forever :: Monad m => m a -> m b为什么forever $ Just 42会在几秒钟后抛出异常?
λ: forever $ Just 42
*** Exception: <<loop>>但是forever $ return 4没有(至少在几秒钟后)?
λ: forever $ return 4
^C^C^C^Z
[1]+ Stopped ghci发布于 2016-05-28 11:42:40
为了不深入到实现的细节(我并不完全熟悉),我将转而解释为什么这种行为是可取的,以及它来自哪里。
forever被定义为
forever x = do
x
forever x这相当于
forever x = x >> forever x所以如果我们看一下
fr x = forever (return x)我们有
fr x = forever (return x)
= return x >> forever (return x)
= return x >>= \_ -> fr x
= (\_ -> fr x) x
= fr x所以,基本上,fr x是一个无限循环。
现在在Haskell中,无限循环和错误是相同的。以下是error的一种可能实现
error s = error s现在,GHC选择区分这两种类型的循环。
纯代码中的无限循环是错误的。一般来说,我们并不打算输入一个值,我们正在寻找一个值,而不是副作用。因此,在Maybe中,无限循环以错误结束。
然而,在有效的代码中无限循环是很常见的!代码可能在等待机器上发生的其他事情,或者用户输入,或者其他什么。
所以在IO中,我们有一个实际的无限循环,一个有意义的循环。
https://stackoverflow.com/questions/37337369
复制相似问题