Haskell笔记 (六)自定义Types

前面我们说过了Type和typeclasses,现在,我们来说一说怎么自定义自己的Type和TypeClasses,这东西我们觉得不好理解,其实简单的说,你就把他们看成C语言中的结构体就行了,我们在C语言中自定义结构体实际上就是自定义新的数据类型。

一般的Types自定义


正如C语言中使用typedef struct XXX来自定义结构体,在Haskell中

  • 使用data来自定义Types,比如,我们需要定义一个圆,它由圆心坐标和半价组成,我们可以这样定义:

      data Circle = Circle Float Float Float
    

    前面两个Float表示圆心坐标,后面一个表示半径。

  • deriving (Show)加在声明的后面,那 Haskell 就会自动将该类型至于 Show 类型类之中

Record Syntax


我们按照上面的方式自定义一个Person的结构

data Person = Person String String Int Float String String deriving (Show)

如果我们需要获取这个Person的各个子项的话,我们需要写如下函数:

firstName :: Person -> String 
firstName (Person firstname _ _ _ _ _) = firstname 

lastName :: Person -> String 
lastName (Person _ lastname _ _ _ _) = lastname 

age :: Person -> Int 
age (Person _ _ age _ _ _) = age 

height :: Person -> Float 
height (Person _ _ _ height _ _) = height 

phoneNumber :: Person -> String 
phoneNumber (Person _ _ _ _ number _) = number 

flavor :: Person -> String 
flavor (Person _ _ _ _ _ flavor) = flavor

如果定义一个非常复杂的数据结构,那获取子项的函数将非常麻烦,有没有简单一点的方式呢?当然有啦。这就是Record Syntax,记录语法吧,暂且这么翻译。

使用Record Syntax的声明如下:

data Person = Person { firstName :: String 
                 , lastName :: String 
                 , age :: Int 
                 , height :: Float 
                 , phoneNumber :: String 
                 , flavor :: String 
                 } deriving (Show)
  • 与原先让那些项一个挨一个的空格隔开不同,这里用了花括号 {}
  • 先写出项的名字,如 firstName,后跟两个冒号::
  • 标明其类型,返回的数据类型仍与以前相同
  • 各项之间用,隔开
  • 这样,就由系统自动生成了上述获取各个值的get函数了。

同样,使用的时候也要这么来做:

Person {firstName="Ford", lastName="Mustang", age=30,height=60.0,phoneNumber="1234567",flavor="abc"}

你可能感兴趣的:(技术)