很抱歉这个问题描述太抽象了:它是为了我的工作,出于商业机密的原因,我不能给出现实世界的问题,只是一个抽象。
我有一个接收包含键值对的消息的应用程序。键来自一组定义的关键字,每个关键字都有一个固定的数据类型。因此,如果“Foo”是整数,“Bar”是日期,您可能会收到如下消息:
Foo: 234
Bar: 24 September 2011
消息中可能包含任何键子集。键的数量相当大(几十个)。但现在让我们坚持使用 Foo 和 Bar。
显然有这样的记录对应的消息:
data MyRecord {
foo :: Maybe Integer
bar :: Maybe UTCTime
-- ... and so on for several dozen fields.
}
该记录使用“可能”类型,因为该字段可能尚未收到。
我还有许多需要从当前值(如果存在)计算的派生值。例如我想拥有
baz :: MyRecord -> Maybe String
baz r = do -- Maybe monad
f <- foo r
b <- bar r
return $ show f ++ " " ++ show b
其中一些功能很慢,所以我不想不必要地重复它们。我可以为每条新消息重新计算 baz 并以原始结构记录它,但如果一条消息保持 foo 和 bar 字段不变,那么这就是浪费 CPU 时间。相反,我可以在每次需要时重新计算 baz ,但是如果自上次以来基础参数没有改变,那又会浪费 CPU 时间。
我想要的是某种智能记忆或基于推送的重新计算,仅在参数发生变化时重新计算 baz。我可以通过注意到 baz 仅依赖于 foo 和 bar 来手动检测到这一点,因此仅根据更改这些值的消息重新计算它,但对于容易出错的复杂函数。
另一个问题是,其中一些函数可能有多种策略。例如,您可能有一个可以使用“mplus”从 Foo 或 Bar 计算的值。
有谁知道现有的解决方案?如果没有,我应该怎么做?