Haskell中的封闭类型族和类型推断

时间:2013-12-23 01:22:25

标签: haskell types ghc type-inference type-families

在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

1 个答案:

答案 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"