型レベル整数ライブラリtypenumの紹介

Rust
Published

December 13, 2020

はじめに

型レベル整数とは,型によって整数を表現する方法です.この型とは整数を表すi32や文字列を表すStringと同様のものです.すなわち,1を表す型や,2を表す型を定義し,それらによって整数を型レベルで表現します.

型レベル整数の嬉しい点として,型レベル整数による式はコンパイル時に評価されることが挙げられます.これによって,各種定数を容易に設定することが可能となります.

Rustにて型レベル整数の実装として,typenumというクレートがあります.ここでは,このtypenumの簡単な使用方法を紹介します.

やったこと

  • typenumによる型レベル整数の定義
  • typenumによってサポートされる演算の評価

実際に型レベル整数を使ってみる

それでは,実際にtypenumを使用して整数の演算を行っていきます.まず,1+2を計算する例を以下に示します. ここで,P1P2はそれぞれ12を,Sumは加算を表します.また,to_i32()は型レベル整数が示す値をi32へ変換する処理です.

:dep typenum
//above line is magic for adding crate

use typenum::*;

type A = Sum<P1, P2>; // A is P3
assert_eq!(A::to_i32(), 3); //  A::to_i32() == 3

以上の結果より,適切に型レベルで1+2が計算出来たことがわかります. 次はもう少し複雑な例について考えます.以下に示すコードは,型レベル整数を用いて,((1 + 2 ) * 3 - 4) / 5を計算します.ここで,Quotは除算を,Diffは減算を,Prodは乗算を表します.

use typenum::*;

type A = Quot<Diff<Prod<Sum<P1, P2>, P3>, P4>, P5>; // A is P1
assert_eq!(A::to_i32(), 1); //  A::to_i32() == 1

ここでは,最低限の演算しか紹介しませんでしたが,typenumにはこれら以外にも多くの機能が実装されています.興味のある方は,是非確認してみてください.

参考