2012-12-01 32 views
-1

我正在Haskell寫一個Brainf * ck解釋器。Haskell - 同時打印並返回一個狀態

我試圖打印(chr (fromEnum $ getMem state))這只是Word8轉換爲字符。 後來我想這是

'.' -> do hPutChar stdout (chr (fromEnum $ getMem state)) 
      hFlush stdout 
      return state { prog_pointer = prog_pointer state} 

我收到此錯誤信息

The function `hPutChar' is applied to six arguments, 
but its type `Handle -> Char -> IO()' has only two 

In a stmt of a 'do' block: 
    hPutChar 
    stdout 
    (chr (fromEnum $ getMem state)) 
    hFlush 
    stdout 
    return 
    (state {prog_pointer = prog_pointer state}) 

與此代碼

iterateBF :: BFState -> IO BFState 
iterateBF state = case (program state !! prog_pointer state) of 
    --some more cases here-- 
    '.' -> do hPutChar stdout (chr (fromEnum $ getMem state)) 
      hFlush stdout 
      return state { prog_pointer = prog_pointer state} 

我似乎特定的情況下,打印後返回一個新的狀態弄清楚爲什麼我得到這個錯誤。

leftaroundabout和sabauma的意見後,我編輯我的代碼只使用空格這個時候要

iterateBF :: BFState -> IO BFState 
iterateBF state = case (program state !! prog_pointer state) of 
    --some more cases here-- 
    '.' -> do hPutChar stdout (chr (fromEnum $ getMem state)) 
      hFlush stdout 
      return state { prog_pointer = prog_pointer state} 

不過,我得到parse error on input 'hFlush'

任何人都知道爲什麼嗎?在leftaroundabout的評論

+5

縮進!縮進!縮進! – leftaroundabout

+1

lefaroundabout是正確的。 do-block的所有表達式都需要具有相同級別的縮進。讓你的第一行代碼與其餘代碼一致。 – sabauma

+0

@sabauma aah好吧。當你說與其他代碼對齊時,你指的是哪個代碼的其餘部分? – ali

回答

2

大廈,你要

'.' -> do hPutChar stdout (chr (fromEnum $ getMem state)) 
      hFlush stdout 
      return state { prog_pointer = prog_pointer state} 

注意如何do畢竟線相互對齊,不與do