【问题标题】:Equality constraints in Constraint kinds约束类型中的等式约束
【发布时间】: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(这需要Rank2TypesLiberalTypeSynonyms语言扩展)。
  • 这个问题与this重复
  • @is7s 但是 GHC 确实现在支持这一点......无论如何,这个问题是关于一个完全不同的方面。
  • @DanielWagner 不是类型变量b 不是类参数的问题吗?如果是这样,这不是另一个问题的相同问题吗?我错过了什么吗?
  • @is7s 不,这不是问题所在:问题是约束不能对类型进行量化。如今,关联类型族完全可以拥有非类参数参数。

标签: haskell types type-kinds


【解决方案1】:

这是表达这种约束的另一种方式:

class IsMaybe m {- where ...whatever operations you need to do on Maybe values -}
instance IsMaybe (Maybe b) {- where ...implement those operations -}
instance Foo Bar where
    type Ctx Bar m r = IsMaybe m

但是,鉴于 Haskell 命名约定,如果这确实是您想要的,我会感到有点惊讶 -- m 真的是类型变量 * 而不是类型 * -> *?如果是后者,你只需要

instance Foo Bar where
    type Ctx Bar m r = m~Maybe

...可能还有Foo 的类声明中的一种注释。

【讨论】:

  • 谢谢丹尼尔,我会试一试。 m 实际上是一种(疯狂的)用户定义的类型 ->。我仍然想知道我在我的问题中尝试的内容是否应该是合法的,或者它是否还没有实施。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-21
  • 2012-09-06
  • 2017-01-21
  • 2012-01-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多