2010-12-11 8 views
20

Sto tentando di aggiungere una dichiarazione di istanza in Haskell per un nuovo tipo di dati che ho creato senza successo. Ecco quello che ho provato finora:Haskell: nuova istanza dichiarazione per Show

data Prediction = Prediction Int Int Int 
showPrediction :: Prediction -> String 
showPrediction (Prediction a b c) = show a ++ "-" ++ show b ++ "-" ++ show c 
instance Show (Prediction p) => showPrediction p 

Sembra l'ultima riga è sbagliato, ma non sono sicuro di come ottenere quello che voglio. Fondamentalmente è essere in grado di chiamare dall'interprete una variabile di previsione e visualizzarla senza dover chiamare showPrediction. In questo momento questo funziona:

showPrediction (Prediction 1 2 3) 

e mostra:

"1-2-3" 

come previsto, ma vorrei far funzionare tutto questo (dall'interprete):

Prediction 1 2 3 

Tutte le idee?

risposta

44

derivare un'istanza, la sintassi è

instance «preconditions» => Class «type» where 
    «method» = «definition» 

Quindi qui, ad esempio, avresti

instance Show Prediction where 
    show (Prediction a b c) = show a ++ "-" ++ show b ++ "-" ++ show c 

Non c'è alcuna condizione preliminare; lo useresti per qualcosa come instance Show a => Show [a] where ..., che dice che sea è visualizzabile, quindi lo è [a]. Qui, tutti gli Predictions sono visualizzabili, quindi non c'è nulla di cui preoccuparsi. Quando hai scritto instance Show (Prediction p) => showPrediction p, hai commesso alcuni errori. Innanzitutto, Prediction p implica che Prediction è un tipo parametrico (uno dichiarato da, ad esempio, data Prediction a = Prediction a a a), che non è. Secondo, Show (Prediction p) => implica che sePrediction P è visualizzabile, quindi si desidera dichiarare qualche altra istanza. E terzo, dopo lo =>, avere una funzione non ha senso: Haskell voleva un nome di classe di tipo.

Inoltre, per l'amor di completezza, c'è un altro modo per ricavare Show se si desidera che il formato Prediction 1 2 3 per l'uscita visualizzata:

data Prediction = Prediction Int Int Int deriving Show 

As specified in the Haskell 98 report, ci sono solo una manciata di tipi che può essere derivato in questo modo: Eq , Ord, Enum, Bounded, Show e Read.Con the appropriate GHC extensions, è anche possibile derivare Data, Typeable, Functor, Foldable e Traversable; è possibile derivare qualsiasi classe che un tipo avvolto da newtype ha derivato per un newtype; e puoi generare queste istanze automatiche in modo autonomo.

+0

++ risposta esaustiva di alta qualità. – delnan

+0

Grazie anche per la bella risposta! Anche il "Deriving Show" ha funzionato alla perfezione. Bello sapere ;)) –

10

Hai la sintassi per le istanze sbagliate. Per creare un'istanza di Show scrittura:

instance Show Foo where 
    show = ... 
    -- or 
    show x = ... 

dove ... contiene tua definizione della funzione show per Foo.

Quindi in questo caso si desidera:

instance Show Prediction where 
    show = showPrediction 

o, dal momento che non v'è un motivo importante per avere showPrediction affatto:

instance Show Prediction where 
    show (Prediction a b c) = show a ++ "-" ++ show b ++ "-" ++ show c 
+0

Yup, questo è stato. Grazie mille per la risposta! :)) –

4

Sostituisci la tua ultima linea con:

instance Show Prediction where 
    show = showPrediction 
Problemi correlati