【发布时间】:2019-07-07 13:21:24
【问题描述】:
我正在尝试在 Haskell 中创建自己的自定义数据类型。
我有以下数据类型:
type Length = Integer
type Rotation = Integer
data Colour = Colour { red, green, blue, alpha :: Int }
deriving (Show, Eq)
我正在尝试创建可以是上述任一数据类型的自定义数据类型。我有以下内容:
data Special
= L Length
| R Rotation
| Col Colour
deriving (Show, Eq)
但是,如果我有 Special 数据类型的实例,我希望能够提取 Length、Rotation 和 Colour 值。
如果我有:
L length
这里的length 是Special 类型还是Length 类型?如果length 是Special 类型,有没有办法提取它,所以它是Length 类型?
例如,下面的代码是否有效?
takeL (x:xs)
| x == (L length) = length
感谢任何见解。
【问题讨论】:
-
“提取价值”是什么意思?这就是所谓的“总和类型”——因此它由这些类型中的一个值 组成,而不是它们的集合。具体来说,一个元素可能是
L 1或R 42——它们都不能从中提取Colour。您可能想要一个“产品类型”,即data Special = Special Length Rotation Colour- 该类型的每个值都有可以提取的Length、Rotation和Colour值。 -
你可以解压数据构造函数。
-
@RobinZigmond 我不希望数据类型是产品数据类型,因为我希望 Special 是长度、旋转或颜色之一。
-
@ceno980 - 感谢您的澄清,在这种情况下,您的类型确实是正确的。但在这种情况下,不清楚您所说的“提取”是什么意思,因为每个值只能提取三个组件中的 一个。如果您想匹配它使用的构造函数之一,您可以使用模式匹配或
case表达式来做到这一点。关于您最近的编辑,在表达式L length中,length必须是Length(即Integer),这取决于您如何定义构造函数。
标签: haskell functional-programming pattern-matching algebraic-data-types custom-data-type