📅  最后修改于: 2023-12-03 14:41:41.977000             🧑  作者: Mango
在 Haskell 中,一切皆为类型。类型用来定义值或数据的种类,而类型类用来定义类型上的操作或功能。本文将介绍 Haskell 中的类型和类型类的基本概念和用法。
Haskell 提供了以下基本类型:
Int
- 整数Integer
- 高精度整数Float
- 单精度浮点数Double
- 双精度浮点数Bool
- 布尔类型,值为 True
或 False
Char
- 字符类型,表示单个字符这些类型在 Haskell 的标准库中已经预定义好了。我们可以直接使用它们。
有时候,我们需要使用一个特定的数据类型,这时候我们可以自己定义一个。用 data
关键字定义一个新的数据类型:
data MyType = TypeValue1 | TypeValue2 | TypeValue3
这个数据类型叫做 MyType
,它有三个可能的取值:TypeValue1
、TypeValue2
和 TypeValue3
。每个取值被称为这个类型的一个 构造器。
例如,我们可以定义一个代表颜色的数据类型:
data Color = Red | Green | Blue | Yellow | Cyan | Magenta | Black | White
我们可以用这个数据类型来表示颜色:
color :: Color
color = Green
一些类型(如列表([]
)、元组(()
)等)可以支持不同的元素类型。这时我们需要类型变量。类型变量在函数定义中使用:
-- 函数可以接收一个任意类型的列表
reverseList :: [a] -> [a]
这个函数 reverseList
可以接收一个任意类型的列表。类型变量 a
表示这个列表中的元素类型,它可以是任何类型(比如 Int
、String
等)。
类型类是用来描述类型上的一些操作或功能的。与实际类型相似,类型类也是一个参数化的概念。例如,Eq
是一个类型类,它描述了一个类型上的相等比较。一个类型如果想要成为 Eq
的实例,那么就必须实现 Eq
类型类中所定义的操作。
相等比较是方法 ==
实现的。例如:
-- Char 类型是 Eq 的实例
-- 我们可以用 == 比较两个 Char 类型的值是否相等
isEqual :: Char -> Char -> Bool
isEqual a b = a == b
除了 Eq
,还有很多其他的类型类。常见的类型类有:
Ord
:比较大小Num
:数字类型Fractional
:分数类型Integral
:整数类型Show
:转化成字符串类型Read
:从字符串类型中读取我们也可以定义自己的类型类。用 class
关键字定义一个新的类型类:
class CustomTypeClass a where
customMethod :: a -> String
这个类型类叫做 CustomTypeClass
,它定义了一个 customMethod
方法,该方法接收类型为 a
的参数并返回一个字符串类型的值。
对于一个要成为 CustomTypeClass
的实例的类型,它必须定义 customMethod
方法:
instance CustomTypeClass Int where
customMethod x = "This is an integer: " ++ show x
这个实例定义了 Int
类型的 customMethod
方法。
本文介绍了 Haskell 中的类型和类型类。我们了解了如何定义自己的类型和类型类,并为这些类型和类型类定义和实现操作和功能。为了更深入地理解 Haskell 中的类型和类型类,请参考 Haskell 的官方文档。