跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
Lean导入与模块
”︁
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
= Lean导入与模块 = == 介绍 == 在Lean编程语言中,'''导入(Import)'''和'''模块(Module)'''是组织代码的基本机制。模块允许将相关定义分组到逻辑单元中,而导入机制则使一个模块能够访问另一个模块的内容。理解这些概念对于构建可维护的Lean项目至关重要。 Lean采用类似其他函数式语言(如Haskell)的模块系统,但具有依赖类型理论特有的功能。模块可以包含: * 定义(Definitions) * 定理(Theorems) * 公理(Axioms) * 其他模块的导入 == 基本语法 == === 模块声明 === 每个Lean文件自动成为一个模块。模块名通常与文件名匹配(去掉.lean扩展名): <syntaxhighlight lang="lean"> -- 文件: MyModule.lean module MyModule where def myFunction := "Hello" </syntaxhighlight> === 导入语句 === 使用`import`关键字导入其他模块: <syntaxhighlight lang="lean"> import Mathlib.Algebra.Group.Defs import MyOtherModule </syntaxhighlight> == 导入机制详解 == === 基本导入 === 最简单的形式是直接导入整个模块: <syntaxhighlight lang="lean"> import Init.Core </syntaxhighlight> 这会导入Init.Core模块中的所有定义,可通过完全限定名访问(如`Init.Core.true`)。 === 限定导入 === 可以给导入的模块指定别名: <syntaxhighlight lang="lean"> import Init.Data.List as List </syntaxhighlight> 现在可以通过`List.`前缀访问该模块内容。 === 选择性导入 === 只导入模块的特定部分: <syntaxhighlight lang="lean"> import Init.Data.List (cons, nil) </syntaxhighlight> === 开放命名空间 === 使用`open`命令避免重复输入长前缀: <syntaxhighlight lang="lean"> open Nat -- 现在可以直接使用succ而不是Nat.succ </syntaxhighlight> == 模块组织最佳实践 == === 模块层次结构 === 良好的模块结构通常反映领域概念: <mermaid> graph TD A[Mathlib] --> B[Algebra] A --> C[Analysis] B --> D[Group] B --> E[Ring] C --> F[Calculus] C --> G[Topology] </mermaid> === 避免循环依赖 === Lean不允许模块间的循环导入。设计时应遵循: <mermaid> graph LR A[Core] --> B[Utilities] B --> C[Features] </mermaid> 而不是: <mermaid> graph LR A --> B B --> C C --> A </mermaid> == 实际案例 == === 数学库示例 === 以下是Mathlib中典型的导入结构: <syntaxhighlight lang="lean"> import Mathlib.Algebra.Group.Defs import Mathlib.Data.Nat.Basic import Mathlib.Tactic open Nat open Group </syntaxhighlight> === 项目结构示例 === 假设我们构建一个几何库: ``` Geometry/ ├── Basic/ │ ├── Points.lean │ └── Vectors.lean ├── Shapes/ │ ├── Circles.lean │ └── Polygons.lean └── Geometry.lean ``` Geometry.lean内容: <syntaxhighlight lang="lean"> import Geometry.Basic.Points import Geometry.Basic.Vectors import Geometry.Shapes.Circles import Geometry.Shapes.Polygons </syntaxhighlight> == 高级主题 == === 私有定义 === 使用`private`关键字限制定义的可见性: <syntaxhighlight lang="lean"> private def internalHelper := 42 def publicFunction := internalHelper + 1 </syntaxhighlight> `internalHelper`只能在当前模块访问。 === 模块参数化 === Lean支持参数化模块(类似函子): <syntaxhighlight lang="lean"> module MyModule (α : Type) where def identity (x : α) : α := x </syntaxhighlight> == 常见问题 == '''Q: 如何解决"unknown identifier"错误?''' A: 确保: 1. 已正确导入包含该定义的模块 2. 拼写正确(包括大小写) 3. 如果需要,已打开正确的命名空间 '''Q: 导入顺序是否重要?''' A: 通常不重要,但会影响实例解析顺序。有冲突时应明确限定。 == 数学表示 == 模块系统可以形式化为: <math> \mathcal{M} ::= \mathbf{module}\ M\ \mathbf{where}\ \overline{\mathcal{D}}\ |\ \mathbf{import}\ M\ [\mathbf{as}\ A]\ [(\overline{s})] </math> 其中: * <math>\mathcal{M}</math>是模块声明 * <math>\overline{\mathcal{D}}</math>是定义序列 * <math>M</math>是模块名 * <math>A</math>是别名 * <math>\overline{s}</math>是选择性导入的符号列表 == 总结 == Lean的模块系统提供了: * 代码组织的基本单元 * 可控的可见性机制 * 避免命名冲突的手段 * 逻辑分组的便利 正确使用导入和模块能显著提高代码的可维护性和重用性。初学者应从简单的平面结构开始,随着项目增长逐步引入层次结构。 [[Category:计算机科学]] [[Category:Lean]] [[Category:Lean基础]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)