export from module

11,853

Solution 1

MakeCircle is a data constructor for the type CircleInstance. Data constructors can only be exported in combination with their defining type. You will probably also want to export the Circle class methods getRadius and setRadius; with the current export list those methods will be unavailable outside this module.

Change your export list to

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

This shows two forms of exporting. The export Circle (..) exports the type class Circle and all of its methods, while CircleInstance (MakeCircle) exports the type constructor CircleInstance and only its data constructor MakeCircle. If you were to add a new data constructor for MakeCircle, perhaps a UnitCircle, 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.

Solution 2

The export list is incorrect, it should be:

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

Or perhaps

module Circle(Circle, CircleInstance(..), getRadius, setRadius)
Share:
11,853
R71
Author by

R71

Updated on June 12, 2022

Comments

  • R71
    R71 about 2 years

    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)