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类的方法getRadius和setRadius; 使用当前导出列表,这些方法将在此模块外部不可用.
将导出列表更改为
module Circle (Circle (..), CircleInstance (MakeCircle), getRadius, setRadius)
Run Code Online (Sandbox Code Playgroud)
这显示了两种出口形式.导出Circle (..)导出类型类Circle及其所有方法,同时CircleInstance (MakeCircle)导出类型构造函数CircleInstance并仅导出其数据构造函数MakeCircle.如果你要为MakeCircle添加一个新的数据构造函数,也许是一个UnitCircle,那么构造函数不会从模块中导出,除非你在导出列表中提及它(即CircleInstance (MakeCircle, UnitCircle))或使用导出的(..)形式.
导出列表不正确,应该是:
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)