Вы действительно были на правильном пути, поскольку сопоставление с образцом является простым способом решения этой проблемы, однако вы получите ошибку, поскольку сопоставление с образцом не является исчерпывающим.Также обратите внимание, что если вы используете фильтр, вы все равно получите список [DatabaseItem]
, поскольку фильтр никогда не меняет тип.Однако вы можете использовать map
, чтобы сделать это.Итак:
Случай
Вы можете иметь case .. of
внутри вашей лямбда-функции:
filterDbDate' :: [DatabaseItem] -> [UTCTime]
filterDbDate' = map (\(DbDate x) -> x) .filter (\x ->
case x of
DbDate x -> True
_ -> False)
Рекурсия + Сопоставление с образцом
Однако я думаюэто проще сделать с помощью рекурсии:
filterDbDate'' :: [DatabaseItem] -> [UTCTime]
filterDbDate'' [] = []
filterDbDate'' ((DbDate d):ds) = d : filterDbDate ds
filterDbDate'' (_:ds) = filterDbDate ds
Best Way
Если честно, когда вам нужно смешать фильтр и карту, и ваши лямбды просты, как эта, перечислитетвой самый чистый путь:
filterDbDate ds = [d | (DbDate d) <- ds]