约束包如何工作?

时间:2012-10-04 13:17:15

标签: haskell polymorphism logic

据我所知,Data.Constraint.Forall背后的想法是在实施中使用强制,但使用类型系统确保安全。关于后者,我有两个问题。

  1. 为什么我们需要两个skolem变量--A和B?我想如果一个约束被“未知”类型满足,那么它就是多态的。第二种类型如何提高安全性?
  2. 为什么这些类型称为skolem变量?我认为石油化用于去除存在量化,在这里我们看到普遍量化。我错过了哪个标志翻转?

1 个答案:

答案 0 :(得分:11)

通过使用约束参数化的约束,可以通过MPTC和函数依赖来识别Skolem当它是单个变量时。我曾经这样做的技巧在有两个时不起作用。

从本模块外部编写的代码的角度来看,变量 Skolemized。它们实际上是一种“新鲜”类型的构造函数。

但鉴于您不能在模块之外明确引用这些类型,因为它们不会被导出,因此任何涵盖这些Skolems的实例都必须进行普遍量化。

这就是我从存在主义升级到普遍主义的方式。 “标志翻转”来自他们未被发现的性质,而不是技术上来自他们作为Skolems的角色。