Я не уверен, что это то, что вы ищете, но если у вас есть представление натуральных чисел на уровне уровня (я буду использовать Shapeless в этом ответе), вы можете написать значащий Fibonacci
тип класса, как это, например:
import shapeless._, Nat._
trait Factorial[N <: Nat] { type Value <: Nat }
implicit object fact0 extends Factorial[_0] { type Value = _0 }
implicit object fact1 extends Factorial[_1] { type Value = _1 }
implicit def factN[N <: Nat, X <: Nat, Y <: Nat, Z <: Nat](implicit
nf: Factorial[N] { type Value = X },
sf: Factorial[Succ[N]] { type Value = Y },
sum: ops.nat.Sum.Aux[X, Y, Z]
) = new Factorial[Succ[Succ[N]]] { type Value = Z }
Тогда я могу попросить систему типа, чтобы доказать, например, что седьмое число Фибоначчи тринадцать (потому что):
scala> implicitly[Factorial[_7] { type Value = _13 }]
res1: Factorial[shapeless.Nat._7]{type Value = shapeless.Nat._13} = [email protected]
Но не о том, что седьмое число Фибоначчи - двенадцать:
scala> implicitly[Factorial[_7] { type Value = _12 }]
<console>:23: error: could not find implicit value for parameter e: Factorial[shapeless.Nat._7]{type Value = shapeless.Nat._12}
implicitly[Factorial[_7] { type Value = _12 }]
^
Этот подход использует Church encoding натуральных чисел. Вы также можете использовать одноэлементные типы с макросами в Scala 2.10 - см., Например, my blog post here для некоторого обсуждения одноэлементных типов в Scala.
В чем смысл? –
Я имею в виду: _Do такие типы имеют смысл? _/Редактирование вопроса/ – Michael
Конечно, вы можете определить пользовательские типы на любом языке. Так что не совсем понятно, что вы просите. –