Фильтровать список моего собственного типа - Tuples? - PullRequest
3 голосов
/ 10 мая 2011

Как я могу отфильтровать список этого типа по третьему элементу в кортеже:

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

Я видел методы snd и fst, но здесь я не думаю, что это будет работать, и яне знаете, как сопоставить без использования подстановочного знака '_'.

Ответы [ 3 ]

11 голосов
/ 10 мая 2011

Нет предопределенных функций, таких как 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 для кортежей.

 newCars = filter ((> 2005) . year) cars
0 голосов
/ 05 декабря 2014

Вот мое решение для подобной проблемы:

  --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)

не будет работать,

, а

`фильтр (заводская <10) </p>

будет

0 голосов
/ 26 сентября 2011

Или вы можете просто использовать Data.Tuple.Utils?

MissingH полно других хороших вещей; почти все мои проекты используют его где-то.

...