Answering your exact question, just unite those lines in a single let
block:
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:
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
. 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"