Невозможно использовать Show, даже если его реализует тип - PullRequest
0 голосов
/ 31 декабря 2018

Я не понимаю, почему i Show класс типов жалуется на использование пользовательского типа, поскольку я уже предоставил экземпляр для него:

Пользовательский тип

data Numeric=I Int | D Double 

instance Show Numeric where
        show (I x)=show x
        show (D y)=show y

 instance Num Numeric where
        (+) (I a) (I b) =I (a+b)
        (+) (D a) (I b) =D (a+ fromIntegral b)
        (+) (I a) (D b)=D (fromIntegral a+b)
        (-) (D a) (I b)= D (a- fromIntegral b)
        (-) (I a) (D b)=D(fromIntegral a -b)

Метод, который жалуется

arrayToString::Num a=>[a]->String
arrayToString arr =intercalate "," $ map show arr

Итак, учитывая мои type, который реализует классы типов Num и Show, я не понимаю, почему он отображает эту ошибку, когда я кормлю arrayToString a [Numeric] значение

Ошибка

* Could not deduce (Show a) arising from a use of `show'
      from the context: Num a
        bound by the type signature for:
                   arrayToString :: forall a. Num a => [a] -> String
        at Types.hs:40:5-37
      Possible fix:
        add (Show a) to the context of
          the type signature for:
            arrayToString :: forall a. Num a => [a] -> Strin

Ответы [ 2 ]

0 голосов
/ 31 декабря 2018

Проблема в том, что вы не используете свой пользовательский тип.

Заданная сигнатура типа arrayToString :: forall a. Num a => [a] -> String.Вы повсеместно определили количество для всех возможных типов a, которые являются членами класса типов Num.Это включает ваш тип, но также и любой другой числовой тип, который существует и будет существовать.Это слишком смелое утверждение.

Возможно, вы захотите изменить подпись на arrayToList :: [Numeric] -> String, используя ваш тип напрямую, вместо того, чтобы полагаться на параметрический полиморфизм.

Кроме того, в качестве побочнойобратите внимание, [] является односвязным списком (или списком консунов), а не массивом.

РЕДАКТИРОВАТЬ: Чтобы перевести эту проблему в логику, вы должны сказать

  • Существует набор вещей, называемых Numeric
  • Элементы Numeric являются членами классов Num и Show
  • Следовательно, для каждое возможноевведите когда-нибудь в классе Num, я могу превратить список этого типа в строку

Вы значительно расширили область действия оператора, чтобы он включал целую группутипов, о которых мы ничего не знаем и не имеем доказательств того, что они могут быть превращены в строки.

0 голосов
/ 31 декабря 2018

Если вы хотите что-то показать, используйте ограничение Show:

arrayToString :: (Show a) => [a] -> String

Я не понимаю, почему он отображает эту ошибку, когда я подаю arrayToString значение [Numeric]

Обратите внимание, что функция arrayToString не имеет ничего специфического для Num или Numeric.Все, что он делает, это отрисовывает строку для чего-либо Showable (через show).

...