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())
}
さらに進む
internal にヘルパーを追加するのは、2 つ以上の表現パッケージがそれを必要とし、かつ公開 API にすべきでない場合だけにしてください。ユーザーが呼び出すべきものは core か表現パッケージに置きます。
よくある落とし穴
- 誤った単位元。
pow_natはoneに掛け合わせていくため、単位元以外を渡すとone · a^eになります。 - 公開アクセスを期待する。 モジュール外のコードは
internalをインポートできません。代わりに公開メソッドを通じて振る舞いを公開してください。
次のステップ
- internal API と internal の設計。
- アーキテクチャガイド は、パッケージグラフにおける
internalの位置を示しています。