如果我想在我的函数中访问/引用一个字符参数,我就这样做:
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
答案 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
引用。现在要访问其中的元组,您可以使用fst
和snd
组合子。