我意识到“强类型”和“轻柔打字”的定义是松散且易于解释的,但我还没有找到与无类型Racket(我的理解意味着动态类型)和Typed Racket相关的明确定义对此。
同样,我确信它不那么干燥,但至少我想了解更多关于哪个方向倾斜。我对此做的研究越多,我就越困惑,所以提前谢谢你的帮助!
答案 0 :(得分:8)
回答这样的问题的一个问题是人们不同意几乎所有这些术语的含义。所以...接下来的是我的意见(虽然这是一个相当明智的,如果我自己这么说的话)。
所有语言都在某些值上运行,并且具有一些运行时行为。尝试向函数添加数字几乎在所有语言中都失败了。你可以称之为"类型系统,"但它可能不是正确的术语。
什么是类型系统?这些天,我声称该术语通常指的是一个检查程序的系统,并静态地[*]推断该程序的属性。通常,如果它被称为类型系统,这意味着附加"类型"每个表达式,用于约束表达式可以计算的值的集合/类。请注意,此定义基本上使术语"动态输入"无意义的。
注意巨大的漏洞:那里有一个简单的类型系统",它只是分配"类型"包含每个表达式的所有程序值。所以,如果你愿意,你可以考虑任何静态类型的语言。或者,如果您愿意, " unityped" (注意"我"在那里)。
好的,直到黄铜钉。
不输入球拍。或者,如果您愿意,"动态输入,"或者"统一,"甚至"无类型"。
键入的球拍是类型。它有一个静态类型系统,可以为每个表达式分配一个类型。它的类型系统是"声音",这意味着评估 该程序将符合类型系统的声明:如果Typed Racket (以下称TR)对您的程序进行类型检查并指定类型' Natural'到了 表达式,那么它肯定会评估为一个自然数(假设没有错误 在TR类型检查器或Racket运行时系统中。)
Typed Racket有许多不寻常的特性,允许用TR编写的代码与Racket编写的代码互操作。其中最着名的是"发生输入",它允许TR程序处理类似(U Number String)
的类型(即, 的值数字或字符串)没有爆炸,就像早期类似的类型系统那样。
然而,这个问题与此类似:你的问题是关于Racket和TR,简单的答案是基本的Racket语言没有静态类型系统,TR就是这样。
[*]定义术语'静态'超出了这篇文章的范围:)。
答案 1 :(得分: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将其称为渐进式语言。
答案 2 :(得分:1)
"弱类型"的定义之一是当操作数之间存在类型不匹配而不是给出错误时,语言将尽力继续,通过将操作数从一种类型强制转换为另一种类型或给出默认结果。
例如,在Perl中,如果在算术运算中使用,则包含数字的字符串将被强制转换为数字:
# This Perl program prints 6.
print 3 * "2a"
根据这个定义,Racket将被分类为动态类型(类型错误在运行时发生)和强类型(它不会自动将值从一种类型转换为另一种类型)。
由于Typed Racket不会改变Racket的运行时语义(除了引入一些额外的合同检查),它将与普通的Racket一样强类型。
顺便说一下,人们使用的常用词是弱而强的打字。软输入可能是指90年代创建的one specific kind of type system。它并没有那么好,这是人们提出用于Typed Racket和Typescript等语言的渐进式打字系统的原因之一。
答案 3 :(得分:0)
弱类型语言允许合法实施使计算机“着火”,相反,强类型语言限制了更多的错误程序。
尽管Racket是动态输入的,但它还是强类型的。