《Real World Haskell》笔记(6):使用类型类

2019-02-07  本文已影响0人  Mexplochin
类型类的作用

通过类型类可以定义通用(generic)函数,该函数能对几乎任何东西(anything)合法。对于具有比较功能的函数而言,通过写一个通用函数,能够比较所有的东西,即 generic programming :如果一段代码可以进行比较,generic code应该就能够接受任何数据类型,并且对于这些类型,编译器是知道如何比较的,如果以后新类型被添加进来,现有的代码也不应该被修改。

类型类(Typeclass) 与 实例(Instance)

类型类定义一系列函数,这些函数对于不同类型而言具有不同的函数实现。

class BasicEq a where
    isEqual :: a -> a -> Bool
    isEqual x y = not (isNotEqual x y)

    isNotEqual :: a -> a -> Bool
    isNotEqual x y = not (isEqual x y)
--isEqual :: (BasicEq a) => a -> a -> Bool
--对于所有的类型 a ,只要 a 是 BasicEq 的一个实例,isEqual 接受两个类型为 a 的参数,返回一个 Bool

instance BasicEq Bool where--定义类型类实例
    isEqual False False = True
    isEqual True  True  = True
    isEqual _     _     = False

{-类型类Eq

class  Eq a  where
 (==), (/=) :: a -> a -> Bool
    -- Minimal complete definition:
    --     (==) or (/=)
 x /= y     =  not (x == y)
 x == y     =  not (x /= y)

-}
重要的内置类型类
序列化

把内存中的数据转化成为序列的过程

Prelude> let years = [1999, 2010, 2012]
Prelude> show years
"[1999,2010,2012]"
Prelude> writeFile "years.txt" (show years) #序列化
Prelude> input <- readFile "years.txt"
Prelude> input                  
"[1999,2010,2012]"
Prelude> (read input)::[Int] #反序列化
[1999,2010,2012]
数值类型及其对应类型类
类型 解释 Bits Bounded Floating Fractional Integral Num Real RealFrac
Double 双精度浮点数 X X X X X
Float 单精度浮点数 X X X X X
Int 固定精度带符号整数 X X X X X
Integer 任意精度带符号整数 X X X X
Rational or any Ratio 任意精度有理数 X X X X
Word 固定精度无符号整数 X X X X X
自动派生
--由于Book不是类型类Show的实例,BookInfo不能自动派生
data Book = Book
data BookInfo = BookInfo Book
                deriving (Show)
newtype关键字
newtype NewtypeInt = N Int
    deriving (Eq, Ord, Show)

newtype 目的是重命名一个存在着的类型,来给它一个独特的身份,声明方式与data相似。

data与newtype的区别:

type与newtype的区别:

上一篇 下一篇

猜你喜欢

热点阅读