我用:
构建了二叉树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左右制作(>> =)。
谢谢。
答案 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或加权树获得更严格的重新排序。