2014-06-07 74 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