【发布时间】:2009-05-10 04:03:02
【问题描述】:
我正在尝试实现一个透明缓存,它可以在特定对象不可用时加载它,或者返回一个由 (name) 索引的现有对象。
我试过运行这个:
loader' objs name = case findObj objs name of
Nothing → (new_obj, loader' new_objs)
Just obj → (obj, loader' objs)
where
new_objs = [(name, new_obj)] ++ objs
new_obj = readObj name
loader = loader' []
但我得到了一个
发生检查:无法构造无限类型: t = (ObjType, 字符串 -> t)看起来和我想要的完全一样:)
如何修复函数以便编译?
说明:
根据要求,签名(findObj 要么返回通过密钥找到的已知值,要么返回 Nothing,readObj 为密钥创建一个新 obj):
findObj :: [(String, ObjType)] -> String -> Maybe ObjType
readObj :: String -> ObjType
是的 - 我需要一个缓存,因为键是文件名,我不想在每次需要某个对象时读取+解析文件。
【问题讨论】:
-
我想我们需要看看 findObj 和 readObj 的定义
-
你甚至需要函数式语言中的缓存概念吗?我一直认为这是一个命令式优化。
-
为 findObj、readObj 添加了签名