Questions tagged «existential-type»


2
scala-泛型中的任何vs下划线
Scala中以下泛型定义之间的区别是什么: class Foo[T <: List[_]] 和 class Bar[T <: List[Any]] 我的直觉告诉我它们大致相同,但后者更明确。我发现前者可以编译但后者不能编译的情况,但不能使我完全了解。 谢谢! 编辑: 我可以混入另一个吗? class Baz[T <: List[_ <: Any]]

3
存在类型的理论基础是什么?
该哈斯克尔维基做了解释如何使用存在类型的一个很好的工作,但我不太神交背后的理论。 考虑以下存在类型的示例: data S = forall a. Show a => S a -- (1) 为我们可以转换为的东西定义类型包装String。维基提到我们真正想要定义的是类似 data S = S (exists a. Show a => a) -- (2) 即真正的“存在”类型-S大概我认为这是“数据构造函数接受Show实例存在的任何类型并将其包装”。实际上,您可能会编写如下的GADT: data S where -- (3) S :: Show a => a -> S 我没有尝试编译它,但是似乎它应该可以工作。对我来说,GADT显然等效于我们要编写的代码(2)。 但是,对我来说,为什么(1)等同于(2)并不清楚。为什么将数据构造函数移到外部会forall变成exists? 我能想到的最接近的是逻辑上的德摩根定律,在其中交换否定词和量词的顺序会将存在量词变成通用量词,反之亦然: ¬(∀x. px) ⇔ ∃x. ¬(px) 但是数据构造函数似乎与否定运算符完全不同。 …

2
澄清Haskell中的存在类型
我试图了解Haskell中的存在类型,并遇到了PDF http://www.ii.uni.wroc.pl/~dabi/courses/ZPF15/rlasocha/prezentacja.pdf 请更正我到目前为止的以下理解。 现有类型似乎对它们包含的类型不感兴趣,但是与它们匹配的模式表示存在某种类型,除非&使用Typeable或Data,否则在&之前我们不知道它是什么类型。 当我们要隐藏类型时(例如,对于异构列表),或者在编译时我们真的不知道什么类型时,我们会使用它们。 GADT通过提供隐式forall的,为使用现有类型的代码提供清晰,更好的语法 我的怀疑 在以上PDF的第20页中,对于以下代码,提到函数不可能要求特定的缓冲区。为什么会这样呢?当我起草函数时,即使我可能不知道要放入什么数据,我也完全知道我将使用哪种缓冲区。什么是错在有:: Worker MemoryBuffer Int如果他们真的想在抽象缓冲区他们能有一个求和型data Buffer = MemoryBuffer | NetBuffer | RandomBuffer和有型状:: Worker Buffer Int data Worker x = forall b. Buffer b => Worker {buffer :: b, input :: x} data MemoryBuffer = MemoryBuffer memoryWorker = Worker MemoryBuffer (1 :: Int) memoryWorker :: …
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.