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

Как написать выводимый класс?

У меня есть это

data Something = Something Integer deriving (MyClass, Show)

class MyClass a where   
    hello :: MyClass a => a -> a

instance MyClass Integer where
    hello i = i + 1

main = print . hello $ Something 3

но MyClass не выводится. Зачем?

4b9b3361

Ответ 1

GHC не может магически выводить экземпляры для произвольных типов данных. Однако это может использовать тот факт, что объявления newtype создают новое имя для один и тот же базовый тип для вывода экземпляров для тех, кто использует GeneralizedNewtypeDeriving расширение. Итак, вы можете сделать что-то вроде этого:

{-# LANGUAGE GeneralizedNewtypeDeriving #-}

newtype Something = Something Integer deriving (MyClass, Show)

class MyClass a where
    hello :: MyClass a => a -> a

instance MyClass Integer where
    hello i = i + 1

main = print . hello $ Something 3

Причина, по которой GHC не может получить новый экземпляр, заключается в том, что он не знает, что такое экземпляр должно быть. Даже если у вашего типа данных есть только одно поле, это может быть необязательно как это поле. Способность выводить экземпляры для newtype удобна, поскольку они обычно используются для обеспечения различного поведения для определенных типов классов или как способ используйте систему типов для разделения вещей, которые имеют один и тот же тип, но разные применения в вашем коде.

Ответ 2

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