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

Строка кода Haskell, не компилируемая: "Недопустимый контекст типа данных"

Я не могу получить эту строку кода, скомпилированную в Haskell, но она работает на моей системе профессора. Я использую ghci версию 7.6.2.

data Eq a => Shape a = Shape a

Точнее, это ошибка, которую я получаю

[1 of 1] Compiling Main             ( test.hs, interpreted )

test.hs:1:6:
Illegal datatype context (use -XDatatypeContexts): Eq a =>
Failed, modules loaded: none.

Какая ошибка здесь?

Спасибо

4b9b3361

Ответ 1

Возможно, ваш профессор использует старую версию GHC. В строке, которую вы опубликовали, используется функция, которая была недавно удалена. Возможные решения:

  • Удалите Eq a => и напишите data Shape a = Shape a.

  • Как говорит GHC, дайте флагов -XDatatypeContexts для повторного включения удаленной функции.

Более подробно: часть Eq a => вашего объявления типа называется контекстом типа данных. Его единственная функция - ограничить тип конструктора Shape, так что вместо Shape :: a -> Shape a вы получите Shape :: Eq a => a -> Shape a. Это не избавляет вас от необходимости писать Eq a в типе подписей с участием Shape s, и даже даже потребует, чтобы вы их записали, когда вам это не понадобилось. Когда-то было полезно, когда строгие поля в datatypes требовали ограничения класса, но эта функция была удалена давно.

Короче говоря, просто удаление контекста почти всегда является улучшением для вашей программы, поэтому они были удалены из стандартного языка Haskell 2011. Поскольку GHC 7.0.1 была возможность отключить их, а с 7.2.1 он был по умолчанию.

Ответ 2

Я думаю, что сообщение об ошибке ясно в том, что он говорит. Для этого вам требуется расширение.

{-# LANGUAGE DatatypeContexts #-}
data Eq a => Foo a = Foo a

Хотя это расширение использовалось по умолчанию, но начиная с ghc 7.6, его использование считается устаревшим и будет удалено в будущем. Таким образом, ваш профессор может использовать более старую версию ghc.

Ответ 3

См. также fooobar.com/info/238221/..., в котором объясняется "Почему?". за изменением языка, а также показом примера GADT, который должен предоставлять какие-то контексты типов данных.