使用haskell查找要列出的树的总和

时间:2015-11-20 03:33:54

标签: haskell

我正在尝试使用id函数应用sum,同时为程序提供输入。但我在下面。任何指导都非常感谢。

(j==i)

输入如下:

data Tree a = Leaf a | Node (Tree a) a (Tree a) deriving (Eq, Show)
reduce_tree :: Tree a -> (a -> b) -> (b -> a -> b -> b) -> b
reduce_tree (Leaf v) = [v]
reduce_tree (Node left root right) = reduce_tree left ++ [root] ++   reduce_tree right

2 个答案:

答案 0 :(得分:3)

由于我完全不理解你的问题,所以这里有一些观察:

  • reduce_tree的类型签名表明它应该有比你提供的更多的参数。

    如果f是将类型a的值映射到类型b的值的函数,则g似乎是三个参数的累加函数(虽然我不确定为什么两个还不够,但

    reduce_tree :: Tree a -> (a -> b) -> (b -> a -> b -> b) -> b
    reduce_tree (Leaf v) f g = ...
    reduce_tree (Node left v right) f g = ...
    
  • 如果reduce_tree实际上是一个reduce函数,而不是简单地将树展平为列表的函数,那么您可以从Data.Foldable中汲取灵感。

    data Tree a = Leaf a | Node (Tree a) a (Tree a) deriving (Show, Eq)
    
    treefold :: (a -> b -> b) -> b -> Tree a -> b
    treefold f acc (Leaf x) = f x acc
    treefold f acc1 (Node left x right) =
      let acc2 = treefold f acc1 right
          acc3 = f x acc2
          acc4 = treefold f acc3 left
      in acc4
    

    使用这样的功能,您可以展平或求和树的元素:

    flattenTree :: Tree a -> [a]
    flattenTree tree = treefold (:) [] tree
    
    sumTree :: Num a => Tree a -> a
    sumTree tree = treefold (+) 0 tree
    
  • 当你说'#34;使用id函数"也许你希望使用延续。这已经在例如Haskell: tail recursion version of depth of binary tree,简明扼要地Tail-recursion on trees(标准ML)。 Haskell的等价物是:

    treefold :: (a -> b -> b) -> b -> Tree a -> b
    treefold f acc tree = tf f acc tree id
      where
        tf f acc (Leaf x) k = k (f x acc)
        tf f acc (Node left x right) old_k = tf f left acc new_k
          where
            new_k = \acc -> tf f right (f x acc) old_k
    

    现在可以用与以前完全相同的方式定义sumTree,除了它将使用折叠以及身份函数作为初始延续。或者,如果您想自己使用函数tf提供遍历函数,则可以将辅助函数id提取到顶层。

答案 1 :(得分:2)

哦,如果我理解正确,我想你只是想把你的例子输入ghci。我建议将复杂性放在文件中:

sum_tree :: Tree Int -> Int
sum_tree t = reduce_tree t id sum
    where sum t1 v t2 = t1 + v + t2

然后在ghci中,在您加载了sum_treereduce_tree定义的文件后,

ghci> sum_tree (VNode (VLeaf 1) 2 (VNode (VLeaf 3) 4 (VLeaf 5))

如果您必须在ghci中完成所有操作,请注意,您通常不能在ghci中使用where,因为where仅用于定义。请改用let ... in

ghci> let sum t1 v t2 = t1 + v + t2 in reduce_tree (VNode (VLeaf 1) 2 (VNode (VLeaf 3) 4 (VLeaf 5))) id sum

如果您因某些原因不想使用let,可以使用lambda:

ghci> reduce_tree (VNode (VLeaf 1) 2 (VLeaf 3)) id (\t1 v t2 -> t1 + v + t2)

我是否正确理解了您的问题?