2016-09-02 3 views
2

Я изучаю классы типов Haskell через UPENN Haskell lecture notes, делая свой собственный класс типа с примерами кода:Declare список экземпляра типа класса

class Listable a where 
    toList :: a -> [Int] 

instance Listable Int where 
    toList x = [x] 

instance Listable Bool where 
    toList True = [1] 
    toList False = [0] 

Он работает с Int и Bool но ghci терпит неудачу, когда я добавить экземпляр из [Int]:

instance Listable [Int] where 
    toList = id 

Ошибки:

Illegal объявление экземпляра для 'неперечислимо [Int]

(Все типы экземпляра должны иметь форму (T a1 ... ап)

где a1 ... ап различные переменные типа,

и каждая переменная типа появляется не более одного раза в голове экземпляра.

Используйте FlexibleInstances, если вы хотите отключить эту функцию)

В объявлении экземпляра для 'неперечислимо [Int]'

я стараюсь несколько раз, но все FAIL:.

toList x = id x 
toList x = x 
toList = \x -> x 

Как я могу это исправить?

+0

Вы заметили часть ошибки, в которой говорится: «Используйте FlexibleInstances, если вы хотите отключить это»? Обычный Haskell является довольно ограничительным, особенно в классах классов; большинство современных программ используют несколько расширений, поэтому теперь компилятор часто предлагает, какое расширение нужно включить. – chi

+0

@chi Yep Я сделал, но я думал, что 'ghci' хочет, чтобы я заменил ключевое слово' instance' на 'FlexibleInstances', которое оказалось фиктивным. – Wentao

+0

А, я вижу :) Расширения включены, как в ответе ниже. – chi

ответ

2

Просто добавьте следующую строку в верхней части исходного файла

{-# LANGUAGE FlexibleInstances #-} 

Это позволит FlexibleInstances расширения, которое необходимо для экземпляра заявления о такой форме, как Haskell 98 не позволяют им.

Обратите внимание, что вы можете также включить расширение путем добавления -XFlexibleInstances флаг при вызове ghc или ghci, но это считается плохой практикой, чтобы сделать это, поскольку это даст возможность расширения для всех модулей. Это также означает, что ваша программа будет успешно компилироваться в зависимости от флагов командной строки, переданных компилятору. Поэтому рекомендуется включить расширения для каждого модуля, как я объяснил выше.