一、Haskell标准库类型类的官方查阅渠道
Haskell标准库的类型类主要集中在 base 包中,以下是获取完整类型类清单的权威途径:
1. 官方文档(最全面)
-
核心入口:Haskell base 包文档(选择对应版本,如
base-4.19.0.0,这是GHC 9.8的默认版本); -
分类导航:点击文档中的「Modules」,核心类型类分布在以下模块中:
-
模块名 核心类型类 用途 PreludeEq、Ord、Show、Read、Num、Functor、Monad等 预加载核心类型类(无需导入) Data.EqEq 相等性判断 Data.OrdOrd、Ordering 大小比较 Data.FoldableFoldable 可折叠容器(遍历/聚合) Data.TraversableTraversable 可遍历容器(带副作用映射) Control.MonadMonad、MonadPlus、MonadIO等 单子(顺序计算) Control.ApplicativeApplicative、Alternative 应用函子(多参数映射) Data.FunctorFunctor、Contravariant 函子(单参数映射) Numeric.NumNum、Fractional、Integral等 数值运算 Data.SemigroupSemigroup 半群(结合律二元操作) Data.MonoidMonoid 幺半群(半群+单位元)
-
2. GHCi交互式查询
在GHCi中可直接查询类型类的定义、实例和文档:
-- 1. 查看类型类的定义(如Functor)
ghci> :info Functor
class Functor (f :: * -> *) where
fmap :: (a -> b) -> f a -> f b
(<$) :: a -> f b -> f a
{-# MINIMAL fmap #-}
-- Defined in ‘GHC.Base’
instance Functor [] -- Defined in ‘GHC.Base’
instance Functor Maybe -- Defined in ‘GHC.Base’
...
-- 2. 查看类型类的Haddock文档(需联网)
ghci> :doc Functor
3. 离线文档
安装Haskell平台后,可通过以下命令生成本地文档:
# 生成base包的本地HTML文档
cabal haddock base --html
# 或用stack
stack haddock base
生成的文档会保存在本地目录,可离线浏览所有类型类。
二、Haskell标准库核心类型类全分类解析
base 包中的类型类可按“功能场景”分为8大类,以下是完整核心清单 + 核心用途解析:
1. 基础行为类(Prelude默认加载)
| 类型类 | 核心方法 | 核心用途 | 典型实例 |
|---|---|---|---|
Eq | (==)、(/=) | 判断两个值是否相等 | Int、String、Maybe a |
Ord | compare、<、<=等 | 大小比较(排序/查找) | 所有Eq实例 + 可比较类型 |
Show | show、showList | 类型转字符串(序列化) | 几乎所有标准类型 |
Read | readsPrec、readList | 字符串转类型(反序列化) | 几乎所有标准类型 |
Enum | succ、pred、enumFrom | 枚举类型(连续值生成) | Int、Char、Bool |
Bounded | minBound、maxBound | 有上下界的类型 | Int、Bool、Char |
2. 数值运算类(Numeric模块)
| 类型类 | 核心方法 | 核心用途 | 典型实例 |
|---|---|---|---|
Num | (+)、(-)、(*)、fromInteger | 基础数值运算 | Int、Double、Integer |
Fractional | (/)、fromRational | 分数运算(除法) | Double、Float、Rational |
Floating | sin、cos、exp等 | 浮点数专用运算 | Double、Float |
Integral | div、mod、toInteger | 整数专用运算 | Int、Integer |
Real | toRational | 实数转换(连接整数/分数) | Int、Double、Rational |
RealFrac | properFraction | 实数转分数(取整/小数部分) | Double、Float |
RealFloat | floatRadix、exponent | 浮点数底层操作 | Double、Float |
3. 函子类(Functor体系)
| 类型类 | 核心方法 | 核心用途 | 典型实例 |
|---|---|---|---|
Functor | fmap、<$> | 单参数容器映射(无副作用) | []、Maybe、IO、Either e |
Contravariant | contramap | 逆变函子(反向映射) | Predicate、Comparison |
Applicative | pure、<*> | 多参数容器映射(无依赖) | []、Maybe、IO |
Alternative | empty、`< | >` | Applicative的“可选/多值”扩展 |
Monad | (>>=)、return | 单子(顺序依赖计算) | []、Maybe、IO、Either e |
MonadPlus | mzero、mplus | Monad的“可选/多值”扩展 | []、Maybe |
MonadIO | liftIO | 嵌入IO操作的Monad | IO、ReaderT r IO |
MonadReader | ask、local | 只读环境的Monad | Reader r |
MonadWriter | tell、listen | 写日志的Monad | Writer w |
MonadState | get、put | 带状态的Monad | State s |
4. 容器遍历/聚合类
| 类型类 | 核心方法 | 核心用途 | 典型实例 |
|---|---|---|---|
Foldable | foldMap、foldr | 容器折叠(聚合/遍历) | []、Maybe、Tree、Map k |
Traversable | traverse、sequenceA | 带副作用的容器遍历 | []、Maybe、Tree |
Traversable1 | traverse1 | 非空容器的Traversable | NonEmpty、Vector |
5. 代数结构类(Semigroup/Monoid)
| 类型类 | 核心方法 | 核心用途 | 典型实例 |
|---|---|---|---|
Semigroup | (<>) | 结合律二元操作(无单位元) | String、[a]、Sum Int |
Monoid | mempty、mappend | 幺半群(Semigroup + 单位元) | String、[a]、Sum Int |
Group | invert | 群(Monoid + 逆元) | Sum Int、Product Int |
6. 函数操作类
| 类型类 | 核心方法 | 核心用途 | 典型实例 |
|---|---|---|---|
Arrow | arr、(>>>) | 箭头(函数的抽象扩展) | (->)、Kleisli m |
Applicative | (同前) | 函数作为容器的多参数映射 | (->) r |
Monad | (同前) | 函数作为容器的顺序计算 | (->) r |
7. 错误处理类
| 类型类 | 核心方法 | 核心用途 | 典型实例 |
|---|---|---|---|
MonadError | throwError、catchError | 带错误处理的Monad | Either e、ExceptT e m |
Exception | toException、fromException | 异常类型(IO错误) | IOException、ArithException |
8. 其他实用类
| 类型类 | 核心方法 | 核心用途 | 典型实例 |
|---|---|---|---|
IsString | fromString | 字符串字面量转换(OverloadedStrings扩展) | String、Text、ByteString |
Generic | from、to | 泛型编程(自动派生实例) | 所有自定义数据类型 |
Lift | lift | 模板Haskell中的类型提升 | 基本类型、容器类型 |
三、关键补充说明
1. “所有类型类”的范围界定
- 标准库核心:上述清单覆盖了
base包中99%的常用类型类,是Haskell编程的核心基础; - 扩展类型类:部分类型类(如
MonadTrans、MonadCont)在transformers包中,属于标准库的扩展,需手动导入; - 自定义类型类:开发者可基于上述设计模式自定义类型类(如业务相关的
ToJSON/FromJSON在aeson包中)。
2. 学习优先级建议
无需一次性掌握所有类型类,按以下顺序学习:
- 基础类(Eq/Ord/Show/Read)→ 数值类(Num/Fractional)→ 函子类(Functor/Applicative/Monad);
- 容器类(Foldable/Traversable)→ 代数结构类(Semigroup/Monoid)→ 高级Monad(MonadReader/MonadState)。