【发布时间】:2016-06-13 21:47:21
【问题描述】:
我一直在从一本 Haskell 书中做一些 Haskell 练习,其中一项任务是过滤特定类型的值并将它们作为列表返回。
import Data.Time
data Item = DbString String
| DbNumber Integer
| DbDate UTCTime
deriving (Eq, Ord, Show)
database :: [Item]
database =
[
DbDate (UTCTime (fromGregorian 1911 5 1) (secondsToDiffTime 34123)),
DbNumber 9001,
DbString "Hello World!",
DbDate (UTCTime (fromGregorian 1921 5 1) (secondsToDiffTime 34123))
]
这是我得到的代码,也是我的第一个任务:
Write a function that filters for DbDate values and returns a list of the UTCTime values inside them.函数的模板是:
filterDate :: [Item] -> [UTCTime]
filterDate = undefined
我必须在这里使用的是折叠,因为这是这里关心的问题。
我在 Hoogle 上查找了 Data.Time 模块,但这并没有真正帮助,因为我无法理解如何与该模块进行交互。也许我从错误的角度看待这个问题,因为我认为它与filter 函数无关,而且我认为它与:: 的类型转换无关。
如何获取 UTCTime 值,以及如何过滤它们?
【问题讨论】:
-
我说“是什么让你认为你应该使用折叠?这个问题并不意味着:我读它的意思是你需要过滤
Item的列表以返回DbDate值,然后从每个值中解压缩UTCTime。” ...但我想我现在看到了曙光。您可以通过遍历导入列表并将有效值连接到输出列表来将过滤器实现为折叠。 -
::不是类型转换。 -
这本书介绍列表推导式了吗?
-
@melpomene 这本书向我介绍了列出理解。我应该使用它们来抽取数据库中的 UTCTime 值吗?
-
是的,列表推导式可能是解决这个问题的最直接的方法。顺便说一句,您不需要与
Data.Time进行此任务交互。
标签: haskell