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

(根据需要使用mapfilterfold…)。

一种直接的方法可能是

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)alland都是所谓的"折叠",所以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,只是没有andmap也是一种"折叠"。

最新更新