2013-05-23 3 views
1

가능한 한 다음 구문에 가깝게하고 싶습니다. 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() 

허용하지만하자 만 바인딩 향후 작품 때문에 주석 처리 된 줄이 수용 할 수없는 가정합니다. 나는 이것을 어떻게 할 수있게 해머와 덕트 테이프를 어떻게 할까?

편집 :

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를 사용할 수 있습니다

다음

내가 정확한 질문에 대답

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

답변

2

에 정착 구문은 단지 하나의 let 블록에 그 라인을 결합,이다 함수 정의를 저장하는 것이 더 일반적입니다. 예 :

moof 사실 결코이 실행되지 얻을 것이다 추적하기 쉽게 위의 코드에서
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" 

하는 do 블록 내부 let a = ba <- return 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" 
+0

나는 모든 기능이 moof처럼 보일 가능성이 높다는 것을 의미합니다. 그래서 나는 그걸 밖으로 움직일 수는 없습니다. 하지만, 여러 가지를 바인딩 할 수있게하는 것이 좋습니다. 자, 첫 번째 코드 세그먼트의 let 블록에 들여 쓰기를 취소 할 방법이 있습니까? 그것이 나의 궁극적 인 목표입니다. – Evan

+0

@Evan 이들은 언어의 통사론적인 규칙이다. 그러나 당신의 질문에 근본적인 실수가 있었기 때문에 걱정할 필요조차 없다고 생각합니다. 내 답변에 대한 업데이트를 참조하십시오. –

+0

나는 세그먼트가 어떻게 실행될 지에 대해별로 관심이 없었다. 내가 관심을 가졌던 구문을 보여 주기만하면되었다. – Evan