2010-12-11 4 views
20

Я пытаюсь добавить объявление экземпляра в Haskell для нового типа данных, который я создал неудачно. Вот что я пробовал до сих пор:Haskell: объявление нового экземпляра для 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 

Кажется, последняя строка неверна, но я не уверен, как добиться того, чего я хочу. В основном это возможность вызывать из интерпретатора переменную Prediction и визуализировать ее без необходимости вызова showPrediction. Сейчас это работает:

showPrediction (Prediction 1 2 3) 

и показывает:

"1-2-3" 

, как и ожидалось, но я хотел бы, чтобы это работало (от переводчика):

Prediction 1 2 3 

Есть идеи?

ответ

44

Чтобы получить экземпляр, синтаксис

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

Так вот, например, у вас было бы

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

Нет предусловий; вы использовали бы это для чего-то вроде instance Show a => Show [a] where ..., в котором говорится, что , еслиa можно пометить, то и [a]. Здесь все Predictions являются доступными, так что не о чем беспокоиться. Когда вы написали instance Show (Prediction p) => showPrediction p, вы сделали несколько ошибок. Во-первых, Prediction p подразумевает, что Prediction является параметризованным (одно объявлено, например, data Prediction a = Prediction a a a), которого нет. Во-вторых, Show (Prediction p) => подразумевает, что , еслиPrediction P можно показать, затем вы хотите объявить какой-либо другой экземпляр. И в-третьих, после =>, имея функцию бессмысленно, Haskell хотел имя класса типа.

Кроме того, для полноты картины, есть еще один способ получить Show если вы хотите формат Prediction 1 2 3 для отображения вывода:

data Prediction = Prediction Int Int Int deriving Show 

As specified in the Haskell 98 report, есть только несколько типов, которые могут быть получен следующим образом: Eq , Ord, Enum, Bounded, Show, и Readthe appropriate GHC extensions вы также можете получить Data, Typeable, Functor, Foldable и Traversable; вы можете получить любой класс, который был обернут newtype, полученный для newtype; и вы можете создавать эти автоматические экземпляры автономно.

+0

++ высококачественный, углубленный, всесторонний ответ. – delnan

+0

Спасибо за хороший ответ! «Получение шоу» отлично работало. Приятно знать ;)) –

10

У вас есть синтаксис для экземпляров неправильно. Чтобы создать экземпляр Show записи:

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

где ... содержит ваше определение show функции для Foo.

Таким образом, в этом случае вы хотите:

instance Show Prediction where 
    show = showPrediction 

или, поскольку не является важной причиной, чтобы иметь showPrediction вообще:

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

Да, это был он. Большое спасибо за ответ! :)) –

4

Замените последнюю строку с:

instance Show Prediction where 
    show = showPrediction 
Смежные вопросы