在 GHC-7.7(和7.8)中引入了封闭类型族:
封闭类型族的所有等式都定义在一个地方,无法扩展,而开放式类型族可以在多个模块中具有实例。封闭类型族的优点是它的等式按顺序尝试,类似于术语级函数定义。
我想问您,为什么以下代码无法编译? GHC 应该能够推断出所有类型 - GetTheType 仅针对类型 X 定义,如果我们注释掉标记行,则代码可以编译。
这是 GHC 的 bug 还是封闭类型族尚未具备此类优化?
代码:
封闭类型族的所有等式都定义在一个地方,无法扩展,而开放式类型族可以在多个模块中具有实例。封闭类型族的优点是它的等式按顺序尝试,类似于术语级函数定义。
我想问您,为什么以下代码无法编译? GHC 应该能够推断出所有类型 - GetTheType 仅针对类型 X 定义,如果我们注释掉标记行,则代码可以编译。
这是 GHC 的 bug 还是封闭类型族尚未具备此类优化?
代码:
{-# 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