【发布时间】:2015-12-20 05:17:23
【问题描述】:
我正在尝试创建一个对非二进制整数树的值求和的函数。
-- datastructures.hs
data Tree a = Empty | Node a [Tree a] deriving (Eq, Show)
myNums :: (Num a) => Tree a
myNums = Node 1 [
Node 2 [
Node 4 [Empty], Node 5 [Empty]
],
Node 3 [
Node 6 [Empty], Node 7 [Empty], Node 8 [Empty]
]
]
addNums :: (Num a) => Tree a -> a
addNums Empty = 0
addNums (Node n [Empty]) = n
addNums (Node n (x:xs)) = n + (addNums x) + (addNums xs)
理想情况下,我希望 addNums myNums 成为 36,但这会产生错误:
datastructures.hs:20:54:
Couldn't match expected type ‘Tree a’ with actual type ‘[Tree a]’
Relevant bindings include
xs :: [Tree a] (bound at datastructures.hs:20:20)
x :: Tree a (bound at datastructures.hs:20:18)
n :: a (bound at datastructures.hs:20:15)
addNums :: Tree a -> a (bound at datastructures.hs:18:1)
In the first argument of ‘addNums’, namely ‘xs’
In the second argument of ‘(+)’, namely ‘(addNums xs)’
我该如何应对,最佳做法是什么?
编辑:最佳实践似乎完全省略了Empty!我忘了[] 是[Tree a] 类型的有效实例。所以最好的实现方式是:
data Tree a = Node a [Tree a] deriving (Eq, Show)
addNums :: (Num a) => Tree a -> a
addNums (Node n []) = n
addNums (Node n (x:xs)) = n + (addNums x) + addNums (Node 0 xs)
【问题讨论】:
-
(addNum x) + (addNum xs)。不能工作。x和xs在这里是不同的类型。 -
这也不起作用:
addNums (Node n (x:xs)) = n + (addNums x) + foldl1 (\ acc t -> acc + addNums t) xs -
addNums (Node n xs) = foldl (\a -> (+) a . addNums) n xs -
另请注意,您的树具有冗余表示。
Node 1 []和Node 1 [Empty]和Node 1 [Empty,Empty,Empty]都代表同一棵树。也许你想改变它,或者至少处理[]的情况。 -
@MarkKaravan 请注意,如果您删除
Empty,每棵树都必须包含至少一个元素n。
标签: haskell data-structures tree