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

Dar*_*zer 10 haskell non-exhaustive-patterns

我正在通过Haskell的逻辑,数学和编程之路.(我只是在第1章的中途,但到目前为止我很享受并打算继续.)我已经阅读了第1.5节"播放Haskell游戏",其中包含了许多其他示例.让你熟悉[Haskell]".到目前为止,我已经了解了函数,类型声明,保护方程,关于列表模式匹配以及where和let.

我坚持练习1.17,它要求我们写一个函数substring :: String - > String - > Bool其中:

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

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

prefix :: String -> String -> Bool
prefix [] ys = True
prefix (x:xs) [] = False
prefix (x:xs) (y:ys) = (x==y) && prefix xs ys
Run Code Online (Sandbox Code Playgroud)

然后尝试:

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

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

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

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

sth*_*sth 12

你在函数名中有一个拼写错误:

subsstring xs [] = False
Run Code Online (Sandbox Code Playgroud)

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

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

  • 我无法决定是否因为错误浪费你的时间而感到尴尬,或者高兴我的解决方案除了错字之外有效.谢谢. (4认同)
  • @gawi:这不是一个bug,它是一个功能!如果使用`-Wall`编译,会收到一些警告. (3认同)
  • 这是有趣的.你可以拥有一个最复杂的类型系统,一个简单的错字不能被它捕获. (2认同)
  • 这是什么警告. (2认同)