Алгебраические типы - Haskell - PullRequest
3 голосов
/ 23 апреля 2019

Я работаю с алгебраическими типами в Haskell, выполняя некоторые упражнения из рабочего листа.Я получил следующие упражнения:

  1. Определить алгебраический тип Point для представления (координат) точек в двумерном пространстве.

Мой код для этого упражнения:

data Point = Point Float Float
  deriving (Show)
Используя Point, определите измененную версию PositionedShape типа данных Shape, которая включает в себя центральную точку фигуры, в дополнение к ее измерениям.

Ранее определенные данные формы:

data Shape = Circle Float |
             Rectangle Float Float
             deriving (Show)

Мой код для этого упражнения:

data PositionedShape = PositionedShape Shape Point
  deriving (Show)

Теперь у меня возникает вопрос:

Определить функцию:

haskell move :: PositionedShape -> Float -> Float -> PositionedShape

, которая перемещает фигуру на заданные расстояния x и y

Myреализация для этого была следующей:

move :: PositionedShape -> Float -> Float -> PositionedShape
move (Shape (Point x y)) newX newY = Shape (Point newX newY)

Это возвращает мне эту ошибку:

Week8.hs: 103: 7: ошибка: Не в области: конструктор данных 'Shape' Сбой, загруженные модули: нет.

Может кто-нибудь объяснить, почему эта ошибка и как я могу ее исправить?Я немного путаюсь с алгебраическими типами, я много чего пробовал, но кажется, что не могу найти решение.

Ответы [ 3 ]

5 голосов
/ 23 апреля 2019

Вам нужно сопоставить шаблон с конструкторами данных (например, Circle и Rectangle), а не с конструкторами типов, как вы пытаетесь сделать сейчас (например, Shape). Для PositionedShape они имеют одно и то же имя, хотя вы полностью забыли совпадение с этим (и на самом деле вам вообще не нужно заботиться о внутреннем Shape, кроме как для его копирования). Кроме того, move предназначено для перемещения фигуры на заданные расстояния, а не для перемещения ее в новую заданную позицию;.

3 голосов
/ 23 апреля 2019

Вам нужно использовать конструктор PositionedShape для разделения PositionedShape Вместо этого вы использовали конструктор Shape.

Попробуйте начать с:

move (форма PositionedShape (точка old_x old_y)) [...]

2 голосов
/ 23 апреля 2019

Как насчет

move (PointedShape s (Point x y)) dx dy = PointedShape s (Point (x+dx) (y+dy))
...