过滤我自己的类型列表 - 元组?

时间:2011-05-10 09:26:32

标签: list haskell filter wildcard tuples

如何通过元组中的第三项过滤此类型的列表:

type Car = (String, [String], Int [String])

我看到了sndfst方法但在这里我不认为这会有效,我不确定如何在不使用'_'通配符的情况下进行映射。

3 个答案:

答案 0 :(得分:11)

对于具有两个以上元素的元组,没有任何预定义的函数,如fstsnd。如您所说,您可以使用模式匹配和通配符_来完成工作。

 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 []
        ]

现在,您可以使用modelfooyearbar,就像在元组上使用fstsnd一样。< / 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)