我在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
但是我不明白它在这里的用法以及何时有人使用此修复功能?
答案 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
的循环。