2014-03-01 35 views
1

我是Haskell的初學者,想開始解決它的問題,所以我試圖解決第一個SPOJ問題(問題代碼:測試)。 「問題」是讀取行並打印它們直到「42」出現。Haskell SPOJ的「生命,宇宙和一切」 - 如果解析錯誤

main = do input <- getLine 
      if input == "42" then putStr "" 
      else do putStrLn input 
        main 

我的解決方案非常簡單,但輸入'if'時出現解析錯誤。當我在開始處和其他語句中將「main」更改爲「main2」時,一切正常。爲什麼'if'有解析錯誤?

+1

當我嘗試它時,你的代碼編譯得很好。你確定它的縮進就像你在這裏寫的一樣嗎? ''''塊是縮進敏感的。 – Tarmil

+0

是的,就像我寫的一樣...你不會得到那個分析錯誤? –

回答

8

您的編輯器混合了製表符和空格,而當您的編輯器將製表符顯示爲4個空格時,Haskell將製表符解釋爲8個字符。

請注意,您無法在常規代碼塊中的StackOverflow上重現您的代碼,因爲StackOverflow自動將選項卡替換爲空格。自己嘗試 - 將你問題中的代碼複製到你的編輯器中,假設它不會自動將空格轉換爲製表符。

因此,禁用編輯器中的選項卡並將現有選項卡轉換爲四個空格,您應該沒問題。

0

嘗試在右側比「if」更縮進「else」。現在不再需要這個(IIRC),但是早期的編譯器需要這樣做。原因是在一個do塊中,你的代碼被解析爲:

main = do { input <- getLine ; 
      if input == "42" then putStr "" ; -- parse error, no "else" 
      else do { putStrLn input ; 
         main 
        } 
      } 

新的編譯器應該允許額外的「;」如果是「其他」,老年人不會。

詳情請參閱DoIfThenElse