跳到主要内容

模块

module
就是Java里面的包,Python里面的模块,C++里面的命名空间
一个 Haskell 源文件只能有一个模块声明
模块声明(如果存在)必须位于文件的顶部
导入声明必须紧跟模块声明之后(如果有的话),并位于其他代码之前

模块声明

用于指定该模块的名称
并声明哪些符号(函数、数据类型等)应该被导出

其中,ModuleName 是模块的名称,通常与文件名相匹配
如果没有明确的模块声明,文件的模块名称将是 Main,并且它应该包含一个名为 main 的 IO 动作

--  基本模块声明,导出所有符号
module MyModule where

-- 明确导出列表,指定要导出的符号
module ModuleName (symbol1, symbol2, ...) where

-- 导出数据类型
module ModuleName (DataType(..)) where -- 导出 DataType 和其所有构造器
module ModuleName (DataType(Constructor1, Constructor2)) where -- 只导出特定构造器

-- 导出类型类
module ModuleName (TypeClass(..)) where -- 导出 TypeClass 的所有方法
module ModuleName (TypeClass(method1, method2)) where -- 只导出特定方法

-- 声明为子模块
module ModuleName.SubModuleName where

导入声明

-- 基本导入:导入所有符号
import ModuleName

-- 限制导入:只导入指定符号
import ModuleName (symbol1, symbol2)

-- 排除导入:导入除指定符号外的所有符号
import ModuleName hiding (symbol1, symbol2)

-- 别名:导入并为模块指定别名
import qualified ModuleName as Alias

-- 导入数据类型:导入数据类型和构造器
import ModuleName (DataType(..)) -- 导入 DataType 和其所有构造器
import ModuleName (DataType(Constructor1, Constructor2)) -- 只导入特定构造器

-- 导入类型类:导入类型类和方法
import ModuleName (TypeClass(..)) -- 导入 TypeClass 的所有方法
import ModuleName (TypeClass(method1, method2)) -- 只导入特定方法