首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在do符号中避免多余的变量?

如何在do符号中避免多余的变量?
EN

Stack Overflow用户
提问于 2014-08-15 02:11:50
回答 2查看 554关注 0票数 16

比方说,在Haskell do-notation块中,我希望有一个变量is_root来表明我是否是根用户:

代码语言:javascript
复制
import System.Posix.User
main = do
    uid <- getRealUserID
    is_root <- return $ uid == 0

那个恼人的uid变量只在这一个地方使用。我希望我可以这样写:

代码语言:javascript
复制
main = do
    is_root <- getRealUserID == 0

但这当然不会编译。

怎样才能去掉像uid这样的多余变量?这是我想出的最好的:

代码语言:javascript
复制
import System.Posix.User
main = do
    is_root <- getRealUserID >>= return . ((==) 0)

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-08-15 02:15:16

一种方法是

代码语言:javascript
复制
fmap (== 0) getRealUserID
票数 23
EN

Stack Overflow用户

发布于 2014-08-15 02:35:28

(我假设你的目标是限制uid的作用域,而不仅仅是为了它本身的无关紧要)

在这种简单的情况下,@pdw's answer可能是最好的选择。Control.Applicative中的操作符<$><*>在这里特别有用。

代码语言:javascript
复制
foo = do
  are_same <- (==) <$> doThis <*> doThat

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

代码语言:javascript
复制
complicatedEq :: This -> That -> IO Bool

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

任何很长的东西可能都应该是它自己的函数。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25314793

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档