簡體   English   中英

元組列表中的模式匹配與列表理解

[英]Pattern Matching and List Comprehension in List of Tuples

type a = [(Int,Int,Int,Int)]

fun:: a -> Int
func [a,b,c,d] = ?

我有一個像這樣的元組列表,我需要的是應用list comprehensionspattern 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 元組結構匹配。

下面,我將給出一些基本的例子。 請注意,您也可以使用標准的高階函數來編寫它,例如filtermap ,我故意不提@ -patterns 和嚴格性之類的東西。 我不建議這樣做,但這只是給你一個想法!

當你想對元組的第一部分求和時,你可以這樣做:

sum4 :: [(Int,Int,Int,Int)] -> Int
sum4 [] = 0
sum4 ((a,b,c,d):xs) = a + sum4 xs

如果要過濾掉所有abcd都是偶數的元組:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM