类型和OO是否耦合?

let*_*nje 16 javascript ruby oop programming-languages clojure

试图了解类型是否暗示OO,反之亦然.

问题:

  • 究竟是什么类型的?

  • 红宝石中的一个类可以称为"类型".

  • 在javascript中,本机函数/对象如Array,String,Function ......它们是否类型?

  • C结构是一种类型吗?

  • 即使语言不支持OO,如何输入语言呢?例如,Haskell.这样的langs中的类型是没有OOPL中的对象/类中的行为(方法)的"数据"类型吗?具有类型但没有支持OO的OO和lang的lang之间的类型有显着差异.

  • 如果类/对象是类型,那么OO是否意味着类型?

  • 你有没有在OO lang中看到的典型层次结构的类型系统吗?

  • 由于clojure支持类型提示,它可以在某种意义上被称为打字吗?它不是静态类型的.

  • "无类型"和"动态类型"这两个词的含义是否相同?

Jam*_*Iry 13

静态类型是程序的一部分(通常是表达式)的属性,类型检查器将在不执行程序的情况下尝试证明或反驳,可能同时推断属性.(实际上,这有点偏离,依赖类型和分阶段编译使事实比这更真实).从广义上看,动态类型语言有一种静态类型 - 语法上有效的表达式.

动态类型是运行时在程序执行期间自动检查的"对象"(不一定是OO对象)的属性.每个主流的静态类型语言都有一些动态类型...例如,除法函数被静态定义为取两个数字并返回一个数字但动态定义,使得第二个数字不能为零.存在静态类型语言,其中"非零数字"可以是静态证明类型.在许多静态类型语言(例如Java)中,非null是动态类型,而在Haskell中它是静态类型.等等.

这两者有些相关(它们都是防止未定义行为的两种方式)但也完全不同,以至于"类型"这个词用来表示两者的混淆.

静态和动态类型系统都早于OO,并且都具有优秀的非OO语言来表示它们(例如,Scheme和SML).实际上,它们早于我们所知的计算机编程.请参阅无类型且简单输入的lambda calculii,它可以追溯到1930年代和40年代.

有关差异的更深入讨论,请参阅:http://web.archive.org/web/20080822101209/http : //www.pphsg.org/cdsmith/types.html

有关查看静态和动态类型的某些属性的一种方法,请参阅:http://james-iry.blogspot.com/2010/05/types-la-chart.html

动态类型和无类型意味着同样的事情吗?嗯...无类型来自无类型的lambda演算.与其他lambda calculii(如具有静态类型的简单类型lambda演算)相比,它被称为无类型.因此,在这种意义上,动态类型语言肯定是无类型的.但...

与"真实"编程语言不同,无类型lambda演算具有以下特性:任何语法上有效的表达式都可以"进步"而无需测试任何可能导致未定义行为的属性.没有等价的除以零,解除引用null或向无法处理它的对象发送消息.因此,人们可以提出这样的论点,即无类型的LC没有动态类型系统,即使它是无类型的.


Ion*_*tan 10

这是我看到它的方式.类型只是与某些数据结构相关联的标签.在OO语言中,这些数据结构恰好以方法的形式携带它们的行为.这些标签有助于了解可以对某些数据结构应用哪些操作(通过对对象的方法调用,或将这些数据结构作为参数传递给某些函数).

编程语言具有类型系统的明确证据是,您有谓词可以询问某个值具有哪种"标签".在OO语言中,这通常是instanceof运算符,但它可能需要一些其他形式(is运算符,typeof运算符,is_a()函数或专用函数:is_string,is_array).在Haskell中,这是使用模式匹配实现的.

老实说,我没有看到过无类型的语言,即一种根本没有类型的语言.到目前为止我所看到的语言是:

- non-inferred statically strongly typed: Java
- inferred statically strongly typed: Haskell
- dynamic strongly (explicit coercion between types) typed: Python
- dynamic loosely (implicit coercion between types) typed: PHP, JavaScript 
Run Code Online (Sandbox Code Playgroud)

  • 在Haskell中,您不能对值的类型,只是其结构进行模式匹配.值的类型始终是静态已知的,无法在运行时查询.顺便提一下,我不同意这样的含义:类型必须在运行时可以查询要输入的语言.C肯定有类型,但没有相应的`typeof`运算符. (2认同)

Mic*_*ohl 5

我今天偶然发现了这一点,也许它对你有一些好的建议:

辩论类型系统之前要了解什么