Eğer doğru bir şekilde anlıyorsam, scala.util.control.TailCalls, kuyruk-özyinelemeli işlevler için bir tramplen kullanarak yığın taşmalarını önlemek için kullanılabilir. API verilen örnek nettir: recursve çağrı sonrasında bazı işlemleri yapmak istiyorsanızTailCalls nasıl kullanılır?
import scala.util.control.TailCalls._
def isEven(xs: List[Int]): TailRec[Boolean] =
if (xs.isEmpty) done(true) else tailcall(isOdd(xs.tail))
def isOdd(xs: List[Int]): TailRec[Boolean] =
if (xs.isEmpty) done(false) else tailcall(isEven(xs.tail))
isEven((1 to 100000).toList).result
Ancak daha ilginç bir durumdur. Ben bir "naif" faktöryel uygulama nasılsa
def fac(n:Long): TailRec[Long] =
if (n == 0) done(1) else done(n * tailcall(fac(n - 1)).result)
tarafından çalışan ama bu korkunç görünüyor ve bu amaçlanan kullanımıdır şüphe var. Yani benim sorum TailCalls kullanarak doğru bir faktöriyel veya fibonacci fonksiyonu yazmak (evet, ben onları kuyruk-özyinelemeye almak için akümülatörler kullanmayı biliyorum)? Ya da TailCalls bu tür bir problem için uygun değil mi?
"scala.util.control.TailCalls bir hack" derken, lütfen ne zaman kullanıma uygun olduğunu söyler misiniz? –
"hack" buradaki anlamıyla burada değildi. TailCalls, karşılıklı özyinelemeli çağrılardan yığın taşmasını önlemek için mükemmel şekilde uygundur. –