Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 在多个函数上绑定一元变量_Haskell_Dsl_Template Haskell - Fatal编程技术网

Haskell 在多个函数上绑定一元变量

Haskell 在多个函数上绑定一元变量,haskell,dsl,template-haskell,Haskell,Dsl,Template Haskell,我对尽可能接近以下语法感兴趣。这对我来说很好 bootapplication :: IO () bootapplication = do clientA <- newChan :: IO (Chan AMsg) clientB <- newChan :: IO (Chan BMsg) ... magicHappens doSomething :: SomeSortaMonadTOnIO () doSomething = do writeChan clientA

我对尽可能接近以下语法感兴趣。这对我来说很好

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
bootapplication::IO()
bootapplication=do

clientA回答您的确切问题,只需将这些行组合成一个
块:

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 ()

从上面的代码很容易看出
moof
实际上永远不会执行,因为
let a=b
do
块中对
a来说只是一种糖分,我的意思是所有的函数看起来都更像moof,所以我不能真正将它们移开。但是,let可以绑定多个这样的东西,这很酷。好的,那么有没有办法让第一个代码段中的let块中的内容不被占用?这是我的最终目标。@Evan这些是语言的语法规则,你无法回避。但我认为你甚至不需要担心,因为你的问题中有一些基本的错误。请参阅我答案的更新。我对该片段的执行方式不太感兴趣。这只是为了展示我感兴趣的语法。
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 ()
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 ()
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"
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"