Project Euler Problem #2 numaralı My Shapeless çözümüme başladım.Scala Shapeless Proje Euler Kodu # 2
import shapeless._, nat._, ops.nat.Sum
trait Fibonacci[N <: Nat] { type Out <: Nat }
object Fibonacci {
type Aux[N <: Nat, Out0 <: Nat] = Fibonacci[N] { type Out = Out0 }
def apply[N <: Nat](i: Nat)(implicit fib: Aux[i.N, N], n: Witness.Aux[N]):N = n.value
implicit val fib0 = new Fibonacci[_0] { type Out = _2 }
implicit val fib1 = new Fibonacci[_1] { type Out = _3 }
implicit def fibN[I <: Nat, L <: Nat, M <: Nat](implicit l: Aux[I, L],
m: Aux[Succ[I], M],
sum: Sum[L, M]) =
new Fibonacci[Succ[Succ[I]]] { type Out = sum.Out }
}
trait Fibs[N <: Nat] { type Out <: Nat }
object Fibs {
type Aux[N <: Nat, Out0 <: Nat] = Fibs[N] { type Out = Out0 }
def apply[N <: Nat](i: Nat)(implicit fibs: Aux[i.N, N], n: Witness.Aux[N]):N = n.value
implicit def fibs0(implicit f: Fibonacci[_0]) = new Fibs[_0] { type Out = f.Out }
implicit def fibsN[N <: Nat, R <: Nat, Z <: Nat](implicit fib: Fibonacci.Aux[Succ[Succ[Succ[N]]], R],
fibs: Aux[N, Z],
sum: Sum[R, Z]) =
new Fibs[Succ[N]] {
type Out = sum.Out
}
}
Şimdi Yapabileceğim:
ben bu kodla bile Nth
bir taneye kadar hep birlikte hatta beyaz yalanlar özetleyebilirim
val (evenFibs0, evenFibs1) = (Fibs(0), Fibs(1))
typed[_2](evenFibs0)
typed[_10](evenFibs1)
Bu benim bütün çift beyaz yalanlar almak nasıl: 2., 3. sıra ile başlıyorum ve her üç Fibonacci numarasını toplarım.
Şimdi sıkışmış durumdayım. takeWhile
'a benzer bir işlevselliğe sahip olmak istiyorum, bu yüzden limit
kabul eden bir işlevi yazabilirim ve şartları bu sınırı aşmayan çift fib'lerimi döndürürüm. Herhangi bir fikir?
İşte ben bugüne kadar ne denedim benim çaba:
trait EvenFibsWithLimit[N <: Nat, M <: Nat] { type Out <: Nat }
trait LowPriorityFibs3 {
type Aux[N <: Nat, M <: Nat, Out0 <: Nat] = EvenFibsWithLimit[N, M] { type Out = Out0 }
implicit def fibs0[M <: Nat] = new EvenFibsWithLimit[_0, M] { type Out = _0 }
implicit def fibsGT[N <: Nat, M <: Nat, O <: Nat](implicit f: EvenFibsWithLimit[N, M],
fib: Fibs.Aux[N, O],
l: ops.nat.LT[M, O]) = f
}
object EvenFibsWithLimit extends LowPriorityFibs3 {
def apply[N <: Nat, O <: Nat](limit: Nat)(implicit fibs: Aux[N, limit.N, O],
o: Witness.Aux[O]): O = o.value
implicit def fibsN[N <: Nat, M <: Nat, O <: Nat](implicit f: EvenFibsWithLimit[N, M],
f2: Fibs.Aux[Succ[N], O],
d: ops.nat.Diff[M, O]) =
new EvenFibsWithLimit[Succ[N], d.Out] {
type Out = O
}
}
fikri çıktı sınırından daha az olana kadar yinelemeli çıkışı ile sınırını çıkarmak amaçlanmıştır. Kesinlikle bir şeyin kokusunu alabiliyorum. Hiç Diff
'a ihtiyacım olduğunu sanmıyorum. Diğer bazı varyasyonları da denedim, ama takılmaya devam ediyorum. Düşündüm de belki
Ben benim Fibs
bir HList
inşa ve takeWhile
taklit eden bir yüklem typeclass ile Selector
kullanabilirsiniz: Ben derlemek, ben hatayı diverging implicit expansion for fibsN.
EDIT olsun. Düşünceler?
Güzel teknik. Artık şeylerin asılmasını sağlamaya başladım, teşekkürler. – beefyhalo