繁体   English   中英

Haskell:了解自定义数据类型

[英]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数据类型的实例,我希望能够提取LengthRotationColour值。

如果我有:

L length

这里的length可以是Special类型还是Length类型? 如果lengthSpecial类型,则有任何方法可以提取它,因此为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 ,其中lLength类型的值; 要么

      | R Rotation 
  • 调用R r ,其中rRotation类型的值; 要么

      | Col Colour 
  • 调用Col c ,其中cColour类型的值。


要分析Special类型的值,需要考虑以下三种情况:

foo :: Special -> ...
foo val = 
    case val of
        L   l -> ...  
  • lLength类型的值,如果val实际上是L l ; 要么

      R r -> ... 
  • rRotation类型的值,如果val实际上是R r ; 要么

      Col c -> ... 
  • cColour类型的值,在val实际上是Col c的情况下。

函数定义中的case语法也可以使用基于模式的子句来表达:

foo :: Special -> ...
foo (L   l) = ...
foo (R   r) = ...
foo (Col c) = ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM