【问题标题】:Debugging some Haskell functions, guards调试一些 Haskell 函数,守卫
【发布时间】:2014-12-04 21:23:41
【问题描述】:

我再次遇到了这段代码的障碍...我发布了我之前的代码,这与之前有很大不同,所以现在它发生了变化,问题也随之而来!所以我有一个功能

 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

现在,基本上发生的事情是,我的辅助函数 doubleHash x 应该读取一行,如果该行以 ## 开头,则在整行上打一个 h3 标签并删除 ##。所以第一后卫,我相信就是这样做的。所以,我认为 doubleHash 函数有问题。所以这里是 doubleHash 辅助函数

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

所以使用 cons,只是说 ## 会返回 true。 不知道这里出了什么问题,但是当调用 convertToHTML 来运行 doubleHash x 时,它不应用 doubleHash == True 的概念,所以在这一行打一个 H3 标记!相反,它直接指向 x 并将 H1 标签应用于两行...... 例如:文本

--> #这应该是H1标签行

--> ##这应该是H3标签行

但是两者都被 H1 标签打了。

【问题讨论】:

    标签: html debugging haskell helpers


    【解决方案1】:

    '#' : '#' : [] 等价于"##"。换句话说,您正在检查整个字符串是否等于"##"。您可能想检查字符串 是否以 "##" 开头。在 Data.List 中,有一个方便的函数 isPrefixOf 可以测试这一点。

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

    【讨论】:

      【解决方案2】:

      只有当整个字符串为“##”时,您的 doubleHash 才会返回 True。
      这个可以满足你的任何需求:

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

      【讨论】:

        猜你喜欢
        • 2012-10-30
        • 1970-01-01
        • 2020-05-03
        • 2019-03-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多