2013-03-07 6 views
11

ghci에서 대화식으로 do 블록을 만들려고합니다.ghci의 do 블록 내에서 let을 어떻게 사용합니까?

Prelude>let a = do putStrLn "test"; putStrLn "other test" 
Prelude> 

하지만 대화 형으로 구문 분석 오류가없이 DO 블록에하자 건설을 정의하는 방법을 알아낼 수 없습니다 : :만큼 내가 블록에 변수를 정의하지 않는 한, 괜찮아

Prelude> let a = do let b = 5; putStrLn $ show b 

<interactive>:2:40: 
    parse error (possibly incorrect indentation or mismatched brackets) 

은 분명히

let a = do 
    let b = 5 
    putStrLn $ show b 

는 하스켈 소스 파일에서 완전히 괜찮습니다. 나는 ghci로 번역하는 방법을 알아내는 데 어려움을 겪고 있습니다.

답변

15

시도 :

ghci> let a = do {let b = 5; putStrLn (show b)} 

당신은 항상 작업을 수행하는 여러 방식을 취할 수 이 :

let a = do let { b = 5 } ; print b 

let 블록은 여러 개의 선언을하면 시간 있도록 포함 할 수 있습니다 그들이 끝났을 때 GHCi에게 알릴 수있는 기회가 주어집니다 - 그것이 바로이 줄에있는 괄호입니다.

그런데 putStrLn . showprint을 사용할 수 있습니다.

1

나는 중괄호 퍼팅 잘 될 것이라고 생각했을 것이다, 그러나 이것은 구문 분석하지 않습니다 :

ghci> :{ 
ghci| let a = do let b = 5 
ghci|   putStrLn $ show b 
ghci| :} 
+1

' : 1 : 41 : 입력에 구문 분석 오류 '}''여전히 –

+0

@ ДМИТРИЙМАЛИКОВ 그래, 그게 내 편집에 관한거야 ... –

+0

하지만 여전히 실패 –

12
:help 

<statement>     evaluate/run <statement>  
:{\n ..lines.. \n:}\n  multiline command 

당신은 입력 할 수 있습니다 : {여러 줄 명령을 시작을하고 을 입력}를 끝낼 수 있습니다.

그래서 단지

Prelude> :{ 
Prelude| let a = do 
Prelude|  let b=5 
Prelude|  putStrLn $ show b 
Prelude| 
Prelude| :} 

레이아웃 (들여 쓰기/공백)에주의 할. 그렇지 않으면 분명히 정확한 코드로 구문 분석 오류를 얻을 수 있습니다.

예를 들어, 다음은 하지 작업 들여 쓰기가 깊은 충분하지 않기 때문에이됩니다

Prelude> :{ 
Prelude| let a = do 
Prelude| let b=5 
Prelude| putStrLn $ show b 
Prelude| 
Prelude| :} 

그것은이 같은 구문 분석 오류로 이어질 것입니다 :

<interactive>:50:4: parse error on input ‘let’ 
관련 문제