我有一个在IntMap上运行的算法,我觉得这个算法最好能够表达出来。也就是说,我想说的是:是否存在Data.Map/Data.IntMap的monad实例?
- 在地图中查找值X.
- 如果它符合条件,请从地图中删除此值。
- 循环直到地图中不存在更多值。
这将是相当琐碎来表达作为两行递归,但实际的算法是有点复杂,涉及多个查找和删除,所以我希望能够表达它do
符号。
有没有一个标准的“国”般的单子,其中状态由Data.Map
或Data.IntMap
,在那里我可以做这样的事情表示:
do
insert 5 20
(ma, mv) <- lookup 4
case mv of
Just v -> delete (fromJust ma)
Nothing -> return()
老实说,我不知道如何最好地表达这一点。 。由于lookup
它似乎受益于某种MaybeT IntMap m
堆栈或其他东西。
我做一点工作试图基于Data.IntMap
定义我自己的状态单子,甚至得到尽可能使insert
和delete
工作,但有一点坚持了如何处理lookup
。大多数情况下,我觉得这可能是某人已经解决的问题,但我无法在Hackage上找到它。
哇。谢谢。我真的需要习惯使用变压器。这个例子在展示如何实际使用它们方面有很大的帮助。所有monad教程都会向您展示如何从头开始构建,但很少会向您展示如何利用已有的功能。 – Steve 2011-02-12 04:39:01