这两个概念都允许创建新的数据类型。 我能看到的唯一区别是在函数式语言中,可以在代数数据类型上执行模式匹配。但是,面向对象语言没有可比较的简洁功能。这是一个准确的陈述吗?代数数据类型的概念类似于面向对象语言中的类定义吗?
回答
我可以看到代数数据类型和面向对象类风格类之间的三个主要区别,不包括(im)可变性因为它有所不同。
- 代数数据类型允许总和以及产品,而OO风格的类只允许产品。
- OO风格的类允许您将复杂的数据项与其接受的操作捆绑在一起,而代数数据类型则不然。
- 代数数据类型不区分传递给构造函数的数据和存储在结果值中的数据,而OO风格的类可以(或可以))。
我故意忽略的一件事是子类型。尽管绝大多数面向对象语言允许您继承(非最终的,非密封的,当前可访问的)类,并且绝大多数通用ML家族函数式语言不支持,但显然可以完全禁止假设继承OO(或至少类OO)语言,同样可以在代数数据类型中生成子类型和超类型;后者的有限的示例,请参阅this page on O'Haskell,已成功通过Timber
类是不仅仅是一个类型定义更多 - 在大多数面向对象语言类实际上是提供各种松散的相关功能厨房水槽的功能。
特别是,类作为一种模块,为您提供数据抽象和命名空间。代数数据类型没有内置,模块化通常作为独立的正交特征(通常是模块)提供。
在某种意义上,人们可以这样看待它。每种语言都有很多机制来创建用户定义的类型。在功能性(ML,Haskell风格)语言中,唯一一个是创建ADT。 (Haskell的新类型可以被看作ADT的退化情况)。在OO语言中,它是类。在程序语言中,它是struct
或record
。
毫无疑问,用户定义的数据类型的语义因语言而异,在范式#1中的语言和范式#2中的语言都不尽相同。 @ Pharien's Flame已经概述了典型的差异。
Algebraic data types如此命名是因为它们形成“初始代数”,
+ represents sum types (disjoint unions, e.g. Either).
• represents product types (e.g. structs or tuples)
X for the singleton type (e.g. data X a = X a)
1 for the unit type()
and μ for the least fixed point (e.g. recursive types), usually implicit.
从这些运营商的所有常规数据类型可以构造。 代数数据类型也支持参数化多义性 - 意味着它们可以用作任何基础类型的常量,并具有静态安全性保证。此外,ADT提供统一的语法来引入和消除数据类型(通过构造函数和模式匹配)。例如。
-- this defines a tree
data Tree a = Empty | Node a (Tree a) (Tree a)
-- this constructs a tree
let x = Node 1 (Node 2 Empty) Empty
-- this deconstructs a tree
f (Node a l r) = a + (f l) + (f r)
代数数据类型的丰富性和均匀性,与它们是不可变的事实一起,从OO对象区别开来,这在很大程度上:
- 仅代表产品类型(所以没有递归或总和-types)
- 不支持的模式匹配
- 是可变
- 不支持参数多态性
嗯。不是继承类加法类型的子类? (所以一个类基本上是一个开放的总和?)我也看不出参数多态如何与代数数据类型相关联。当然,你可以通过其他类型对它们进行参数化,但是你能不能用类来做呢?类型递归通常也适用,对吧? –
是的,有足够的扩展,你可以到那里:“仿制药,子类的组合,和虚拟调度支持denition和对象 - 面向对象编程语言的有限使用广义代数的数据类型” - http://research.microsoft。 COM/EN-US/UM /人/ akenn /仿制药/ gadtoop.pdf –
- 1. 其他语言中的“未定义”的任何类似概念?
- 2. CoreData/SQLite有类似于数据库概念的东西吗?
- 3. 类似于跑台概念
- 4. 概念类型找不到对应的对象层类型
- 5. Rust中有POD类型的概念吗?
- 6. 概念类型中的成员数
- 7. 面向对象语言中继承的概念
- 8. Java:面向对象的概念,抽象类,接口
- 9. Swift中的闭包概念类似于Javascript中的闭包吗?
- 10. 关于面向对象的概念
- 11. “类型”,“实例”,“类”和“对象”概念之间的区别
- 12. 嵌套类型的类的概念
- 13. oops概念的类型
- 14. 关于面向对象编程的抽象数据类型vs数据类型与数据结构
- 15. 对象类型语言
- 16. 用C语言进行类型转换时的指针概念
- 17. C语言中是否存在类型擦除概念?
- 18. Java中类似JavaScript的对象数据类型?
- 19. MYSQL中的多语言数据类型
- 20. 面向对象,对象概念
- 21. AS3在非显示对象中类似于事件冒泡的概念?
- 22. 如何使用oop概念传递不同数据类型的ArrayList对象?
- 23. R.java类的概念
- 24. Drupal:基于自定义节点概念的内容类型页面
- 25. 从对象中继承类定义类型为元类吗?
- 26. 类概念SAPUI5
- 27. 概念类图
- 28. 类概念
- 29. C中的类型声明(概念)
- 30. Python面向对象的设计概念
所以ADT不需要*关闭*? Haskell的抽象数据类型不允许子类型(通过http://blog.tmorris.net/algebraic-data-types-again/) – canadadry
@BonAmi不,抽象数据类型并不需要关闭。正如你所指出的,Haskell的是,但斯卡拉当然不一定(如果你可以称为案例类ADTs)。 –