esportazione dal modulo
-
13-11-2019 - |
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)
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)