【问题标题】:Is Racket (and Typed Racket) strongly or softly typed?Racket(和 Typed Racket)是强类型还是软类型?
【发布时间】:2017-04-01 12:46:58
【问题描述】:

我意识到“强类型”和“软类型”的定义是松散的并且可以解释,但我还没有找到关于非类型球拍(根据我的理解意味着动态类型)和类型球拍的明确定义关于这个。

再一次,我确信它不会那么枯燥,但至少我想了解更多关于哪个方向倾斜的信息。我对此进行的研究越多,我就越困惑,所以提前感谢您的帮助!

【问题讨论】:

    标签: racket


    【解决方案1】:

    回答此类问题的一个问题是,人们对几乎所有这些术语的含义都有不同的看法。所以...以下是我的观点(虽然这是一个相当有见识的观点,如果我自己这么说的话)。

    所有语言都对一组值进行操作,并具有一些运行时行为。在几乎所有语言中,尝试向函数添加数字都会失败。您可以将其称为“类型系统”,但它可能不是正确的术语。

    那么什么是类型系统?这些天来,我声称该术语通常是指检查程序并静态地[*]推断程序属性的系统。通常,如果它被称为类型系统,这意味着将“类型”附加到每个表达式,以限制表达式可以评估的值的集合/类。请注意,此定义基本上使“动态类型”一词毫无意义。

    注意这个巨大的漏洞:有一个“普通类型系统”,它只是将包含所有程序值的“类型”分配给每个表达式。因此,如果您愿意,您可以将任何语言视为静态类型。或者,如果您愿意, “unityped”(注意其中的“i”)。

    好的,说到底。​​p>

    没有输入球拍。或者,如果您愿意,可以选择“动态类型”或“单一类型”,甚至是“无类型”。

    Typed Racket 类型的。它有一个静态类型系统,为每个表达式分配一个类型。它的类型系统是“健全的”,这意味着评估 该程序将符合类型系统提出的声明:如果 Typed Racket (以下简称 TR)类型检查您的程序并将类型“自然”分配给 表达式,那么它肯定会计算为自然数(假设没有错误 在 TR 类型检查器或 Racket 运行时系统中)。

    Typed Racket 有许多不同寻常的特性,允许用 TR 编写的代码与用 Racket 编写的代码互操作。其中最著名的是“出现类型”,它允许 TR 程序处理诸如 (U Number String) 之类的类型(即, 是数字或字符串的值)而不会爆炸,就像早期的类似类型系统所做的那样。

    不过,这有点离题:您的问题是关于 Racket 和 TR,简单的答案是基本的 Racket 语言没有静态类型系统,而 TR 有。

    [*] 定义术语“静态”超出了本文的范围:)。

    【讨论】:

      【解决方案2】:

      强类型和弱类型与静态或动态类型无关。您可以将它们组合在一起,以便有 4 种变体。 (强/静态、弱/静态、强/动态、弱/动态)。 Scheme(因此#lang racket)是动态和强类型的。

      > (string-append "test" 5)
      string-append: contract violation
        expected: string?
        given: 5
        argument position: 2nd
        other arguments...:
      

      它的所有值都有一个类型,函数可以要求一个类型。如果要将字符串附加到数字,则会出现类型错误。您需要使用number->string 将数字显式转换为字符串,以满足所有参数为字符串的约定。对于弱类型语言,如 JavaScript,它只会将数字转换为字符串以满足函数的要求。更少的代码,但可能更多的运行时错误。

      既然 Scheme 是强类型的,#lang typed/racket 肯定也是。

      虽然 Scheme/#lang racket 是动态类型的,但我不完全确定 #lang typed/racket 是否完全静态。 The Guide 称其为渐进式语言。

      【讨论】:

        【解决方案3】:

        “弱类型”的定义之一是,当操作数之间存在类型不匹配而不是给出错误时,语言将尽力继续,通过将操作数从一种类型强制转换为另一种类型或给出默认值结果。

        例如,在 Perl 中,如果在算术运算中使用包含数字的字符串,则会将其强制转换为数字:

        # This Perl program prints 6.
        print 3 * "2a"
        

        根据这个定义,Racket 将被归类为动态类型(类型错误发生在运行时)和强类型(它不会自动将值从一种类型转换为另一种类型)。

        由于 Typed Racket 不会改变 Racket 的运行时语义(除了引入一些额外的合同检查),因此它与常规 Racket 一样是强类型的。


        顺便说一下,人们常用的词是弱类型和强类型。软打字可能指的是 90 年代创建的one specific kind of type system。结果并不是那么好,这也是人们提出渐进式打字系统的原因之一,该系统用于 Typed Racket 和 Typescript 等语言。

        【讨论】:

          【解决方案4】:

          弱类型语言允许合法的实现使计算机“着火”,相比之下,强类型语言限制了更多有错误的程序。

          尽管 Racket 是动态类型的,但它是强类型的。

          【讨论】:

            猜你喜欢
            • 2012-10-14
            • 1970-01-01
            • 2014-05-27
            • 2021-07-13
            • 2015-06-28
            • 2021-07-11
            • 1970-01-01
            • 2015-02-02
            • 1970-01-01
            相关资源
            最近更新 更多