【发布时间】:2012-09-25 01:32:19
【问题描述】:
我的问题是关于如何将等式约束放入关联的类型约束(即类型约束)
具体用例是一个由部分应用类型参数化的类:
class Foo c where -- c has kind *->*->*
type Ctx c m r :: Constraint
f :: (Ctx c m r) => c m r -> c m r
在一个特定的例子中,我想写:
data Bar m r = ...
instance Foo Bar where
type Ctx Bar m r = (m~Maybe b)
-- m must be a Maybe, I don't care what its parameter is
f = ...
但是,GHC 抱怨:“不在范围内:类型变量 b”。 我看不到任何其他方式来表达这种约束。不是每个实例都需要'm~Maybe b',所以我不能将此约束移至 f 的类型签名。 b 不在任何地方的实例范围内(也许这就是 GHC 所抱怨的),但没有必要这样做。功能
f :: (a ~ Maybe b) => a -> a -> a
是有效的,我看不出为什么我不能用约束来做到这一点。顶级约束以及关联的类型约束都会出现此问题。
可能相关的是this 问题,但我需要与不在范围内的变量相等。
【问题讨论】:
-
你可以试试
type Ctx Bar m r = forall b. a ~ Maybe b(这需要Rank2Types和LiberalTypeSynonyms语言扩展)。 -
这个问题与this重复
-
@is7s 但是 GHC 确实现在支持这一点......无论如何,这个问题是关于一个完全不同的方面。
-
@DanielWagner 不是类型变量
b不是类参数的问题吗?如果是这样,这不是另一个问题的相同问题吗?我错过了什么吗? -
@is7s 不,这不是问题所在:问题是约束不能对类型进行量化。如今,关联类型族完全可以拥有非类参数参数。
标签: haskell types type-kinds