下面的代码遍历了一个图表,并且它维护了一个代表该图表的地图,因此它必须将此地图作为函数值的一部分返回。
我是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')