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(),且只需 O(log⁡e)O(\log e) 次乘法。

对单项式求值

求值时,对每个变量把系数乘以 aiαia_i^{\alpha_i}:

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;请改为通过公开方法暴露行为。

后续步骤