好的,经过一夜的工作,我最终得到了一些代码,这些代码一直给我带来麻烦。 首先,我想为此道歉,你会认为很多都是愚蠢的错误。
第一部分是convertToHTML -
convertToHTML :: String -> String
convertToHTML [] = [] --prevents calling head on empty line
convertToHTML x --here is where I know I'm missing something.
| x == "---" = "<hr/>" --this works!
| doubleHashes x == "True" = "<h2>" ++ x ++ "</h2>" --also wrong
| doubleHashes x == "False" = "<h1>" ++ x ++ "</h1>" --also wrong
| otherwise = x
convertToHTML&#39;然而,代码效果很好......
convertToHTML' :: String -> String
convertToHTML' = unlines.map (convertToHTML.escapeChars).lines
现在转到escapeChar部分。这给了我一个不匹配类型的错误,它来自那里的裸体x。我是否先在代码中声明x作为变量来调用它?
escapeChar :: Char -> String
escapeChar '&' = "&"
escapeChar '<' = "<"
escapeChar x = x
和调用函数的escapeChars
escapeChars :: String -> String
escapeChars = concatMap escapeChar
最后,doubleHashes辅助函数......
doubleHashes ('#' : '#' : []) = True
doubleHashes _ _ = False --different amounts of arguments.
然而,我的主要方法是完美的!我从中读取输入文件,最后调用:
writeFile outFile $ convertToHTML' $ contents
我知道我错过了一些简单的代码,但我无法弄明白...... 感谢
答案 0 :(得分:2)
使用span
Prelude> let s1 = "# one"
Prelude> let s2 = "## two"
Prelude> let (hashes, content) = span (== '#') s1
Prelude> hashes
"#"
Prelude> content
" one"
Prelude> "<h" ++ (show $ length hashes) ++ ">" ++ content ++ "</h" ++ (show $ length hashes) ++ ">"
"<h1> one</h1>"
Prelude> let (hashes, content) = span (== '#') s2
Prelude> "<h" ++ (show $ length hashes) ++ ">" ++ content ++ "</h" ++ (show $ length hashes) ++ ">"
"<h2> two</h2>"
您应该在convertToHTML
上递归拨打content
。
答案 1 :(得分:1)
&
和>
的代码错误:它只在第一个位置替换,而在任何地方都应该替换。它应该在#code之前替换,而不是之后替换,所以如果你有## foo > bar
,它就会被正确处理。
escapeChars :: String -> String
escapeChars = concatMap escapeChar
escapeChar :: Char -> String
escapeChar '&' = "&"
escapeChar '>' = ">"
escapeChar x = [x]
只需使用escapeChars
撰写convertToHtml
:
convertToHTML' :: String -> String
convertToHTML' = unlines.map (convertToHTML . escapeChars).lines
如果您不需要处理###
然后处理##
,您可以使用模式匹配编写辅助函数:
doubleHashes ('#' : '#' : []) = True
doubleHashes _ = False
此外,您的h1
生成器会在代码中留下#
。
convertToHTML :: String -> String
convertToHTML [] = [] --prevents calling head on empty line
convertToHTML x
| head x == '#' = "<h1>" ++ tail x ++ "</h1>"
| doubleHashes x = "<h2>" ++ drop 2 x ++ "</h2>"
| x == "---" = "<hr/>"
| otherwise = x