[英]Bind monadic variables over several functions
我对尽可能接近以下语法感兴趣。 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
我想以下是可以接受的
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 ()
但是注释行是不可接受的,因为let绑定只能继续进行。 我如何用锤子和胶带ghc敲击并允许我这样做?
编辑:
这是我确定的语法
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 ()
回答您的确切问题,只需将这些行合并为一个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 ()
另外,您可以使用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"
从上面的代码可以很容易地发现moof
实际上永远不会执行,因为在do
块中let a = b
只是a <- return b
moof
let a = b
的糖。 因此,我想您实际上的意图是:
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.