【问题标题】:Monad instance for binary tree二叉树的 Monad 实例
【发布时间】:2011-07-23 06:26:34
【问题描述】:

我用以下方法构建了二叉树:

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 左右制作 (>>=)。

谢谢。

【问题讨论】:

  • 这取决于您希望join :: Tree (Tree a) -> Tree a 的行为方式,真的。
  • 正如@dave4420 所说,想想join。您可以让join 进行替换,然后Tree 将成为一个单子。

标签: haskell tree monads


【解决方案1】:

对于你刚刚描述的类型,没有(好的)monad,确切地说。这将需要重新平衡树并将绑定生成的中间树合并在一起,并且您无法根据“a”中的任何信息重新平衡,因为您对此一无所知。

不过也有类似的树形结构

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

承认一个单子

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 或加权树中获得的更严格的重新排序。

【讨论】:

  • 我不懂树Bin(树a)(树a)。它在根目录中没有值?
  • @dehq 正确:这种形式的树只有装饰过的叶子,而不是沿途的节点。您可以制作带有装饰节点的树,但这不会在这些装饰上形成(免费)Monad。链接的幻灯片更多地讨论了多叶树和节点值树之间的权衡以及不同用途。
猜你喜欢
  • 2012-01-09
  • 2018-01-17
  • 2011-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多