2014-09-30 109 views
0

我有一个元组来模式匹配,并以递归方式对每个元素执行一些操作。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上相同的测试? 想法将不胜感激。

+0

请至少发布一个完整的定义。什么是'qs'? – luqui 2014-09-30 07:47:05

+0

你想得到一个'布尔'的列表吗?或者你想检查是否所有元素fullfil你的财产(或者你想检查至少有一个吗?) – Carsten 2014-09-30 07:49:10

+0

最好,如果你只是给我们一个样本输入和所需的输出;) – Carsten 2014-09-30 07:49:34

回答

5

首先,编写测试功能

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] 
1

Functi关于定义通常写在条款中;返回布尔值表达式把守可以只用逻辑表达式来代替:

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 

我们作为一个参数传递给qsg使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都是所谓的"folds",所以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也是一种“折叠”。