Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

定義済み演算

Warning

この章は書きかけです

seg_libを利用するたびにMonoidトレイトなどを実装するのは面倒です。 そこで、典型的なモノイドのテンプレートを用意しました。 一覧はドキュメントから確認できます。

モノイドのテンプレート

実装例(加法モノイド)

#![allow(unused)]
fn main() {
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct Add<T>(PhantomData<T>);

impl<T> Monoid for Add<T>
where
    T: Zero,
    for<'a> &'a T: std::ops::Add<Output = T>,
{
    type Set = T;

    const IS_COMMUTATIVE: bool = true;

    fn identity() -> Self::Set {
        T::zero()
    }

    fn combine(lhs_or_prev: &Self::Set, rhs_or_new: &Self::Set) -> Self::Set {
        lhs_or_prev + rhs_or_new
    }
}
}

例えば、Add<i32>はモノイド(i32, +, 0)に対応します。

トレイト境界のとり方には他にもいくつかのパターンが考えられます。

  • T: Copy + Zero + std::ops::Add<Output = T>
  • T: Clone + Zero + std::ops::Add<Output = T>

これらは、combine()の挙動に影響を与えます。 最適な実装は型に依るため、ユーザーに定義してもらうことにしました。

Tip

i32Monoidトレイトを直接実装してはいけません。 例えば、(i32, +, 0)(i32, *, 1)が共存できないためです。

モノイド作用について

現在の実装では関連型にモノイドのテンプレートを利用することはできますが、act()はユーザーが定義することになっています。

Note

将来的には定義済み演算の間のモノイド作用を全て提供することも考えています。 区間幅の情報が必要な場合にusizeから適切に型を変換する必要があり、num_traitsFromPrimitiveが利用できます。