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())
}

さらに進む

internal にヘルパーを追加するのは、2 つ以上の表現パッケージがそれを必要とし、かつ公開 API にすべきでない場合だけにしてください。ユーザーが呼び出すべきものは core か表現パッケージに置きます。

よくある落とし穴

  • 誤った単位元。 pow_nat は one に掛け合わせていくため、単位元以外を渡すと one · a^e になります。
  • 公開アクセスを期待する。 モジュール外のコードは internal をインポートできません。代わりに公開メソッドを通じて振る舞いを公開してください。

次のステップ