如何通过元组中的第三项过滤此类型的列表:
type Car = (String, [String], Int [String])
我看到了snd
和fst
方法但在这里我不认为这会有效,我不确定如何在不使用'_'
通配符的情况下进行映射。
答案 0 :(得分:11)
对于具有两个以上元素的元组,没有任何预定义的函数,如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 []
]
现在,您可以使用model
,foo
,year
和bar
,就像在元组上使用fst
和snd
一样。< / p>
newCars = filter ((> 2005) . year) cars
答案 1 :(得分:0)
或者您可以使用Data.Tuple.Utils
?
MissingH
也充满了其他好东西;我的几乎所有项目都在某处或其他地方使用它。
答案 2 :(得分:0)
以下是针对类似问题的解决方案:
--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&lt; 10)
会