如何理解/使用Haskell修复功能

时间:2018-09-18 16:46:31

标签: haskell

我在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

但是我不明白它在这里的用法以及何时有人使用此修复功能?

1 个答案:

答案 0 :(得分:5)

dbms_lob.read(str, amount, 1, self.str);是用于实现递归的基本工具。总是可以用递归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的循环。