2015-03-13 2 views
0
class Hello a where 
    method1 :: a -> String 
    method1 a = "Hello" 

data World s = World [s] 

instance Hello a => World a where 
    method1 a = "Hello World" 

Я получаю следующее сообщение об ошибке при загрузке коды в Haskell:Compile Ошибки при инстанцируют классы

«method1» не является (видимым) метод класса «World»

Могли кто-нибудь скажет мне, где ошибка?

Спасибо.

+2

'World' не является классом. Вы вместо этого означали 'instance Hello a => Hello (World a) где ...'? – bheklilr

+0

@bheklilr Да, я сделал. Благодарю. – User137481

ответ

1

instance не имеет смысла. Экземпляр задается для типа. Возможное исправление:

instance Hello (World a) where 
    method1 _ = "Hello World" 

An instance сделки с указанием того, как тип (или список типов) отображает на классе, так что если у вас есть класс C с параметрами a, вы можете указать:

class C a where 
    foo :: a -> a 

Теперь вы не много покупаете с этим, потому что вы никогда не говорили, какие a действительно применимы для C. С instance вы указываете, что данный тип (эти типы могут быть «общий») применимы к C, так что в следующем вы можете сказать:

instance C a where 
    foo = id 

Здесь вы в основном говорят, каждый тип a (при этом все типы) являются экземплярами C. И что foo следует рассматривать как функцию id.

Иногда вы хотите установить дополнительные ограничения на a, a должен, например, создать экземпляр другого класса. Например, с

instance (Integral i) => C i where 
    foo = (+) 1 

Здесь вы говорите, что все интегральные типы i являются экземплярами C с foo определяется как функция приращения. Обратите внимание, что вы не можете просто комбинировать этот и предыдущий экземпляр, потому что Haskell не знает, что выбрать в этом случае.

Или, возможно, вы имели в виду, чтобы определить, как экземпляр @bheklilr предлагает:

instance (Hello a) => Hello (World a) where 
    method1 _ = "Hello World" 
Смежные вопросы