【发布时间】:2013-04-26 19:26:17
【问题描述】:
我有一个 lazy 由find 创建的文件名列表。我也希望能够懒惰地加载这些文件的元数据。这意味着,如果我来自metadata 的take 10 元素,它应该只搜索这十个文件的元数据。事实上,find 完美地为您提供了 10 个文件,如果您在不挂磁盘的情况下要求它们,而我的脚本会搜索所有文件的元数据。
main = do
files <- find always always /
metadata <- loadMetaList files
loadMetaList :: [String] -> IO [Metadata]
loadMetaList file:files = do
first <- loadMeta file
rest <- loadMetaList files
return (first:rest)
loadMeta :: String -> IO Metadata
如您所见,loadMetaList 不是惰性的。为了让它变得懒惰,它应该使用尾递归。类似于return (first:loadMetaList rest)。
如何让 loadMetaList 变得懒惰?
【问题讨论】:
-
一开始我以为是“loadMetalList”,就像一堆重金属mp3一样
-
其实就是为了加载mp3的元数据
-
为什么不只拥有 loadMetaList :: [String] -> [IO Metadata] ?然后在需要时单独评估它们?
-
这是一个实际实现的过度简化示例。 loadMetaList 可能会丢弃某些文件,具体取决于它们的元数据(例如流派)
标签: haskell file-io lazy-loading lazy-evaluation lazy-sequences