Подтвердить что ты не робот

Экспорт из модуля

Вот код, взятый из http://www.angelfire.com/tx4/cus/shapes/haskell98.html. Он компилируется и выполняется правильно в WinGHCi, если я комментирую имена в заголовке модуля. Но если имена сохраняются, то он не компилируется - он сообщает об ошибке в имени MakeCircle. Мой вопрос: если я хочу прямо указать, что я хочу экспортировать MakeCircle, какие изменения кода необходимы?

module Circle -- (Circle, MakeCircle, getRadius, setRadius)
  where
  import Shape

  class Shape a => Circle a where
      getRadius :: a -> Int
      setRadius :: a -> Int -> a

  instance Shape CircleInstance where
      getX = x
      getY = y
      setX a newx = a {x = newx}
      setY a newy = a {y = newy}
      moveTo a newx newy = a {x = newx, y = newy}
      rMoveTo a deltax deltay = a {x = ((getX a) + deltax), y = ((getY a) + deltay)}
      draw a =
         putStrLn ("Drawing a Circle at:(" ++ (show (getX a)) ++ "," ++ (show (getY a)) ++
            "), radius " ++ (show (getRadius a)))

   instance Circle CircleInstance where
      getRadius = radius
      setRadius a newradius = a {radius = newradius}

   data CircleInstance = MakeCircle {x, y, radius :: Int}
      deriving(Eq, Show)
4b9b3361

Ответ 1

MakeCircle является конструктором данных для типа CircleInstance. Конструкторы данных могут экспортироваться только в сочетании с их определяющим типом. Вероятно, вы также захотите экспортировать методы класса Circle getRadius и setRadius; с текущим списком экспорта эти методы будут недоступны вне этого модуля.

Измените свой список экспорта на

module Circle (Circle (..), CircleInstance (MakeCircle), getRadius, setRadius)

Это показывает две формы экспорта. Экспорт Circle (..) экспортирует класс типа Circle и все его методы, а CircleInstance (MakeCircle) экспортирует конструктор типа CircleInstance и только его конструктор данных MakeCircle. Если бы вы добавили новый конструктор данных для MakeCircle, возможно, UnitCircle, этот конструктор не будет экспортирован из модуля, если вы не укажете его в списке экспорта (т.е. CircleInstance (MakeCircle, UnitCircle)) или не используйте форму (..) экспорта.

Ответ 2

Список экспорта неверен, он должен быть:

module Circle(Circle, CircleInstance(MakeCircle), getRadius, setRadius)

Или, возможно,

module Circle(Circle, CircleInstance(..), getRadius, setRadius)