簡體   English   中英

二叉樹的 Monad 實例

[英]Monad instance for binary tree

我用以下方法構建了二叉樹:

data Tree a = Empty 
              | Node a (Tree a) (Tree a)
              deriving (Eq, Ord, Read, Show)

如何為這棵樹制作 Monad 類型的 class 實例? 我可以做到嗎?

我嘗試:

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

但我不能為節點 x 左右制作 (>>=)。

謝謝你。

確切地說,您剛剛描述的類型沒有(好的)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)

兩年前,我在波士頓 Haskell談到了這個和其他樹結構,作為談論手指樹的引子。 那里的幻燈片可能有助於探索多葉樹和傳統二叉樹之間的區別。

我說沒有好的 monad 的原因是,任何這樣的 monad 都必須將樹變成規范的形式,以獲得給定數量的條目以通過 monad 法則或通過不將構造函數暴露到末尾來商出一些平衡問題用戶,但執行前者需要比從 AVL 或加權樹中獲得的更嚴格的重新排序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM