【发布时间】:2017-11-14 20:23:20
【问题描述】:
下面是来自an answer regarding memoization 的代码,显示了在 State monad 中使用的记忆函数,如果键不在映射中,则使用传递函数的结果更新状态。
type MyMemo a b = State (Map.Map a b) b
myMemo :: Ord a => (a -> MyMemo a b) -> a -> MyMemo a b
myMemo f x = do
map <- get
case Map.lookup x map of
Just y -> return y
Nothing -> do
y <- f x
modify $ \map' -> Map.insert x y map'
return y
它看起来不像是惯用的 Haskell:感觉非常必要,每行并没有那么多内容。
有没有办法以更简洁/实用的风格完成上述操作?我查看了http://hackage.haskell.org/package/transformers-0.5.4.0/docs/Control-Monad-Trans-State-Lazy.html#v:state 提供的功能,但似乎没有任何帮助。
【问题讨论】:
标签: haskell functional-programming monads memoization