2013-03-07 4 views
11

私はghciで対話的にdoブロックを作成しようとしています。ghciのdoブロック内でletを使用するにはどうすればよいですか?

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

が、私はパースエラーを取得せずに対話的にブロックを行う中のlet建設を定義する方法を見つけ出すことはできません:限り、私はブロックでの変数を定義していないとして、それは大丈夫です

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 

Haskellのソースファイルで完全に罰金です。私はそれをghciにどのように翻訳するかを考え出すのが難しいだけです。

答えて

15

試してみてください。

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

あなたはいつも仕事をして、複数行のアプローチを取ることができ、この:

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

letブロックがあなたの時間ので、複数の宣言を含めることができます彼らが終わったときにGHCiに伝えるために、この行に括弧があります。

ところでputStrLn . showにはprintを使用できます。

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’ 
関連する問題