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进行相同的测试?想法将不胜感激.
首先,编写测试函数
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)