Ответ 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 он был по умолчанию.