当我调用Haskell子字符串函数时,为什么会出现“函数中的非详尽模式...”?

时间:2010-09-26 19:08:29

标签: haskell non-exhaustive-patterns

我正在通过书The Haskell Road to Logic, Maths and Programming。 (我只是在第1章的中途,但到目前为止我很享受并打算继续。)我已经阅读了第1.5节“播放Haskell游戏”,其中包含了许多其他示例。让你熟悉[Haskell]“。到目前为止,我已经了解了函数,类型声明,保护方程,关于列表模式匹配,以及在哪里&让。

我坚持练习1.17,它要求我们写一个函数substring :: String - >字符串 - >布尔在哪里:

  1. 如果xs是ys的前缀,则xs是ys的子串
  2. 如果ys等于y:ys'且xs是ys'的子串,xs是ys的子串
  3. 没有别的东西是ys
  4. 的子串

    我使用了前一个例子中提供的前缀函数:

    prefix :: String -> String -> Bool
    prefix [] ys = True
    prefix (x:xs) [] = False
    prefix (x:xs) (y:ys) = (x==y) && prefix xs ys
    

    然后尝试:

    substring :: String -> String -> Bool
    subsstring xs [] = False
    substring xs (y:ys) | prefix xs (y:ys) = True
                        | substring xs ys  = True
                        | otherwise        = False
    

    ......以及其他可能的排列。

    当我运行substring "abc" "xxxabcyyy"时,我得到True,但当我运行substring "abc" "xxxabyyy"时,我得到了“***异常:substring.hs:(3,0) - (5,45) ):函数substring中的非详尽模式“。我无法弄清楚为什么。我不明白当我使用“否则”时可能会出现非详尽的模式。

    顺便说一句,这本书还没有涵盖if-then-else。我现在更愿意将其从我的解决方案中删除。

1 个答案:

答案 0 :(得分:12)

您在函数名称中输入错误:

subsstring xs [] = False

由于拼写错误,它声明了一个新函数subsstring,而不是substring函数的情况。

substring函数本身没有任何与[]的第二个参数匹配的情况。