调试一些Haskell函数,守卫

Kim*_*mer 0 html debugging haskell helpers

再一次,我用这段代码遇到了障碍......我发布的早期代码与之前的代码差别很大,所以现在它的变化,问题就出现了!所以我有一个功能

 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
Run Code Online (Sandbox Code Playgroud)

现在,基本上发生了什么,我的辅助函数doubleHash x应该读取一行,如果该行以##开头,整个行上的h3标记并删除##.所以第一个后卫,我相信就是这样.所以,我认为doubleHash函数存在问题.所以这是doubleHash辅助函数

 doubleHash ('#' : '#' : []) = True
 doubleHash _ = False
Run Code Online (Sandbox Code Playgroud)

所以使用cons,只是说##会返回true.不确定这里有什么问题,但是当调用convertToHTML来运行doubleHash x时,它不会应用doubleHash == True的概念,所以在此行上打一个H3标签!相反,它是正确的头x并将H1标签应用于两个行...例如:文本

- >#这应该是H1标记的行

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

然而两者都被H1标签打了一顿.

kqr*_*kqr 9

'#' : '#' : []相当于"##".换句话说,您正在检查整个字符串是否相等"##".您可能想要检查字符串是否以 "##".在Data.List那里有方便的功能isPrefixOf,只测试它.

> isPrefixOf "##" "## a string"
True
> isPrefixOf "##" "# another string"
False
Run Code Online (Sandbox Code Playgroud)


Eug*_*Sh. 6

doubleHash只有当整个字符串为"##"时,您才会返回True.
这个会做你需要的任何事情:

 doubleHash ('#' : '#' : _) = True
 doubleHash _ = False
Run Code Online (Sandbox Code Playgroud)