2014-06-07 75 views
0

對不起,如果我不能做一個更好的標題。我正在嘗試與Haskell中的monads一起工作,但我遇到了一些麻煩。哈斯克爾monad布爾重複

所以,我應該做的是:

定義功能

repeat:: IO Bool -> IO() -> IO()

這樣repeat test oper有重複oper,待病情的效果testTrue

所以,我這樣做:

repeat:: IO Bool -> IO() -> IO() 
repeat test oper 
    = do res <- test 
      if res 
      then return() 
       else do oper 
        repeat test oper 

但這種代碼是行不通的。你能解釋我爲什麼嗎? 現在,我收到了「如果輸入解析錯誤」。我想這只是一個語法錯誤,但我仍然不知道如何解決這個練習。

+2

你應該是正確的,這只是縮進。爲什麼不[學習如何釣魚](https://en.wikibooks.org/wiki/Haskell/Indentation)? – user2407038

+0

@ user2407038不幸的是,該頁面沒有提及使用製表符的危險,這對於SO問題是特別糟糕的(所以將製表符縮進轉換爲4個空格,Haskell將它們定義爲8)。儘管在這種情況下這似乎不是全部問題。 (至少,我找不到使得問題代碼正確對齊的製表符寬度。) –

+0

對GHC使用'-fwarn-tabs'選項,或者(更好)將'{ - #OPTIONS_GHC -fwarn-tabs# - } '源文件頂部的編譯指示(在任何模塊導入或其他實際代碼之前)。這將使編譯器在看到任何選項卡時生成警告。我個人更喜歡啓用所有警告,然後禁用愚蠢的名字遮蔽。 – dfeuer

回答

4

正如你所知,嵌套在haskell中是通過使用空格來完成的。正確格式化你的代碼,它會工作。請記住在haskell中使用空格而不是製表符,因爲製表符通常會導致奇怪的解析錯誤。

repeat :: IO Bool -> IO() -> IO() 
repeat test oper 
    = do res <- test 
     if res 
     then return() 
     else do oper 
       repeat test oper 
+1

而不是所有這些做塊:'重複bx = b >> =翻轉,除非(x >>重複bx)' – user2407038

+3

@ user2407038,我的猜測是OP沒有準備好達到該表達水平... – luqui

+1

你應該提到使用製表符是一個糟糕的主意;請僅使用空格來保持您的理智。 – dfeuer