类型类Type classes(第一部分)类约束 Eq、Ord、Show、Read、Enum、Num、Integral、Floating

发布时间 2023-04-01 16:20:23作者: 牧羊龟

类型类Type classes是一种定义某种行为的接口。如果类型是类型类的成员,则意味着类型支持并实现了类型类定义的行为。

类约束

== 函数的类型,如下

:type (==)
(==) :: Eq a => a -> a -> Bool

=>符号定义了一个类约束,==函数接受两个相同类型的形参,并返回Bool类型。这两个形参的类型必须是Eq类型类的成员(类约束)

Eq类型类

Eq类型类提供了相等比较的接口,任何有意义比较两个值是否相等的类型都必须是Eq类型类的成员

除了IO类型(处理输入/输出的类型)和函数之外的所有Haskell标准类型都是Eq类的一部分

Ord类型类

除了函数以外,所有类型都是Ord类型类的一部分,Ord类型类涵盖了>, <, >=, <=等所有比较函数

compare函数,如下

:type compare
compare :: Ord a => a -> a -> Ordering

compare函数接受Ord类型类中相同类型的两个成员,并返回它们的顺序
顺序由Ordering类型表示,该类型可以有三个不同的值,GT、EQ、LT,分别表示大于、等于、小于,如下

5 `compare` 3
GT
'a' `compare` 'z'
LT

Show类型类

除了函数以外,所有的类型都是Show类型类的一部分
该类型类使用最多的函数是show函数,它接受属于Show类型类的值,并将其表示为文本字符串,如下

:type show
show :: Show a => a -> String
show 3
"3"
show True
"True"
show [1, 2, 3]
"[1, 2, 3]"

Read类型类

除了函数以外,所有的类型都是Read类型类的一部分,Read类型类就像与Show相反的类型类
read函数接受一个字符串,并返回一个属于Read成员类型的值,如下

read "True" || False
True
read "8.2" + 3.8
12.0
read "[1,2,3,4]" ++ [5]
[1,2,3,4,5]

read函数,如下

:type read
read :: Read a => String -> a

read函数返回一个属于Read类型类的类型,但如果不在其他地方使用它,则无法知道它具体是什么类型,因此我们需要使用显式类型注释
通过在表达式的末尾添加::,然后指定类型来做到这一点,如下

read "5" :: Int
5
read "5" :: Float
5.0
read "[1,2,3,4]" :: [Int]
[1,2,3,4]

Enum类型类

Enum类型类的成员是按顺序排序的类型,它们可以被枚举,可以使用succ函数和pred函数

Num类型类

Num是数字的类型类,它的成员具有能够表现得像数字的特性,如下

:type 20
(20) :: Num a => a

所有的数字都是多态常数,它们可以充当Num类的任何类型,如下

20 :: Int
20
20 :: Integer
20
20 :: Float
20.0
20 :: Double
20.0

Integral类型类

Integral也是一个数字类型类

  • Num类型类包括所有的数字,实数和整数
  • Integral只包括整数,Int类型和Integer类型是该类型类的成员

一个非常有用的处理整数的函数是fromIntegral,如下

:type fromIntegral
fromIntegral :: (Integral a, Num b) => a -> b

接受一个整数,并将其转换为一个Num类型类的数字

Floating类型类

Floating类型类只包含Float类型和Double类型