如何简化维护状态的代码?

时间:2015-07-31 06:41:09

标签: haskell

下面的代码遍历了一个图表,并且它维护了一个代表该图表的地图,因此它必须将此地图作为函数值的一部分返回。

我是haskell的新手,我不知道是否可以使用某种类型的monad来隐藏这些细节并避免显式返回状态。如果我可以使用monad那么我不知道哪个以及如何。请帮忙。

expand k m =
    case Map.lookup k m of
      Just (Complete x) -> (x, m)
      Just (Initial x)  -> let m0 = Map.adjust (const $ Visited x) k m
                               (x', m1) = traverse x m0
                               m2 = Map.adjust (const $ Complete x') k m1
                           in (x', m2)
      Just (Visited _)  -> error ("circular reference: " ++ k)
      Nothing           -> error ("name not found: " ++ k)
    where
      traverse (Name k) m = expand k m
      traverse (Or x y) m = let (x', m0) = traverse x m
                                (y', m1) = traverse y m0
                            in (Or x' y', m1)
      traverse (Not x) m  = let (x', m') = traverse x m
                            in  (Not x', m')

0 个答案:

没有答案