2013-01-07 18 views
6

Bu, a question I asked almost two years ago numaralı belgenin devamı niteliğindedir. Yine de, vektör sistemi/matris/tensörlerin boyutlarının tip sistemi (Peano numaralandırma ile) kullanılarak kodlandığı küçük bir lineer cebir kütüphanesi yazmak için tip sistemi ile deneyler yapıyorum. Bu, derleyicinin ikili işlemleri ilgili boyutlardaki nesnelere kısıtlamasına izin verir.Tür sistemiyle tamsayıların peano sayılarına dönüştürülmesi

İyi çalışıyor, ancak her boyut türünü manuel olarak belirtmeliyim. Örneğin (shapeless natural numbers kullanarak):

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

Küçük boyutları için Tamam ama boyutu _1024 tanımlamak gerekirse sıkıcı olur. Ben (başarı olmadan), karşılık gelen Peano-number türüne bir tamsayı değişmezini (derleme zamanında) dönüştürmenin bir yolunu bulmaya çalışıyorum.

Daniel Sobral answer yorumunda, Scala'nın bağımlı türleri desteklememesi nedeniyle bunun mümkün olmadığı söylendi. Şimdi, Scala 2.10'un hem bağımlı türleri hem de makroları var. Yani bunu başarmanın bir yolu var mı?

+1

2.10 yalnızca makroları desteklediğinden, makro cennette makro türlerine bakmanız gerektiğini düşünüyorum: http://docs.scala-lang.org/overviews/macros/paradise.html –

+0

Scala desteği bağlıdır ent türleri? Bunun üzerinde biraz arka plan olabilir mi? – Bill

+0

@Bill, makrolara bir göz atın. Makro sonuç türü bağımlı bir türüdür. – paradigmatic

cevap

8

Bu, şu an için 2.10.0'daki makrolarla mümkündür (sözdizimi Paradise ile daha temiz olacak olsa da).

val holder = NatExample.toNat(13) 

Ve sonra:

scala> implicitly[holder.N =:= shapeless.Nat._13] 
res0: =:=[holder.N,shapeless.Nat._13] = <function1> 
Ben örnek here çalışan komple bir off-the-manşetini gönderdiniz -Emin kolayca çok daha özlü -ki böyle kullanabilirsiniz yapılmış olabilir

Tam olmayan bir tam sayı, vb. Iletirseniz, makul bir derleme zamanı hatasıyla başarısız olur.

+0

Bu bağlamda =: = operatörü ne anlama geliyor? –

+2

Derleyicinin iki türün aynı olduğunu bildiğine dair kanıt sağlayan bir [standart kitaplık türü sınıfı] (http://www.scala-lang.org/api/current/index.html#scala.Predef$). 2.10'dan önce oldu - nasıl kullanıldığına dair bir tartışma için örneğin [bu cevap] 'a bakın (http://stackoverflow.com/a/3427759/334519). –

İlgili konular