我有一个函数qpFunc,它接受两个字符串:s:os和p:ps。我递归调用这个函数,遍历一个列表。当s:os为空时,我想调用一个新函数itWilcard(p:ps)。然而,当试图将它作为模式匹配时,它抱怨说
“变量不在范围内:ps::[字符]"。
当在函数调用中使用时,它永远不会达到条件
“函数qpFunc中的非穷举模式”
当用“”“?"调用它时。
如何检查用作参数的列表是否为空,如果为空,则应用新函数?在这里发布的问题question stackoverflow中,它说
“x:xs从不为空:它总是有元素x。匹配空列表的规范模式是[]”
然而,在我的例子中,我希望在满足模式的情况下应用一个函数。
这是我目前的代码:
qpFunc :: String -> String -> (String, String)
qpFunc [] [] = ("", "")
qpFunc [] _ = itWilcard (p : ps) -- does not work
qpFunc (s : os) (p : ps)
| (s : os) == [] = itWilcard (p : ps) -- never reached ?
| p == '*' = (os, p : ps)
| p == '?' = qpFunc os ps
| s == p = (os, ps)
| otherwise = ([], "#")
1条答案
按热度按时间ux6nzvsh1#
(s : os) == []
永远不会为真,因为它是一个以s
为头的列表(即至少有一个元素,因此不是空的)。qpFunc [] _ = itWilcard (p : ps)
不能工作,因为,好吧,p
和ps
是什么?这个子句不能知道在 another 子句中,你匹配了p : ps
。但是没有什么能阻止你在这个子句中也这样做:但是,没有必要使用
head : tail
模式,因为无论如何都只是将整个过程传递给了itWildcard
。