当我调用我的Haskell子字符串功能时,为什么我会获得“功能中的非排量模式……”?
-
05-10-2019 - |
题
我正在努力完成这本书 Haskell通往逻辑,数学和编程的道路. 。 (我只是第1章中的中间让您熟悉[Haskell]”。到目前为止,我已经了解了功能,类型声明,保护方程式,有关列表模式匹配以及在哪里&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"
我得到“ ***异常:substring.hs:(3,0) - (5,45):函数substring中的非避免模式”。我不知道为什么。当我使用“否则”时,我不明白如何存在非排量模式。
顺便说一句,这本书尚未涵盖如果是else。现在,我愿意将其排除在解决方案之外。
解决方案
您的功能名称中有一个错别字:
subsstring xs [] = False
由于错字,此声明了一个新功能 subsstring
, ,不是 substring
功能。
这 substring
然后,功能本身就没有任何情况可以匹配第二个参数 []
.
不隶属于 StackOverflow