【发布时间】:2013-08-22 00:29:19
【问题描述】:
hmatrix 包包含以下类型族代码:
type family BoundsOf x
type instance BoundsOf (a->a) = Int
type instance BoundsOf (a->a->a) = (Int,Int)
在 GHC 7.6 上,这编译得很好。
在 GHC 7.7(导致 7.8)上,我们得到:
lib/Numeric/ContainerBoot.hs:515:15:
Conflicting family instance declarations:
BoundsOf (a -> a) -- Defined at lib/Numeric/ContainerBoot.hs:515:15
BoundsOf (a -> a -> a)
-- Defined at lib/Numeric/ContainerBoot.hs:516:15
这里的“冲突”是什么意思?我看不出这些实例的问题。
更新:这是一个最小的例子Test.hs:
{-# LANGUAGE TypeFamilies #-}
module Test where
type family BoundsOf x
type instance BoundsOf (a->a) = Int
type instance BoundsOf (a->a->a) = (Int,Int)
尝试一下:
ghci Test.hs # 7.6, all fine
ghci-7.7 Test.hs # fails
【问题讨论】:
-
确实看起来像一个错误。
-
一个叫做 goldfire 的人在 GHC 票证中添加了一个很好的解释,说明为什么这不应该起作用。
-
我可以看到一个理解金火的评论,但我觉得它令人不安。对于
a的任何有限实例化,类型(a->a)和(a->a->a)不能相同。所以应该没问题。但事实并非如此,这意味着无限类型必须潜入 ghc。 -
@augustss 如果我对评论的理解正确,那么您可以写
type instance Family (OthertypeFamily a),并且由于OtherTypeFamily不是类型构造函数而只是类型函数,因此TyFun a a = TyFun a (TyFun a)可能。那么问题将是解析type instance Family (T a b)的代码不知道T是类型构造函数还是类型族。我不知道能够将类型族用于其他族实例是否是个好主意,但似乎有人认为这是
标签: haskell type-families