[英]Pattern Matching Operation in Haskell
我有一个元组来进行模式匹配,并递归地对每个元素进行一些操作。
[(Int, Char, Int)]
我找到了如何正确进行模式匹配以访问每个元素的方法,如下所示:
((q1, s, q2):tss)
这样,我可以对列表中的每个元素进行一些检查操作。 我打算做的是对元组中其余元素(在本例中为tss)进行递归执行相同的操作。
这是我在此处发布的代码的一部分:
case ts of
[] -> False
((q1, s, q2):tss) | not (q1 `elem` qs) -> False
| not (s `elem` qs) -> False
| not (q2 `elem` qs) -> False
我应该如何在tss上递归进行相同的测试? 想法将不胜感激。
首先,编写您的测试功能
test (q1, s, q2) = q1 `elem` q1List &&
s `elem` sList &&
q2 `elem` q2List
有了它你就可以遍历
map test tss
(根据需要使用map
, filter
, fold
...)。
一种直接的方法可能是
mapTest [] = []
mapTest (t:tss) = test t: mapTest tss
(但是一个简单的map
)
一个完整的例子
multipleCheck q1List sList q2List tss = traverse tss
where traverse [] = []
traverse (t:tss) = check t: traverse tss
check (q1, s, q2) = q1 `elem` q1List &&
s `elem` sList &&
q2 `elem` q2List
main = print $ multipleCheck [1..5] "abc" [2,3,5] [(1,'b',3), (1,'b',4)]
带输出
[True,False]
函数定义通常写在子句中; 返回布尔值的受保护表达式可以仅替换为逻辑表达式:
g qs [] = False -- should be True
g qs ((q1, s, q2):tss) =
( (q1 `elem` qs) &&
(s `elem` qs) && -- the three checks
(q2 `elem` qs) && ) && g qs tss -- and the recursive call
我们将qs
作为参数传递给g
以便g
可以访问它。 否则, qs
必须是一个全局的预定义值。
您的基本情况返回值应为True,而不是False,否则对于任何输入,您的函数将始终返回False。
顺便说一句, g qs tss = all (\\(a,b,c)-> all (`elem` qs) [a,b,c]) tss = and (map (\\(a,b,c)-> all (`elem` qs) [a,b,c]) tss)
。 all
和and
都是所谓的“倍数” ,因此g
也是如此。
如果要对每个元组执行相同的测试,并获得返回的结果列表作为整体结果,则只需更改合并递归结果的方式即可:
g qs [] = [] -- False -- it is a list now, not a Boolean
g qs ((q1, s, q2):tss) =
( (q1 `elem` qs) &&
(s `elem` qs) && -- the three checks
(q2 `elem` qs) && ) : g qs tss -- and the recursive call
-- ^^^ here
那就是上面的map
,只是没有and
。 map
也是一种“折”。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.