Exportation du module
-
13-11-2019 - |
Question
Voici un code tiré de http://www.angefire.com/tx4/cus/shapes/haskell98.html . Il compile et s'exécute correctement dans WingHCI si je commente les noms dans l'en-tête du module. Mais si les noms sont conservés, il ne compile pas - il signale une erreur sur le nom makeCircle. Ma question est: si je veux mentionner explicitement que je souhaite exporter makeCircle, quels modifications de code sont requises?
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)
La solution
MakeCircle
est un constructeur de données Pour le type CircleInstance
. Les constructeurs de données ne peuvent être exportés qu'en combinaison avec leur type de définition. Vous voudrez probablement aussi exporter le Circle
Méthodes de classe getRadius
et setRadius
; Avec la liste d'exportation actuelle, ces méthodes ne seront pas disponibles en dehors de ce module.
Modifiez votre liste d'exportation vers
module Circle (Circle (..), CircleInstance (MakeCircle), getRadius, setRadius)
Cela montre deux formes d'exportation. L'exportation Circle (..)
exporte la classe de type Circle
et toutes ses méthodes, tandis que CircleInstance (MakeCircle)
Exporte le constructeur de type CircleInstance
Et seulement son constructeur de données MakeCircle
. Si vous deviez ajouter un nouveau constructeur de données pour makecircle, peut-être un UnitCircle
, ce constructeur ne serait pas exporté du module à moins que vous ne le mentionniez dans la liste d'exportation (c'est-à-dire CircleInstance (MakeCircle, UnitCircle)
) ou utiliser le (..)
forme d'exportations.
Autres conseils
La liste des exportations est incorrecte, il devrait être:
module Circle(Circle, CircleInstance(MakeCircle), getRadius, setRadius)
Ou peut-être
module Circle(Circle, CircleInstance(..), getRadius, setRadius)