Подтвердить что ты не робот

Haskell: объявление нового экземпляра для Show

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

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

Любые идеи?

4b9b3361

Ответ 1

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

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

Как указано в отчете Haskell 98, существует только несколько типов, которые могут быть получены следующим образом: Eq, Ord, Enum, Bounded, Show и Read. С соответствующими расширениями GHC вы также можете получить Data, Typeable, Functor, Foldable и Traversable; вы можете получить любой класс, для которого a newtype завернутый тип, полученный для newtype; и вы можете создавать эти автоматические экземпляры автономно.

Ответ 2

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

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

Ответ 3

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

instance Show Prediction where
    show = showPrediction