永远的单子是如何工作的?
forever :: (Monad m) => m a -> m b
forever a = a >> forever a
如果我写
main = forever $ putStrLn "SAD, I DON'T UNDERSTAND!"
永远获取IO(),这不是函数,怎么永远重复调用putStrLn呢?
从定义forever
函数,可以看到它是一个标准的递归函数。
forever :: (Monad m) => m a -> m b
forever a = a >> forever a
那里没有发生任何魔法。forever
只是一个递归函数。在您的特定情况下,这是一个非终止的情况。但它是终止还是非终止取决于 Monad 是如何为该类型定义的。
检查类型>>
,我们得到:
λ> :t (>>)
(>>) :: Monad m => m a -> m b -> m b
从中你可以观察输入m a
只是被忽略了。另一种思考方式是>>
函数仅执行传递给它的第一个参数的副作用。在你的情况下m a
将对应于IO ()
因为那是类型putStrLn
.
由于IO形成了一个Monad,forever
函数也可以作用于IO
相关功能。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)