データ構造に乗せる代数的構造の持ち方
上の記事で D として書かれているものを、利用者側が構造体を書かなくてもよいような方法で実装してみました。
だいたい次のような見た目となります。詳細は src/alg.rs
※今後もころころ宗旨替えすると思われます
|
|
同様のものを trait Group
などと定義しておきます。
整数型に対して struct Addition<T>;
等をあらかじめ作っておいてもよいと思います。
なお、MonoidImpl
が単位元を含めて Fn
で持っているのは、キャプチャがなければメモリ消費がないのできれいな気がしたからです。
利点
特に Rust っぽいもの
- ライブラリの利用者側のコードが少ない
- ある則を満たすときだけ実装ということができる。Binary Indexed Tree:
Monoid
ならprefix_sum
を、さらにGroup
ならsum
を実装するなど - 平衡二分木の各ノードに持たせるなどしてもメモリを消費しない
欠点
- 種種の代数的構造の
XxxImpl
を用意すると嵩む - データ構造の
merge
で困る(クロージャを呼び出すために&self
に手を出してしまったので、型が同じでも同じ代数的構造とは限らない) - そもそも抽象化やその方法を固定することは柔軟性を失いそう