我该如何通过元组中的第三个项目来过滤这种类型的列表:
type Car = (String, [String], Int [String])
我看到了 snd
和 fst
方法,但我不认为这会起作用,也不确定如何进行映射而不使用 '_'
通配符。
对于超过两个元素的元组,没有像fst
或snd
这样的预定义函数。正如你所说,您可以使用模式匹配和通配符_
来完成工作。
cars = [ ("Foo", ["x", "y"], 2009, ["ab", "cd"]
, ("Bar", ["z"], 1997, [])
]
newCars = filter condition cars
where condition (_, _, n, _) = n > 2005
然而,这通常是一个提示,表明您应该从使用元组改为使用记录类型。
data Car = Car { model :: String
, foo :: [String]
, year :: Int
, bar :: [String]
}
cars = [ Car "Foo" ["x", "y"] 2009 ["ab", "cd"]
, Car "Bar" ["z"] 1997 []
]
现在,您可以像在元组上使用fst
和snd
一样使用model
、foo
、year
和bar
。
newCars = filter ((> 2005) . year) cars
last foo
不起作用,因为 last
需要一个列表,而 foo
是一个函数。如果你想要一辆车的最后一个 foo
,你可以将这两个函数组合起来,如 (last . foo) car
。 - hammar这是我针对类似问题的解决方案:
--construct a list of stock records with the number in stock less than the reorder level.
getstock (name, stock, reorder) = stock
getreorder (name, stock, reorder) = reorder
check l = filter (\x ->(getstock x < getreorder x)) l
main = print(check [("RAM",9,10),("ROM",12,10),("PROM",20,21)]); --[("RAM",9,10),("PROM",20,21)]
关键在于理解过滤函数需要一个谓词,而不是布尔值。
因此,简单地说:
filter(getstock < getreorder)
是行不通的,
而
`filter (getstock < 10)
则可以。
Int
后面缺少逗号。 - hammar