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)
Était-ce utile?

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)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top