簡體   English   中英

折疊為二叉樹

[英]Fold for Binary Tree

我必須使二叉樹的實現實例化一個類型類:

class Set s where
    add :: (Eq a) => a -> s a -> s a
    remove :: (Eq a) => a -> s a -> s a
    exists :: (Eq a) => a -> s a -> Bool
    fold :: (a -> b -> b) -> s a -> b -> b

data BTree k v = Empty | Node k v (BTree k v) (BTree k v) deriving (Show)

一切順利,直到我必須為二叉樹實現折疊。 我遇到的問題是我真的不知道如何使用這樣的簽名來保持我的函數的類型聲明: (a -> b -> b) 我實現了折疊,但我的匿名函數的函數簽名有1個累加器和2個值:

foldBST :: (v -> a -> a -> a) -> a -> (BTree k v) -> a
foldBST _ startval Empty = startval
foldBST f startval (Node k v left right) = f v (foldBST f startval left) (foldBST f startval right)

我怎樣才能讓匿名函數有一個像(a -> b -> b)這樣的簽名? 除了在左右子項上遞歸調用fold之外,我可以做任何其他方式,但這將返回a類型a值。

我該怎么做呢?

您可以引入中間結果:

foldBST f startval (Node k v left right) = f v i
  where i = foldBST f j left
        j = foldBST f startval right

如果你不喜歡中間結果,你可以直接內聯它們。

暫無
暫無

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

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