2016-11-17 123 views
2

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

我再次确定它不是那么干燥,但至少我想了解更多关于哪个方向倾斜的东西。我对这件事的研究越多,我就越困惑,所以提前谢谢你的帮助!

回答

5

的一个问题是,人们不同意有关的几乎所有这些术语的含义。所以...接下来是我的看法(虽然它是一个相当有见识的人,如果我自己说的话)。

所有语言都使用某些值集合,并具有一些运行时行为。尝试向某个函数添加数字几乎在所有语言中都失败。你可以称之为“类型系统”,但它可能不是正确的术语。

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

注巨漏洞:有一个“平凡的类型系统”,它简单地分配的“类型”包含所有的编程值的每一个的表达。所以,如果你愿意,你可以从字面上考虑任何语言是静态类型的。或者,如果你愿意, “统一”(注意那里的“我”)。

好吧,直到黄铜大头钉。

球拍没有输入。或者,如果您愿意,“动态输入”或“统一”,甚至“无类型”。

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

Typed Racket具有许多不同寻常的特性,允许使用TR编写的代码与Racket中编写的代码进行互操作。其中最着名的是“出现类型”,它允许TR程序处理像(U Number String)这样的类型(即,值为的数字或字符串),而不像之前的类似系统那样爆炸。不过,你的问题是关于Racket和TR,而简单的答案是基本的Racket语言没有静态类型系统,而TR的确如此。

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

1

强类型和弱类型与静态或动态类型无关。你可以有他们的组合,所以你有4个变化。 (强/静,弱/静,强/动,弱/动)。 方案(因此#lang racket)是动态的,并且属于输入类型。

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

它的所有值都有一个类型,函数可以要求一个类型。如果你将一个字符串附加到一个数字上,你会得到一个类型错误。您需要使用number->string明确地将该数字转换为字符串以满足所有参数为字符串的合约。对于弱类型的语言,比如JavaScript,它只会将该数字转换为一个字符串,以便满足该函数。较少的代码,但可能更多的运行时错误。

由于方案是强类型#lang typed/racket肯定是太。

虽然计划/ #lang racket是动态输入的,但我不完全确定#lang typed/racket是否完全是静态的。 The Guide称它为逐渐型语言。在回答这样的问题

1

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

例如,在Perl含有数字的字符串将被如果在算术运算使用它强制转换为号码:

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

在此定义下,球拍将被分类发生动态类型(类型错误在运行时)和强类型(它不会自动将值从一种类型转换为另一种类型)。

由于类型化球拍不会更改球拍的运行时语义(除了引入一些额外的合同检查),它将与普通球拍一样具有强类型。


顺便说一句,人们使用的通常词语是弱和强打字。软键入可能指的是在90年代创建的one specific kind of type system。它的表现并不尽如人意,这也是人们想出类似球拍和打字稿等语言中使用的渐进式打字系统的原因之一。