[英]Pattern Matching and List Comprehension in List of Tuples
type a = [(Int,Int,Int,Int)]
fun:: a -> Int
func [a,b,c,d] = ?
我有一個像這樣的元組列表,我需要的是應用list comprehensions
或pattern matching
.. 取sum 或 filter 的例子只除 2 個數字...我只想開始如何訪問值和/或列表推導到這個列表元組
總結a
s,使用這樣的東西:
type A = [(Int, Int, Int, Int)]
func :: A -> Int
func tuples = sum [a | (a, b, c, d) <- tuples]
另請注意,類型別名必須以大寫字母開頭。 小寫字母用於類型變量。
hammar 的回答涵蓋了列表推導,使用模式匹配的遞歸函數的基本模式是:
f [] = ..
f ((a,b,c,d):xs) = ..
因此,您需要為不包含 4 元組的列表指定一個基本情況,以及當列表由一個 4 元組(a,b,c,d)
后跟一個 (可能為空,可能非空)4 元組xs
的列表。 第二行的模式是嵌套模式:它首先將列表與(x:xs)
之類的模式匹配,即元素x
后跟列表xs
的 rest ; 然后它將x
與 4 元組結構匹配。
下面,我將給出一些基本的例子。 請注意,您也可以使用標准的高階函數來編寫它,例如filter
和map
,我故意不提@
-patterns 和嚴格性之類的東西。 我不建議這樣做,但這只是給你一個想法!
當你想對元組的第一部分求和時,你可以這樣做:
sum4 :: [(Int,Int,Int,Int)] -> Int
sum4 [] = 0
sum4 ((a,b,c,d):xs) = a + sum4 xs
如果要過濾掉所有a
、 b
、 c
和d
都是偶數的元組:
filter4allEven :: [(Int,Int,Int,Int)] -> [(Int,Int,Int,Int)]
filter4allEven [] = []
filter4allEven ((a,b,c,d):xs)
| all even [a,b,c,d] = (a,b,c,d) : filter4AllEven xs
| otherwise = filter4AllEven xs
(如果使用all
讓您感到困惑,請閱讀even a && even b && even c && even d
)
最后,這是一個 function,它返回所有偶數元組組件(元組本身不能是偶數:),其順序與它們在參數列表中出現的順序相同:
evenTupleComponents :: [(Int,Int,Int,Int)] -> [Int]
evenTupleComponents [] = []
evenTupleComponents ((a,b,c,d):xs) = [x | x <- [a,b,c,d], even x] ++ evenTupleComponents
一旦你做了幾個這樣的練習,你就會明白為什么使用標准函數是一個好主意,因為它們都遵循相似的模式,比如將 function 分別應用於每個元組,包括或排除具有某些屬性的元組或,更一般地,給出空列表的基值和遞歸情況的組合 function。 例如,我會將evenTupleComponents
寫為evenTupleComponents = filter even. concatMap (\(a,b,c,d) -> [a,b,c,d])
evenTupleComponents = filter even. concatMap (\(a,b,c,d) -> [a,b,c,d])
,但那是另一回事:)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.