Доступ к именованным полям в функции Haskell
Вопрос
Я определил древовидный тип данных в Haskell и связанный с ним метод 'size', который вычисляет количество элементов в дереве.Это работало раньше, однако я обновил древовидный тип данных, чтобы использовать именованные поля, как в следующем определении:
data Tree a = Empty
| Leaf {value::a}
| Node {left :: (Tree a), value :: a, right :: (Tree a)}
deriving (Eq, Ord, Show)
Я обнаружил (поиграв в GHCi), что я могу получить доступ к именованному полю, используя функцию (слева n), например.Однако, когда я пытаюсь использовать эту функцию, я получаю сообщение об ошибке:
size :: Tree a -> Int
size Empty = 0
size (Leaf l) = 1
size (Node n) = size (left n) + 1 + size (right n)
GHCi просто говорит: "Не входит в сферу применения:слева" и эквивалент для правого.Определение дерева находится в модуле под названием Tree, а определение размера - в модуле под названием Main , но с безымянными полями у меня никогда не возникало проблем с областью видимости, когда дело доходило до доступа к переменным из типа данных Tree.
Решение
Ваш size (Node n)
шаблон должен иметь правильный конструктор.В вашем коде n
извлекает левый элемент.
Попробуйте это (если вы действительно хотите использовать именованные шаблоны):
size n@(Node _ _ _) = size (left n) + 1 + size (right n)
Или даже:
size n@(Node {}) = size (left n) + 1 + size (right n)
Или вы можете извлечь метки из шаблона:
size (Node {left=l, right=r}) = size l + 1 + size r
или просто игнорируйте ярлыки:
size (Node l _ r) = size l + 1 + size r