首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Haskell do块中如何允许表达式

在Haskell do块中如何允许表达式
EN

Stack Overflow用户
提问于 2017-07-30 19:59:06
回答 1查看 632关注 0票数 2

在下面的代码第4行中,有一个表达式夹在do块中的两个IO操作之间:

代码语言:javascript
复制
  1 doubleX :: (Show x, Num x) => x -> IO ()                                                                                                                                                                                          
  2 doubleX x = do                                                                                                                                                                                                                    
  3   putStrLn ("I will now double " ++ (show x))                                                                                                                                                                                     
  4   let double = x * 2                                                                                                                                                                                                              
  5   putStrLn ("The result is " ++ (show double))

我理解do表示法是使用>>=或>>将一元操作链接在一起。但是,当你在中间有一个表达式时,它是如何工作的呢?您不能仅仅使用>>将3-5行粘合在一起。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-30 20:06:51

我将从我非常相似的答案这里 (虽然可能不是一个重复的问题,因为这个问题没有明确地处理let)。

报告提供了从do语法到内核Haskell的完整翻译;与您的问题相关的部分如下:

do {e} =e do {e;stmts} =e >> } do {stmts} do {let decls;stmts} = let decls in do {stmts}

所以你的代码像这样:

代码语言:javascript
复制
doubleX x = do                                                                                                                                                                                                                    
  putStrLn ("I will now double " ++ (show x))                                                                                                                                                                                     
  let double = x * 2                                                                                                                                                                                                              
  putStrLn ("The result is " ++ (show double))

==> do {e;stmts} rule

doubleX x =
  putStrLn ("I will now double " ++ (show x)) >> do
  let double = x * 2                                                                                                                                                                                                              
  putStrLn ("The result is " ++ (show double))

==> do {let decls; stmts} rule

doubleX x =
  putStrLn ("I will now double " ++ (show x)) >>
  let double = x * 2 in do
  putStrLn ("The result is " ++ (show double))

==> do {e} rule

doubleX x =
  putStrLn ("I will now double " ++ (show x)) >>
  let double = x * 2 in
  putStrLn ("The result is " ++ (show double))
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45404126

复制
相关文章

相似问题

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