如何避免使用符号中的多余变量?

时间:2014-08-14 18:11:50

标签: haskell do-notation

在Haskell do-notation块中说,我希望变量is_root表明我是否是root:

import System.Posix.User
main = do
    uid <- getRealUserID
    is_root <- return $ uid == 0

令人讨厌的uid变量仅用于那个地方。我希望我能写下这个:

main = do
    is_root <- getRealUserID == 0

但当然不会编译。

如何摆脱像uid这样多余的变量?这是我提出的最好的:

import System.Posix.User
main = do
    is_root <- getRealUserID >>= return . ((==) 0)

布莱什!有更好的方式吗?

2 个答案:

答案 0 :(得分:23)

一种方法是

fmap (== 0) getRealUserID

答案 1 :(得分:6)

(我假设您的目标是限制uid的范围,而不仅仅是为了自己的目的而无缘点)

在这样的简单案例中,@pdw's answer可能是要走的路。来自<$>的运营商<*>Control.Applicative在这里特别有帮助。

foo = do
  are_same <- (==) <$> doThis <*> doThat

在稍微复杂的情况下,您可以使用嵌套 - do

complicatedEq :: This -> That -> IO Bool

main = do
  are_same <- do
    this <- doThis
    that <- doThatBasedOn this
    complicatedEq this that
  ... rest ...

任何显着长度的东西都可能是它自己的功能。