19

这是取自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)
4

2 回答 2

31

MakeCircle是类型的数据构造函数CircleInstance。数据构造函数只能与其定义类型一起导出。您可能还想导出Circle类方法getRadiussetRadius; 对于当前的导出列表,这些方法将在此模块之外不可用。

将您的导出列表更改为

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

这显示了两种导出形式。导出Circle (..)导出类型类Circle及其所有方法,而CircleInstance (MakeCircle)导出类型构造函数CircleInstance和仅导出其数据构造函数MakeCircle。如果您要为 MakeCircle 添加一个新的数据构造函数,也许是 a ,除非您在导出列表(即)中提及它或使用导出的形式,UnitCircle否则该构造函数不会从模块中导出。CircleInstance (MakeCircle, UnitCircle)(..)

于 2012-01-24T08:51:24.007 回答
5

导出列表不正确,应该是:

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

也许

module Circle(Circle, CircleInstance(..), getRadius, setRadius)
于 2012-01-24T08:53:48.920 回答