Я пытаюсь сделать функцию, которая суммирует значения не двоичного целого дерева.Суммирование целочисленного дерева (Haskell)
-- 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 х) + (addNum хз)'. Не работает. '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' – user2407038