Я изучаю классы типов 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
Как я могу это исправить?
Вы заметили часть ошибки, в которой говорится: «Используйте FlexibleInstances, если вы хотите отключить это»? Обычный Haskell является довольно ограничительным, особенно в классах классов; большинство современных программ используют несколько расширений, поэтому теперь компилятор часто предлагает, какое расширение нужно включить. – chi
@chi Yep Я сделал, но я думал, что 'ghci' хочет, чтобы я заменил ключевое слово' instance' на 'FlexibleInstances', которое оказалось фиктивным. – Wentao
А, я вижу :) Расширения включены, как в ответе ниже. – chi