计算'char'并将行转换为<h1>标签</h1> <h2>标签等HASKELL </h2>

时间:2014-12-04 11:47:57

标签: html haskell replace count

好的,经过一夜的工作,我最终得到了一些代码,这些代码一直给我带来麻烦。 首先,我想为此道歉,你会认为很多都是愚蠢的错误。

第一部分是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 '&' = "&amp;"
 escapeChar '<' = "&lt;"
 escapeChar x   = x

和调用函数的escapeChars

 escapeChars :: String -> String
 escapeChars = concatMap escapeChar

最后,doubleHashes辅助函数......

 doubleHashes ('#' : '#' : []) = True
 doubleHashes _ _ = False --different amounts of arguments.
然而,我的主要方法是完美的!我从中读取输入文件,最后调用:

 writeFile outFile $ convertToHTML' $ contents

我知道我错过了一些简单的代码,但我无法弄明白...... 感谢

2 个答案:

答案 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 '&' = "&amp;"
escapeChar '>' = "&gt;"
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