Haskell中存在类型的澄清

问题描述 投票:4回答:2

我试图理解Haskell中的存在类型并遇到PDF http://www.ii.uni.wroc.pl/~dabi/courses/ZPF15/rlasocha/prezentacja.pdf

请更正我到目前为止的以下理解。

  • 现有类型似乎对它们包含的类型不感兴趣,但是与它们匹配的模式说,存在某种类型,直到&为止,除非我们使用Typeable或Data,否则我们不知道它是什么类型。
  • [当我们要隐藏类型(例如:对于异构列表)或我们真的不知道在编译时是什么类型时,我们会使用它们。
  • GADT通过提供隐式forall来提供清晰,更好的语法以使用现有类型进行编码>
  • 我的疑问

  • 在以上PDF的第20页中,对于以下代码,提到函数不可能要求特定的缓冲区。为什么会这样呢?当我起草函数时,即使我可能不知道要放入什么数据,我也完全知道我将使用哪种缓冲区。拥有:: Worker MemoryBuffer Int有什么问题?如果他们真的想通过Buffer抽象,他们可以具有Sum类型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 :: Worker Int
  • 因为Haskell是一种像C这样的完全类型擦除语言,然后它如何在运行时知道要调用哪个函数。是否像我们将要维护的信息很少,并传入一个巨大的V表功能,然后在运行时从V表中找出来?如果是这样,那么它将存储什么样的信息?

[我正在尝试了解Haskell中的存在类型,并遇到了PDF http://www.ii.uni.wroc.pl/~dabi/courses/ZPF15/rlasocha/prezentacja.pdf。请更正我以下的理解...

haskell gadt existential-type
2个回答
2
投票

[GADT通过提供隐式的forall提供了清晰,更好的语法来使用现有类型进行编码


0
投票

在以上PDF的第20页中,对于以下代码,提到函数不可能要求特定的缓冲区。为什么会这样?

© www.soinside.com 2019 - 2024. All rights reserved.