【问题标题】:How to understand/use Haskell fix function [duplicate]如何理解/使用 Haskell 修复功能 [重复]
【发布时间】:2019-02-22 18:20:50
【问题描述】:

我在xmonad 包中看到以下代码:

-- | Ignore SIGPIPE to avoid termination when a pipe is full, and SIGCHLD to
-- avoid zombie processes, and clean up any extant zombie processes.
installSignalHandlers :: MonadIO m => m ()
installSignalHandlers = io $ do
    installHandler openEndedPipe Ignore Nothing
    installHandler sigCHLD Ignore Nothing
    (try :: IO a -> IO (Either SomeException a))
      $ fix $ \more -> do
        x <- getAnyProcessStatus False False
        when (isJust x) more
    return ()

看来fix这个函数来自Data.Function

但我不明白它是如何在这里使用的,什么时候有人会使用这个修复功能?

【问题讨论】:

    标签: haskell fixpoint-combinators


    【解决方案1】:

    fix 是用于实现递归的基本工具。它总是可以被递归的let 替换——反之亦然,递归的let 可以变成对fix 的调用。在这个例子中,

    fix $ \more -> do
        x <- getAnyProcessStatus False False
        when (isJust x) more
    

    等价于

    let more = do
            x <- getAnyProcessStatus False False
            when (isJust x) more
    in more
    

    实际上是在实现一个循环调用getAnyProcessStatus False False,直到它返回Nothing

    【讨论】:

    • 解释得很漂亮。谢谢。所以more 这是一个虚拟变量,对吧?只在人们想要循环的时候使用?这个用例可以有循环计数器吗?
    • @osager 当然,计数器是可能的。
    猜你喜欢
    • 1970-01-01
    • 2019-09-15
    • 2020-09-17
    • 2018-03-06
    • 2014-10-18
    • 1970-01-01
    • 2011-12-20
    • 2019-08-03
    • 1970-01-01
    相关资源
    最近更新 更多