экспорт из модуля - PullRequest
       13

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

15 голосов
/ 24 января 2012

Вот код, взятый из 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)

Ответы [ 2 ]

28 голосов
/ 24 января 2012

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

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

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

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

4 голосов
/ 24 января 2012

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

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

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

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