在GHC-7.7(和7.8)中引入了封闭式家庭:
封闭型族在一个地方定义了所有方程式 不能扩展,而开放的家庭可以扩散 跨模块。封闭族的优点在于它的方程式 按顺序尝试,类似于术语级功能定义
我想问你,为什么以下代码无法编译? GHC应该能够推断出所有类型 - GetTheType
仅针对类型X
定义,如果我们注释掉标记的行,代码就会编译。
这是GHC中的错误还是封闭类型的家庭没有这样的优化YET?
代码:
{-# 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
答案 0 :(得分:11)
封闭式家庭没有任何问题。问题是类型函数不是单射的。
说,你可以拥有这个封闭式的功能:
data X = X
data Y = Y
type family GetTheType a where
GetTheType X = X
GetTheType Y = X
您无法从结果类型X
推断出参数类型。
数据系列是单射的,但不是封闭的:
{-# LANGUAGE TypeFamilies #-}
data X = X
data family GetTheType a
data instance GetTheType X = RX
class TC a where
tc :: (GetTheType a) -> Int
instance TC X where
tc RX = 5
main = do
let x = tc RX
print "hello"