折叠为二叉树

时间:2013-10-24 12:34:27

标签: haskell binary-search-tree fold

我必须实现二叉树实例化类型类:

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的值。

我将如何做到这一点?

1 个答案:

答案 0 :(得分:8)

您可以引入中间结果:

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

如果你不喜欢中间结果,你可以直接内联它们。