从模块导出

时间:2012-01-24 08:25:47

标签: haskell haskell-platform

以下是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 个答案:

答案 0 :(得分:28)

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

将导出列表更改为

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

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

答案 1 :(得分:4)

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

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

或者

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