在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)
布莱什!有更好的方式吗?
答案 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 ...
任何显着长度的东西都可能是它自己的功能。