从模块导出

R71*_*R71 15 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)
Run Code Online (Sandbox Code Playgroud)

Joh*_*n L 29

MakeCircle是该类型的数据构造函数CircleInstance.数据构造函数只能与其定义类型一起导出.你可能也想导出Circle类的方法getRadiussetRadius; 使用当前导出列表,这些方法将在此模块外部不可用.

将导出列表更改为

module Circle (Circle (..), CircleInstance (MakeCircle), getRadius, setRadius)
Run Code Online (Sandbox Code Playgroud)

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


Chr*_*icz 5

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

module Circle(Circle, CircleInstance(MakeCircle), getRadius, setRadius)
Run Code Online (Sandbox Code Playgroud)

也许

module Circle(Circle, CircleInstance(..), getRadius, setRadius)
Run Code Online (Sandbox Code Playgroud)