该示例取自“Haskell programming from first principle”过滤器功能的目标是摆脱除“DbDate”类型之外的所有对象。
在 somone 的 github 上,我找到了一种使用列表理解和模式匹配 (1) 过滤总和类型的方法。现在我正在尝试找到一种方法来使用 lambda 函数(2)或“if then”函数的正常“case of”重新定义此过滤器。当我处理自定义数据类型时,我不知道如何正确检查函数的参数类型。
本书没有向读者介绍任何超级特定的库函数,只是标准的地图、折叠、过滤器和其他你会在序曲中找到的东西。
import Data.Time
data DatabaseItem = DbString String
| DbNumber Integer
| DbDate UTCTime
deriving (Eq, Ord, Show)
--List that needs to be filtered
theDatabase :: [DatabaseItem]
theDatabase =
[ DbDate (UTCTime (fromGregorian 1911 5 1)
(secondsToDiffTime 34123))
, DbNumber 9001
, DbString "Hello, world!"
, DbDate (UTCTime (fromGregorian 1921 5 1)
(secondsToDiffTime 34123))
]
--1 works fine, found on someone's git hub
filterDbDate :: [DatabaseItem] -> [UTCTime]
filterDbDate dbes = [x | (DbDate x) <- dbes]
--2 Looking for the eqivalents with lambda or "case" or "if then"
--pattern is not satisfactory
filterDbDate :: [DatabaseItem] -> [UTCTime]
filterDbDate dbes = filter (\(DbDate x) -> True) theDatabase