2014-12-04 15 views
0

我再次用这个代码碰到了障碍......我发布了早先很不同的代码,所以现在改变了,所以是问题!所以我有一个函数调试一些哈斯克尔函数,警卫

convertToHTML :: String -> String 
convertToHTML [] = [] --prevents calling head on empty line 
convertToHTML x 
      | doubleHash x  == True  = "<h3>" ++ drop 2 x ++ "</h3>" 
      | head x   == '#'  = "<h1>" ++ tail x ++ "</h1>" 
      | x    == "---" = "<hr/>" 
      | otherwise     = x 

现在,基本上都是正在发生的事情是,这是应该读取一行,如果该行开头##拍打着整个线H3标签帮助我的功能doubleHash x和去除 ##。所以第一个后卫,我相信就是这样。所以,我认为doubleHash函数有问题。所以这里是doubleHash帮助函数

doubleHash ('#' : '#' : []) = True 
doubleHash _ = False 

所以使用cons,只是说##会返回true。 不知道这里有什么问题,但是当convertToHTML被调用来运行doubleHash x时,它不适用doubleHash == True的概念,所以在这一行打了一个H3标记!而是去正确的头x和H1标签同时适用于线... 例如:文本

- >#这应该是一个H1标记线

- > ##这应该是一个H3标记的行

然而,两者都被H1标签打了一巴掌。

回答

6

只有当整个字符串是“##”时,您的doubleHash才会返回True。
这一个会做任何你需要的:

doubleHash ('#' : '#' : _) = True 
doubleHash _ = False 
9

'#' : '#' : []相当于"##"。换句话说,你正在检查整个字符串是否等于"##"。您可能想要检查字符串是否以"##"开头。在Data.List有便利的功能isPrefixOf这就是测试。

> isPrefixOf "##" "## a string" 
True 
> isPrefixOf "##" "# another string" 
False