当我调用我的Haskell子字符串功能时,为什么我会获得“功能中的非排量模式……”?

StackOverflow https://stackoverflow.com/questions/3799359

  •  05-10-2019
  •  | 
  •  

我正在努力完成这本书 Haskell通往逻辑,数学和编程的道路. 。 (我只是第1章中的中间让您熟悉[Haskell]”。到目前为止,我已经了解了功能,类型声明,保护方程式,有关列表模式匹配以及在哪里&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" 我得到“ ***异常:substring.hs:(3,0) - (5,45):函数substring中的非避免模式”。我不知道为什么。当我使用“否则”时,我不明白如何存在非排量模式。

顺便说一句,这本书尚未涵盖如果是else。现在,我愿意将其排除在解决方案之外。

有帮助吗?

解决方案

您的功能名称中有一个错别字:

subsstring xs [] = False

由于错字,此声明了一个新功能 subsstring, ,不是 substring 功能。

substring 然后,功能本身就没有任何情况可以匹配第二个参数 [].

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top