Próbuję zbadać możliwości z udoskonalonymi (i bezkształtnymi), aby poprawić sprawdzanie typu.W jaki sposób użyć wyrafinowanego do wyrażania wiązań ze stałymi> 22
Chciałbym reprezentować, z typem, niektóre ograniczenia interwału lub rozmiaru.
Tak, z wyrafinowane, mogę pisze takie rzeczy:
type Name = NonEmpty And MaxSize[_32]
type Driver = Greater[_15]
case class Employee(name : String @@ Name, age : Int @@ Driver = refineLit[Driver](18))
Ale chciałbym wyrazić contraints z kasowniki większe.
type BigNumber = Greater[_1000]
ten nie działa, ponieważ _1000
nie jest zdefiniowana. Ostatnia z nich to: _22
Mogę, z bezkształtnym Succ
, zrobić własne, ale jest bardzo uciążliwe.
Przykład:
type _25 = Succ[Succ[Succ[_22]]]
type _30 = Succ[Succ[Succ[Succ[Succ[_25]]]]]
type _40 = Succ[Succ[Succ[Succ[Succ[Succ[Succ[Succ[Succ[Succ[_30]]]]]]]]]]
type _50 = Succ[Succ[Succ[Succ[Succ[Succ[Succ[Succ[Succ[Succ[_40]]]]]]]]]]
type _60 = Succ[Succ[Succ[Succ[Succ[Succ[Succ[Succ[Succ[Succ[_50]]]]]]]]]]
type _70 = Succ[Succ[Succ[Succ[Succ[Succ[Succ[Succ[Succ[Succ[_60]]]]]]]]]]
type _80 = Succ[Succ[Succ[Succ[Succ[Succ[Succ[Succ[Succ[Succ[_70]]]]]]]]]]
type _90 = Succ[Succ[Succ[Succ[Succ[Succ[Succ[Succ[Succ[Succ[_80]]]]]]]]]]
type _100 = Succ[Succ[Succ[Succ[Succ[Succ[Succ[Succ[Succ[Succ[_90]]]]]]]]]]
// etc.
Czy istnieje lepszy sposób wyrazić takie contraints lub dokonać _1000
w bardziej efektywny sposób? Czy jest coś, co mógłbym przegapić?
Edit:
Próbowałem propozycję Travis:
val thousand = shapeless.nat(1000)
Ale ta linia powoduje StackOverflowError
w czasie kompilacji (w makr) Gdyby spróbować z mniejszą liczbę, jest w porządku.
val limit = shapeless.nat(50)
type BigNumber = Greater[limit.N]
case class TestBigNumber(limit : Int @@ BigNumber)
W moim środowisku, StackOverflowError jest podniesiona dla liczb większych niż 400.
Ponadto, z tego kodu, kompilacja nie zakończyła (używając SBT):
val n_25 = shapeless.nat(25)
type _25 = n_25.N
val n_32 = shapeless.nat(32)
type _32 = n_32.N
val n_64 = shapeless.nat(64)
type _64 = n_64.N
Możesz użyć 'val tys. = Nat (1000); wpisz BigNumber = Greater [thousand.N] ', który jest trochę ładniejszy. Pomyślałem, że można napisać coś w stylu "Nat." 100 "' N ", ale może to sobie wyobraziłem. –
@travis: Mam StackOverflowError podczas ekspansji makra na linii 'val tys. = Nat (1000)', zarówno w zaćmieniu i sbt – volia17