仅具有无效或一元构造函数的 Haskell 数据类型是否被视为代数数据类型?

Pat*_*wne 1 haskell algebraic-data-types

据我所知,Haskell 中的代数数据类型可以有两种形式,即和(例如data Bool = True | False)或乘积(例如data Pair = P Int Double)。以下是一些具有空值和一元值构造函数的数据类型。

data Z  = Z
data S n = S n  -- I think that this is a singleton type?
data S = S Int
Run Code Online (Sandbox Code Playgroud)

这些类型是否被视为代数数据类型?如果是的话,他们叫什么?

lef*_*out 5

Z只是一个不同名称的单位类型。A1作为 ADT。换句话说,它是一个空的产品类型。(同样,根本没有构造函数的类型可以被视为空和类型。)

S nn自身同构。在ADT的框架中,它被认为是等价的,即如果n是代数类型,那么 也是S n

但请注意,在 Haskell 中,类型定义通常被故意视为不透明,以避免导出值构造函数。该类型实际上是一种抽象数据类型,而不是代数数据类型。