Доступ к именованным полям в функции Haskell

StackOverflow https://stackoverflow.com/questions/2228873

  •  19-09-2019
  •  | 
  •  

Вопрос

Я определил древовидный тип данных в 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top