簡體   English   中英

玫瑰樹解構器

[英]Rose tree deconstructor

如果我們有玫瑰樹定義如下:

data Rose a = a :> [Rose a]

那么我知道:>是一個infix構造函數。 但是,您如何處理這種樹的元素? 如何遍歷它以訪問節點或提取子樹或元素?

您可以像這樣在構造函數上進行模式匹配(例如):

find :: (Eq a) => a -> Rose a -> Bool
find item (top :> rest)
  | item == top = True
  | otherwise = any (find item) rest

解決您的第二個問題:是的,您可以在無需進一步了解函子的情況下執行此操作,但是創建函子實例是有意義的,因為它將使您的數據結構更加靈活。 但是讓我們開始工作:處理每個節點的map看起來像這樣:

myMap :: (a -> b) -> Rose a -> Rose b
myMap f (node :> rest) = f node :> map (myMap f) rest

這很容易添加到仿函數類型類中,因為它確實可以實現我們想要的功能:

instance Functor Rose where
  fmap :: (a -> b) -> Rose a -> Rose b
  fmap = myMap
subtrees :: Rose a -> [Rose a]
subtrees (_ :> rs) = rs

label :: Rose a -> a
label (a :> _) = a

暫無
暫無

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

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