简体   繁体   English

在多个函数上绑定单子变量

[英]Bind monadic variables over several functions

I'm interested in getting as close as possible to the following syntax. 我对尽可能接近以下语法感兴趣。 TH is just fine by me. TH对我来说很好。

bootapplication :: IO ()
bootapplication = do
  clientA <- newChan :: IO (Chan AMsg)
  clientB <- newChan :: IO (Chan BMsg)
  ...
  magicHappens


doSomething :: SomeSortaMonadTOnIO ()
doSomething = do
  writeChan clientA aMsg
  writeChan clientB bMsg

I suppose the following is acceptable 我想以下是可以接受的

main = do
    clientA <- newChan :: IO (Chan [Char])
    clientB <- newChan :: IO (Chan Whatever)
    let a = putStrLn . (++) "a"
    let moof = do
--      b "hello"
        a "hi"
--      d "meh"
        readChan clientA
        return ()
    let b = putStrLn . (++) "b"
    let d = putStrLn . (++) "c" 
    return ()

But the commented lines are unacceptable since a let binding only works going forward. 但是注释行是不可接受的,因为let绑定只能继续进行。 How do I hammer and duct tape ghc into letting me do this? 我如何用锤子和胶带ghc敲击并允许我这样做?

Edit: 编辑:

Here's the syntax I settled on 这是我确定的语法

main = do
    clientA <- newChan :: IO (Chan [Char])
    clientB <- newChan :: IO (Chan Whatever)
    let {

a :: [Char] -> IO ()
;a = putStrLn . (++) "a"

;moof :: IO ()
;moof = do 
    a "a"
    b "b"

;b :: [Char] -> IO ()
;b = putStrLn . (++) "b"

;d :: [Char] -> IO ()
;d = putStrLn . (++) "c"


}
    moof
    return ()

Answering your exact question, just unite those lines in a single let block: 回答您的确切问题,只需将这些行合并为一个let块:

main = do
  clientA <- newChan :: IO (Chan [Char])
  clientB <- newChan :: IO (Chan Whatever)
  let 
    a = putStrLn . (++) "a"
    moof = do
      b "hello"
      a "hi"
      d "meh"
      readChan clientA
      return ()
    b = putStrLn . (++) "b"
    d = putStrLn . (++) "c" 
  return ()

Alternatively you can use where , which is more conventional to store function definitions in, as it is in your case: 另外,您可以使用where ,这是将函数定义存储where其中的更常规方法,具体情况如下:

main = do
  clientA <- newChan :: IO (Chan [Char])
  clientB <- newChan :: IO (Chan Whatever)
  let 
    moof = do
      b "hello"
      a "hi"
      d "meh"
      readChan clientA
      return ()
  return ()
  where
    a = putStrLn . (++) "a"
    b = putStrLn . (++) "b"
    d = putStrLn . (++) "c"

From the above code it's easy to trace that moof will in fact never get executed, because let a = b inside a do block is just a sugar for a <- return b . 从上面的代码可以很容易地发现moof实际上永远不会执行,因为在do块中let a = b只是a <- return b moof let a = b的糖。 So I guess what you intended in fact was the following: 因此,我想您实际上的意图是:

main = do
  clientA <- newChan :: IO (Chan [Char])
  clientB <- newChan :: IO (Chan Whatever)
  moof <- do
    b "hello"
    a "hi"
    d "meh"
    readChan clientA
    return ()
  return ()
  where
    a = putStrLn . (++) "a"
    b = putStrLn . (++) "b"
    d = putStrLn . (++) "c"

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM