我正在尝试使用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
答案 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_tree
和reduce_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)
我是否正确理解了您的问题?