2016-12-10 5 views
0

У меня есть реализация такого дерева:Размер дерева в haskell

data Tree a = Empty | Узел a [Дерево a] Получение

и мне нужно получить размер.

Я думаю, что этот код может решить эту проблему, но у меня есть ошибка:

size :: Tree a -> Int 
size Empty  = 0 
size (Node a ts) = 1 + [size t | t<-ts] 
+2

Вы пытаетесь добавить число и список. Можете ли вы придумать способ * суммировать * числа в списке? – molbdnilo

+0

, но такой список возвращает int no? – gon91

+1

Нет списков, которые «возвращают» int. Список - это список. – molbdnilo

ответ

2

Подсказка:

> 1 + [2,3,4] 
<interactive>:8:1: error: 
    • Non type-variable argument in the constraint: Num [t] 
     (Use FlexibleContexts to permit this) 
    • When checking the inferred type 
     it :: forall t. (Num [t], Num t) => [t] 

> 1 + sum [2,3,4] 
10 
1

Вы, очевидно, опечатка в коде.

Couldn't match expected type ‘Int’ with actual type ‘[Int]’ 
• In the expression: 1 + [size t | t <- ts] 
    In an equation for ‘size’: 
     size (Node a ts) = 1 + [size t | t <- ts] 

Поскольку вы хотите Int, вы должны найти способ, чтобы преобразовать ваш список Int к Int.

Другими словами, вы можете ввести отверстие, как это:

size :: Tree a -> Int 
size Empty   = 0 
size (Node a ts) = 1 + _g [size t | t<-ts] 

ведущее к сообщению об ошибке:

• Found hole: _g :: [Int] -> Int 
    Or perhaps ‘_g’ is mis-spelled, or not in scope 
• In the expression: _g 
    In the second argument of ‘(+)’, namely ‘_g [size t | t <- ts]’ 
    In the expression: 1 + _g [size t | t <- ts] 
• Relevant bindings include 
    ts :: [Tree a] 
     (bound at /Users/jeeb/incubator/scratch/app/Main.hs:10:14) 
    a :: a (bound at /Users/jeeb/incubator/scratch/app/Main.hs:10:12) 
    size :: Tree a -> Int 
     (bound at /Users/jeeb/incubator/scratch/app/Main.hs:9:1) 

В зависимости от того, что вы имеете в виду под «размером», вы должны быть в состоянии заменить g на правильную функцию.

1
size:: Tree a -> Int 
size Empty = 0 
size (Node a ts) = 1 + maximum[size t | t <- ts] 

вероятно вы хотите максимальный размер поддеревьев, поэтому я хотел бы использовать функцию предопределенный максимум, чтобы получить его после того, как преобразовать каждую ветвь в его размер.

+0

Это глубина, с максимумом. –

Смежные вопросы