Here is a code taken from http://www.angelfire.com/tx4/cus/shapes/haskell98.html . It compiles and executes correctly in WinGHCi if I comment the names in the module header. But if the names are kept then it does not compile - it reports an error on the name MakeCircle. My question is: if I want to explicitly mention that I want to export MakeCircle, what code changes are required?
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)
MakeCircleis a data constructor for the typeCircleInstance. Data constructors can only be exported in combination with their defining type. You will probably also want to export theCircleclass methodsgetRadiusandsetRadius; with the current export list those methods will be unavailable outside this module.Change your export list to
This shows two forms of exporting. The export
Circle (..)exports the type classCircleand all of its methods, whileCircleInstance (MakeCircle)exports the type constructorCircleInstanceand only its data constructorMakeCircle. If you were to add a new data constructor for MakeCircle, perhaps aUnitCircle, that constructor wouldn't be exported from the module unless you either mention it in the export list (i.e.CircleInstance (MakeCircle, UnitCircle)) or use the(..)form of exports.