[英]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.