В GHC-7.7 (и 7.8) были введены семейства закрытого типа:
В семействе закрытого типа все уравнения определены в одном месте и не могут быть расширены, в то время как в семействе открытого типа экземпляры могут быть распределены по модулям. Преимущество закрытого семейства заключается в том, что его уравнения проверяются по порядку, аналогично определению функции на уровне терминов.
Я хочу спросить вас, почему следующий код не компилируется? GHC должен иметь возможность выводить все типы — GetTheType
определен только для типа X
, и если мы закомментируем отмеченную строку, код скомпилируется.
Это баг в GHC или в семействах закрытого типа пока нет таких оптимизаций?
код:
{-# LANGUAGE TypeFamilies #-}
data X = X
type family GetTheType a where
GetTheType X = X
class TC a where
tc :: GetTheType a -> Int
instance TC X where
tc X = 5
main = do
-- if we comment out the following line, the code compiles
let x = tc X
print "hello"
И ошибка:
Couldn't match expected type ‛GetTheType a0’ with actual type ‛X’
The type variable ‛a0’ is ambiguous
In the first argument of ‛tc’, namely ‛X’
In the expression: tc X