internal 教程
本页面向贡献者:说明在开发 luna-poly 本身时何时使用 internal 包。库的使用者从不导入它,MoonBit 也不允许模块外的包导入它。
快速开始
在 luna-poly 的包内,在 moon.pkg 中导入它:
import {
"Luna-Flow/luna-poly/internal",
}
并用显式单位元把一个值提升到自然数次幂:
let cube = @internal.pow_nat(x, 3U, one=@lg.One::one())
日常任务
为新表示实现 pow
与现有类型完全一样,用该表示自己的单位元委托给 pow_nat:
pub fn[A : Eq + AddMonoid + Mul + One] MyPolynomial::pow(
self : MyPolynomial[A],
exponent : UInt,
) -> MyPolynomial[A] {
@internal.pow_nat(self, exponent, one=MyPolynomial::one())
}
这样对每个输入都有 pow(0) == one(),且只需 次乘法。
对单项式求值
求值时,对每个变量把系数乘以 :
let mut term = coefficient
for i in 0..<exponent.length() {
term = term * @internal.pow_nat(values[i], exponent[i], one=@lg.One::one())
}
深入了解
仅当两个或更多表示包都需要某个辅助函数、且它不应成为公开 API 时,才把它加入 internal。用户应调用的内容属于 core 或某个表示包。
常见陷阱
- 错误的单位元。
pow_nat是乘到one上的;传入单位元以外的值会得到one · a^e。 - 期望公开访问。 模块外的代码无法导入
internal;请改为通过公开方法暴露行为。
后续步骤
- internal API 和 internal 设计。
- 架构指南展示了
internal在包依赖图中的位置。