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)谓词对应于将字典转换器传递给函数。
答案 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
。