约束种类中的平等约束

我的问题是关于如何在关联类型约束中放置一个等式约束(即种类约束)

具体用例是一个由部分应用类型参数化的类:

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

是有效的,我看不出为什么我不能用约束来做到这一点。 与顶级约束以及相关的类型约束发生此问题。

可能相关的是这个问题,除非我需要与范围内的变量不平等。


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

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的类声明中的一种注释。

链接地址: http://www.djcxy.com/p/43069.html

上一篇: Equality constraints in Constraint kinds

下一篇: Haskell: Conversions of polymorphic types