can*_*dry 6 functional-programming algebraic-data-types
这两个概念都允许创建新的数据类型.我能看到的唯一区别是,在函数式语言中,可以对代数数据类型执行模式匹配.但OO语言没有类似的简洁功能.这是一个准确的陈述吗?
代数数据类型之所以如此命名是因为它们构成了"初始代数",
+ 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.
Run Code Online (Sandbox Code Playgroud)
从这些运算符中可以构造所有常规数据类型.代数数据类型也支持参数多态性 - 这意味着它们可以用作任何基础类型的constainer,具有静态的安全保证.此外,为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)
Run Code Online (Sandbox Code Playgroud)
代数数据类型的丰富性和一致性,以及它们是不可变的这一事实,将它们与OO对象区分开来,这在很大程度上:
我可以看到代数数据类型和 OO 风格的类之间的三个主要区别,不计算(im)可变性,因为它们各不相同。
我故意从该列表中遗漏的一件事是子类型。虽然绝大多数面向对象语言允许您对类(非最终的、非密封的、当前可访问的)类进行子类化,而绝大多数一般的 ML 系列函数式语言则不允许,但显然可以在假设的情况下完全禁止继承OO(或至少类似OO)语言,同样可以在代数数据类型中产生子类型和超类型;有关后者的有限示例,请参阅O'Haskell 上的此页面,该页面已被Timber接替