10

我正在阅读《The Haskell Road to Logic, Maths and Programming 》一书。(我只是第 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

然后尝试:

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"我得到“*** Exception: substring.hs:(3,0)-(5,45): Non-exhaustive patterns in function substring”。我不知道为什么。我不明白当我使用“否则”时怎么会有非详尽的模式。

顺便说一句,这本书还没有涵盖 if-then-else。现在,我宁愿将其排除在我的解决方案之外。

4

1 回答 1

12

您在函数名称中有错字:

subsstring xs [] = False

由于错字, this 声明了一个新函数subsstring,而不是函数的情况substring

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

于 2010-09-26T19:11:53.903 回答