Я хочу подсчитать, сколько элементов в дереве «уважают» определенное правило.Проверка того, сколько элементов дерева удовлетворяют предикату
Например:
Для типа данных:
data Tree = Leaf Int | Node Tree Int Tree
и функции подписи:
nSatisfy :: (Int->Bool) -> Tree -> Int
для ввода:
(>0) Tree
она должна вернуть значения tre е, которые (> 0).
Вот что я пробовал:
nSatisfy :: (Int->Bool) -> Tree -> Int
nSatisfy condition Leaf x = if condition x then 1 else 0
nSatisfy condition (Node left x right)
|(if condition x then 1 else 0) + nSatisfy condition Tree
| otherwise = nSatisfy condition left || nSatisfy condition right
Любая помощь?
UPDATE:
я нашел гораздо более простой способ сделать это:
nSatisfy :: (Int->Bool) -> Tree -> Int
nSatisfy n (Leaf x) = if n x then 1 else 0
nSatisfy n (Node left x right) = (if n x then 1 else 0) + (nSatisfy n left) + (nSatisfy n right)
Ваш синтаксис защиты испорчен, он должен быть '| = 'в каждой строке. Похоже, вы слишком много думали о вещах. Если у вас есть 'left' и' right' в качестве поддеревьев, вы просто хотите вызвать 'nSatisfy condition' на каждом из них, а затем добавить их вместе. Вы могли (и должны) делать это без охраны. –
bheklilr
'nSatisfy condition Лист x' должен быть' nSatisfy condition (Leaf x) ' – chi
проверить мое обновление @bheklilr – laker001