[英]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.