以下是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)
答案 0 :(得分:28)
MakeCircle
是类型CircleInstance
的数据构造函数。数据构造函数只能与其定义类型一起导出。您可能还希望导出Circle
类方法getRadius
和setRadius
;使用当前导出列表,这些方法在此模块之外将不可用。
将导出列表更改为
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)