访问列表中的元组数据

时间:2015-08-29 23:30:32

标签: list haskell tuples

如果我想在我的函数中访问/引用一个字符参数,我就这样做:

myFunc :: Char -> Bool
myFunc c = ... --Here I use 'c' to work with my Char parameter

使用列表:

myList :: [Int] -> [Int]
myList l = ... --I can access the list with 'l'. 

现在,如何在列表中访问/工作/引用元组数据:

myFunc :: [(Int, Int)] -> [(Int, Int)] --Receive a list of tuple as parameter
myFunc ?? = ... --How may I access the tuple element ? How may I access its data. Just use a letter there and try to work with `fst` or `snd` does not work.

更新

myFunc :: [(Int, Int)] -> [(Int, Int)]
myFunc  [] = [(0, 0)]
myFunc ((x,y):rest) = x --Error here:  
Couldn't match expected type `[(Int, Int)]' with actual type `Int' In the  expression: x

1 个答案:

答案 0 :(得分:4)

您实际上是在询问如何进行模式匹配。这是在您的情况下执行此操作的一般方法:

myFunc :: [(Int, Int)] -> [(Int, Int)]
myFunc [] = undefined
myFunc ((x,y):[]) = undefined
myFunc ((x,y):rest) = undefined

模式((x,y):[])将匹配仅包含一个元素的列表。 x引用元组中的第一个元素,y引用第二个元素。类似地,在模式((x,y):rest)中,rest指的是除第一个(或头部)元素之外的列表的其余部分。

另一种类似但功能不太强的方法就是这样:

myFunc :: [(Int, Int)] -> [(Int, Int)]
myFunc [] = undefined
myFunc (first:[]) = undefined
myFunc (first:rest) = undefined

此处在模式(first:rest)中,列表的head元素由变量first引用。现在要访问其中的元组,您可以使用fstsnd组合子。