我正在尝试在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)
但是,如果我有一个Length
数据类型的实例,我希望能够提取Rotation
,Colour
和Special
值。
如果我有:
L length
这里的length
是Special
类型还是Length
类型?如果length
的类型为Special
,是否有任何方法可以将其提取为Length
的类型?
例如,以下代码有效吗?
takeL (x:xs)
| x == (L length) = length
任何见解都会受到赞赏。
答案 0 :(得分:4)
要使表达式L length
有效,length
必须是Length
(因为L :: Length -> Special
)。
takeL (x:xs)
| x == (L length) = length
无效。除非您在某处重新定义了length
,否则length
是标准库中的函数[a] -> Int
,因此L length
是类型错误。
我认为您要在此处进行的只是模式匹配:
takeL (L length : xs) = length
答案 1 :(得分:3)
数据类型定义
data Special =
读取:Special
是新的类型,以便创建类型为Special
的 value ,
L Length
调用L l
,其中l
是类型Length
的值;或
| R Rotation
调用R r
,其中r
是类型Rotation
的值;或
| Col Colour
调用Col c
,其中c
是类型Colour
的值。
要分析类型Special
的值,需要考虑以下三种情况:
foo :: Special -> ...
foo val =
case val of
L l -> ...
l
实际上是Length
的情况下, val
是类型L l
的值;或
R r -> ...
r
实际上是Rotation
的情况下, val
是类型R r
的值;或
Col c -> ...
c
实际上是Colour
的情况下, val
是类型Col c
的值。
函数定义中的case
语法也可以使用基于模式的子句来表达:
foo :: Special -> ...
foo (L l) = ...
foo (R r) = ...
foo (Col c) = ...