Доступ к именованным полям в функции Haskell - PullRequest
3 голосов
/ 09 февраля 2010

Я определил тип данных Tree в Haskell и связанный метод 'size', который вычисляет количество элементов в дереве. Это работало и раньше, однако я обновил тип данных Tree для использования именованных полей, как показано в следующем определении:

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 просто говорит «Не в области: слева» и эквивалент для справа. Определение дерева находится в модуле, называемом деревом, а определение размера находится в модуле, называемом основным, но с неназванными полями у меня никогда не возникало проблем с областью видимости, когда речь шла о доступе к переменным из типа данных дерева.

1 Ответ

7 голосов
/ 09 февраля 2010

Ваш шаблон 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
...