Domanda

Ecco un codice tratto da http://www.angelfire.com/tx4/cus/shapes/haskell98.html . Compila ed esegue correttamente in Winghci se commento i nomi nell'intestazione del modulo. Ma se i nomi vengono mantenuti, non si compila: riporta un errore sul nome MakeCerrle. La mia domanda è: se voglio menzionare esplicitamente che voglio esportare makecircle, quali modifiche al codice sono richieste?

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)
È stato utile?

Soluzione

MakeCircle è un costruttore di dati per il tipo CircleInstance. I costruttori di dati possono essere esportati solo in combinazione con il loro tipo di definizione. Probabilmente vorrai anche esportare il Circle Metodi di classe getRadius e setRadius; Con l'elenco di esportazione corrente questi metodi non saranno disponibili al di fuori di questo modulo.

Cambia il tuo elenco di esportazioni in

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

Questo mostra due forme di esportazione. L'esportazione Circle (..) esporta la classe di tipo Circle e tutti i suoi metodi, mentre CircleInstance (MakeCircle) esporta il costruttore di tipo CircleInstance e solo il suo costruttore di dati MakeCircle. Se dovessi aggiungere un nuovo costruttore di dati per MakeCerrle, forse a UnitCircle, quel costruttore non verrebbe esportato dal modulo a meno che tu non lo menzioni nell'elenco di esportazione (cioè CircleInstance (MakeCircle, UnitCircle) ) o utilizzare il file (..) forma di esportazioni.

Altri suggerimenti

L'elenco di esportazione non è corretto, dovrebbe essere:

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

O forse

module Circle(Circle, CircleInstance(..), getRadius, setRadius)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top