QuantifiedConstraints如何转换成字典传递样式?

时间:2018-10-01 14:34:30

标签: haskell typeclass

QuantifiedConstraints 1 已登陆GHC 8.6,我正在阅读派生类型类(第7节) 2 首先被建议。但是,从操作上来说,我不明白如何将QuantifiedConstraints转换成字典。以下是论文摘录。

  

我们需要的是一种简化谓词的方法   f (GRose f a)。诀窍是采用“常量”实例   我们为上述Binary (List a)假设的声明,以及   对其进行抽象:

instance (Binary a,
          forall b. (Binary b) => Binary (f b)
         ) => Binary (GRose f a) where
  showBin (GBranch x ts ) = showBin x ++ showBin ts
  

现在,上下文以及(Binary a)也包含   多态谓词。这个谓词可以用来   将谓词Binary (f (GRose f a))简化为   Binary (GRose f a),我们有一个实例声明   为此。

     

从操作上看,谓词(Binary a)   在上下文中对应于传递类的字典   Binary。谓词forall b. Binary b => Binary (f b)对应   将字典转换器传递给函数。

特别是我无法理解以下内容:

1)将谓词Binary (f (GRose f a))减少到Binary (GRose f a)

2)谓词对应于将字典转换器传递给函数。

1 个答案:

答案 0 :(得分:11)

对于常规约束,翻译映射

class Colored a where
   isRed :: a -> Bool

foo :: Colored a => T

newtype ColoredDict a = CD (a -> Bool)

foo :: ColoredDict a -> T

类似地,

bar :: (forall a. Colored a => Colored [a]) => U

可以翻译为

bar :: (forall a. ColoredDict a -> ColoredDict [a]) -> U
  

2)谓词对应于将字典转换器传递给   功能。

bar的第一个参数是OP提到的“字典转换器”。

bar涉及2级,但是Haskell使用它们已有很长时间了。

  

1)将谓词Binary (f (GRose f a))减少到Binary (GRose f a)

重点是:每次bar需要解决约束Colored [t]时,它都可以利用量化约束,而尝试解决更简单的约束Colored a