2013-01-07 15 views
6

これはa question I asked almost two years agoのフォローアップです。私はまだベクトル/行列/テンソルの次元が型システム(Peanoの番号付け)を使ってコード化されている小さな線形代数ライブラリを書く型システムを試しています。これにより、コンパイラはバイナリ演算を対応する次元のオブジェクトに制限することができます。タイプシステムを使用して整数を数値に変換する

正常に動作しますが、手動で各寸法タイプを指定する必要があります。例えば、(shapeless natural numbersを使用して):

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

それは小さなサイズのために大丈夫ですが、私はサイズ_1024を定義する必要がある場合、それは退屈。コンパイル時に整数リテラルを対応するPeano-number型に変換する方法を見つけようとしています(成功なし)。

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

+1

2.10はdefマクロのみをサポートしているので、マクロ天国のhttp: /docs.scala-lang.org/overviews/macros/paradise.html –

+0

スカラサポートは依存していますタイプ?私はそれについていくつかの背景を持つことができますか? – Bill

+0

@Billはマクロの例を見ています。マクロ結果の型は依存型です。 – paradigmatic

答えて

8

これは、マクロが2.10.0の場合に可能です(ただし、構文はParadiseでより洗練されます)。

val holder = NatExample.toNat(13) 

そして:

scala> implicitly[holder.N =:= shapeless.Nat._13] 
res0: =:=[holder.N,shapeless.Nat._13] = <function1> 
私はそれが簡単にはるかに簡潔-いるあなたは、このように使用することができます作ることができる-I'mは必ずオフカフ完全な作業例 hereを掲載しました

リテラルでない整数などを渡すと、合理的なコンパイル時エラーが発生します。

+0

この文脈では= = =演算子は何を意味しますか? –

+2

コンパイラが2つの型が同じであることを証明する証拠を提供する[標準ライブラリ型のクラス](http://www.scala-lang.org/api/current/index.html#scala.Predef$)です。どのように使用されているのかについては、2.10より前です(たとえば、[この回答](http://stackoverflow.com/a/3427759/334519)を参照してください)。 –