gpt4 book ai didi

haskell - Haskell 是否有 "de-facto"运行时类型?

转载 作者:行者123 更新时间:2023-12-03 15:05:44 26 4
gpt4 key购买 nike

这是我的困境:
当 Haskell 程序被编译时,会生成可以在物理 CPU 上执行的二进制可执行机器代码。当 Haskell 程序被解释时,物理 CPU 对来自内存位置的数据执行操作。执行实际上发生在某个时间段内,其长度取决于 CPU 速度。

由于数据已由保证每个变量都是强类型的编译器放入内存中,这是否意味着 Haskell 有效地具有运行时类型?

澄清:
“运行时类型”是指:当程序在物理处理器上执行时变量的类型(在类型理论意义上),语言编译器在语言编译时可访问/可识别。

最佳答案

Haskell 的语言特性旨在支持完整的类型删除。这个想法是打字规则保证通过类型检查的代码具有以下两个属性:

  • 一个类型的值永远不会传递给期望另一种类型的函数
  • 声称处理某种类型值的函数将处理 任意 该类型的可能值

  • 第二个属性值得扩展。显然是部分函数,​​如 fromJusthead实际上不处理任何可能的值;如果给出错误的值,它们会在运行时爆炸。但在检查了它们所依赖的假设之后,它们以“明确定义”的方式爆炸。不可能编写尝试访问可能没有该子结构的值中的子结构的代码,这可能会导致段错误或将随机的内存片段解释为好像它们是不同类型的数据一样。

    所以类型检查成功后,就不需要在编译的程序中存储任何类型信息了。我只是把类型扔掉了。我已经证明,如果我生成的代码盲目地对数据执行操作,假设它具有所需的形状,那么实际上什么都不会出错。

    示范时间!
    data Foo = Foo Int String
    data Bar = Bar Int String

    Foo 和 Bar 的值可能会在内存中以相同的方式表示2;一旦您知道所有值的类型正确,定义这些值所需的所有信息就是 IntString在每种情况下。如果您要查看正在运行的 Haskell 程序的内存转储,您将无法判断给定内存对象是否包含对 Int 的引用。和 StringFooBar (或者实际上是 (Int, String) ,或任何其他具有两个字段的单个构造函数类型,分别是 IntString)。

    所以不,Haskell 类型在运行时不以任何形式存在。

    1 您当然可以使用不安全的功能破坏这些属性,例如 unsafeCoerce ;我在这里谈论的是“正常”的 Haskell 代码。

    2 或者他们可能不会。 Haskell 语言根本不保证运行时的表示,它完全有可能以不同的顺序存储字段,或者做一些可以区分两者的其他事情。但我会假设在没有任何理由不这样做的情况下,它将这两种类型视为相同。

    关于haskell - Haskell 是否有 "de-facto"运行时类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28445378/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com