6

これは、ほぼ 2 年前に私が尋ねた質問のフォローアップです。ベクトル/行列/テンソルの次元が型システム (Peano 番号付け) を使用してエンコードされる小さな線形代数ライブラリを作成するために、型システムをまだ試しています。これにより、コンパイラは二項演算を対応する次元のオブジェクトに制限できます。

うまく機能しますが、各ディメンション タイプを手動で指定する必要があります。例(形のない自然数を使用):

type _1 = Succ[Nat._0]
type _2 = Succ[_1]
type _3 = Succ[_2]

小さいサイズは問題ありませんが、サイズを定義する必要があると退屈になります_1024。(コンパイル時に) 整数リテラルを対応する Peano-number 型に変換する方法を見つけようとしています (成功せずに)。

Daniel Sobral の回答コメントで、Scala は依存型をサポートしていないため、これは不可能であると言われました。現在、Scala 2.10 には依存型とマクロの両方があります。それを達成する方法はありますか?

4

1 に答える 1

8

これは、2.10.0 のマクロで現在可能です (ただし、Paradise では構文がよりきれいになります)。すぐに使える完全な動作例をここに投稿しました—もっと簡潔に簡単にできると思います—これは次のように使用できます。

val holder = NatExample.toNat(13)

その後:

scala> implicitly[holder.N =:= shapeless.Nat._13]
res0: =:=[holder.N,shapeless.Nat._13] = <function1>

非リテラル整数などを渡すと、妥当なコンパイル時エラーで失敗します。

于 2013-01-07T12:31:11.140 に答える