我正在阅读《The Haskell Road to Logic, Maths and Programming 》一书。(我只是第 1 章的中途,但到目前为止我很享受它并打算继续。)我已经阅读了第 1.5 节“玩 Haskell 游戏”,其中“包含许多进一步的示例让你熟悉 [Haskell]”。到目前为止,我已经了解了函数、类型声明、受保护的方程式、一些关于列表模式匹配以及 where & let 的知识。
我坚持练习 1.17,它要求我们编写一个函数 substring :: String -> String -> Bool 其中:
- 如果 xs 是 ys 的前缀,xs 是 ys 的子串
- 如果 ys 等于 y:ys' 并且 xs 是 ys' 的子串,则 xs 是 ys 的子串
- 没有别的是 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。现在,我宁愿将其排除在我的解决方案之外。