二进制树的Monad实例

时间:2011-07-23 06:26:34

标签: haskell tree monads

我用:

构建了二叉树
data Tree a = Empty 
              | Node a (Tree a) (Tree a)
              deriving (Eq, Ord, Read, Show)

如何为这棵树制作Monad类型实例?我能不能做到吗?

我试试:

instance Monad Tree where
    return x = Node x Empty Empty 
    Empty >>= f = Empty
    (Node x Empty Empty) >>= f = f x 

但我无法为节点x左右制作(>> =)。

谢谢。

1 个答案:

答案 0 :(得分:35)

你刚才描述的类型没有(好)monad。它需要重新平衡树并将绑定生成的中间树合并在一起,并且您无法根据'a'中的任何信息进行重新平衡,因为您对此一无所知。

但是,有一个类似的树结构

data Tree a = Tip a | Bin (Tree a) (Tree a)

承认monad

instance Monad Tree where
   return = Tip
   Tip a >>= f = f a
   Bin l r >>= f = Bin (l >>= f) (r >>= f)

我谈到了这个和其他树结构a year or two back at Boston Haskell作为谈论手指树的引导。那里的幻灯片可能有助于探索绿叶树和传统二元树之间的差异。

我说没有好的monad的原因是,任何这样的monad都必须将树放入规范形式,以便通过monad定律或通过不暴露构造函数来解决一些平衡问题对于最终用户,但是执行前者需要比例如从AVL或加权树获得更严格的重新排序。