Fre*_*ind 5 functional-programming algebraic-data-types
当我学习Scala/Haskell时,我发现有一个代数数据类型的概念.我已经阅读了维基百科的解释,但我还是有一个问题:
为什么它的名字中使用"代数"这个词?它与"代数"有什么关系吗?
简而言之,我们必须考虑代数和类型之间的关系。Haskell 的代数数据类型之所以如此命名,是因为它们对应于范畴论中的初始代数。
维基百科说:
在计算机编程中,特别是函数式编程和类型论中,代数数据类型是一种复合类型,即通过组合其他类型形成的类型。
让我们采用Maybe a数据类型:
data Maybe a = Nothing | Just a
Run Code Online (Sandbox Code Playgroud)
Maybe a表示它可能包含某种类型a-Just Int例如,但也可以为空 - Nothing。在 Haskell 中,类型是对象,例如Int. 运算符获取类型并生成新类型,例如Maybe Int。Algebraic指代数数据类型由以下操作创建的属性algebraic:sums并且product其中:
例如,让我们sum看看Maybe a. 首先让我们定义Add类型:
data Add a b = Left a | Right b
Run Code Online (Sandbox Code Playgroud)
在 Haskell 中|是or,所以它可以是 orLeft a或Right b。竖线向|我们展示了Maybe上面定义的 sum 类型,这意味着我们可以这样写Add:
type Maybe a = Add Nothing (Just a)
Run Code Online (Sandbox Code Playgroud)
Nothing这是一种unit类型:
在数理逻辑和计算机科学领域(称为类型论)中,单位类型是一种只允许一个值的类型
data Unit = Unit
Run Code Online (Sandbox Code Playgroud)
或者()在哈斯克尔。
Just a是一个单例类型。单例类型是那些只有一个值的类型。
data Just a = Just a
Run Code Online (Sandbox Code Playgroud)
之后我们可以将其重写为:
type Maybe a = Add () a
Run Code Online (Sandbox Code Playgroud)
所以我们有单位类型 -1和单例类型 - a。现在我们可以说它Maybe a与 1 + a 相同。
如果你想深入了解 -数据代数和变异微积分