[英]Haskell: Understanding custom data types
我正在尝试在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 length
有效, length
必须为Length
(因为L :: Length -> Special
)。
takeL (x:xs)
| x == (L length) = length
无效。 除非您在某处重新定义了length
,否则length
是标准库中的函数[a] -> Int
,因此L length
是类型错误。
我认为您要在此处进行的只是模式匹配:
takeL (L length : xs) = length
数据类型定义
data Special =
读取: Special
是一个新类型 ,可以创建Special
类型的值 ,
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) = ...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.