我正在通过书The Haskell Road to Logic, Maths and Programming。 (我只是在第1章的中途,但到目前为止我很享受并打算继续。)我已经阅读了第1.5节“播放Haskell游戏”,其中包含了许多其他示例。让你熟悉[Haskell]“。到目前为止,我已经了解了函数,类型声明,保护方程,关于列表模式匹配,以及在哪里&让。
我坚持练习1.17,它要求我们写一个函数substring :: String - >字符串 - >布尔在哪里:
我使用了前一个例子中提供的前缀函数:
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中的非详尽模式“。我无法弄清楚为什么。我不明白当我使用“否则”时可能会出现非详尽的模式。
答案 0 :(得分:12)
您在函数名称中输入错误:
subsstring xs [] = False
由于拼写错误,它声明了一个新函数subsstring
,而不是substring
函数的情况。
substring
函数本身没有任何与[]
的第二个参数匹配的情况。