Haskell中的模式匹配操作

meh*_*ix_ 0 haskell list pattern-matching

我有一个模式匹配的元组,并以递归方式对每个元素执行一些操作.

[(Int, Char, Int)] 
Run Code Online (Sandbox Code Playgroud)

我找到了如何正确模式匹配它来访问每个元素,如下所示:

((q1, s, q2):tss)
Run Code Online (Sandbox Code Playgroud)

有了这个,我可以对列表中的每个元素进行一些检查操作.我打算如何递归地对元组中的其余元素执行相同的操作,在本例中是tss.

这是我在这里发布的代码的一部分:

case ts of 
[] -> False
((q1, s, q2):tss)  | not (q1 `elem` qs) -> False
                   | not (s `elem` qs) -> False
                   | not (q2 `elem` qs) -> False
Run Code Online (Sandbox Code Playgroud)

我应该如何递归地对tss进行相同的测试?想法将不胜感激.

jos*_*uan 5

首先,编写测试函数

test (q1, s, q2) = q1 `elem` q1List &&
                   s  `elem` sList  &&
                   q2 `elem` q2List
Run Code Online (Sandbox Code Playgroud)

有了它,你可以遍历

map test tss
Run Code Online (Sandbox Code Playgroud)

(使用map,filter,fold...因为你需要).

直接的方法可能是

mapTest [] = []
mapTest (t:tss) = test t: mapTest tss
Run Code Online (Sandbox Code Playgroud)

(但很简单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)]
Run Code Online (Sandbox Code Playgroud)

与输出

[True,False]
Run Code Online (Sandbox Code Playgroud)