2016-10-11 6 views
-1

я определить тип дерева как:Haskell: функция leafCount выход взять Tree Int используя кратное удовольствие

data Tree a = Leaf | Node a (Tree a) (Tree a) 
     deriving (Show, Eq) 

Вот складка функция: How to write a function of type a-> b -> b -> b for folding a tree, в основном так же, как то, что я с помощью.

Теперь я хочу написать функцию leafCount :: Tree a -> Integer, используя сгиб и не более, одну вспомогательную функцию, я думаю, что мне нужно различать лист и узел в другой ситуации, но я борюсь с этим, вот мой код:

leafCount = fold sum (Node a left right) 
      where 
      sum left right elem = leafCount left + leafCount right + 1 

В этом коде есть много ошибок, которые я не могу понять вообще. Пожалуйста, дайте мне основную идею и код, который может улучшить мой.

+0

Учитывая, что это домашнее задание, я не уверен, что вы должны искать эту помощь из StackOverflow ... Возможно, вы могли бы сформулировать вопрос о конкретной ошибке, которую вы получаете? – Alec

+0

@Alec хорошо, мне сказали, что не в области a, слева и справа. – o1xhack

+0

@ o1xhack один из способов остаться чистым (во время разработки haskell) заключается в том, чтобы добавлять сигнатуры типов ко всем вашим (верхним уровням) функциям, и если что-то не в масштабах - вы можете попытаться добавить его в левой части вашего определение функции. Еще один намек, который я хочу дать - 'sum' - это что-то уже определенное - вы затеняете исходное определение, которое обычно плохое. Включите '-Wall' при компиляции - это сэкономит вам много хлопот в долгосрочной перспективе. – epsilonhalbe

ответ

0

Это очень просто на самом деле, я забыл добавить базовый случай функции кратного при его использовании!

После того, как я читаю складки и спрашиваю другого человека, я это понимаю!

1

Вашей непосредственная проблема заключается в том, что вы делаете по шаблону на изнаночной стороне =:

leafCount (Node a left right) = fold sum left right a 
     where sum l r elem = leafCount left + leafCount right + 1 
+0

Возможно, нам следует пояснить, что это не исправляет код, есть другие проблемы, которые должен решить OP. – chi