Haskell -检查(x:xs)的长度并应用函数

k4emjkb1  于 2022-11-14  发布在  其他
关注(0)|答案(1)|浏览(117)

我有一个函数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 = ([], "#")
ux6nzvsh

ux6nzvsh1#

(s : os) == []永远不会为真,因为它是一个以s为头的列表(即至少有一个元素,因此不是空的)。
qpFunc [] _ = itWilcard (p : ps)不能工作,因为,好吧,pps是什么?这个子句不能知道在 another 子句中,你匹配了p : ps。但是没有什么能阻止你在这个子句中也这样做:

qpFunc [] [] = ("", "")
qpFunc [] (p : ps) = itWilcard (p : ps)
qpFunc (s : os) (p : ps)
 | ...

但是,没有必要使用head : tail模式,因为无论如何都只是将整个过程传递给了itWildcard

qpFunc [] [] = ("", "")
qpFunc [] ps = itWilcard ps
qpFunc (s : os) (p : ps)
 | ...

相关问题