[英]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.