16

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

布莱赫!有没有更好的方法?

4

2 回答 2

23

一种方法是

fmap (== 0) getRealUserID
于 2014-08-14T18:15:16.250 回答
6

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

在像这样的简单情况下,@pdw 的答案可能是要走的路。运算符<$><*>fromControl.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 ...

任何很长的东西可能都应该成为它自己的功能。

于 2014-08-14T18:35:28.487 回答