Agregando a las muchas buenas respuestas aquí en este hilo, el hecho de que Scala no nos está dando llamada de cola optimizable El combinador de punto fijo me ha estado molestando tanto que he decidido escribir una macro para traducir la llamada tipo Y-combinator a una llamada recursiva ordinaria e idiomática (con la optimización de la cola de llamada, por supuesto). La idea es que una llamada como
fix[Int,Int]((next) => (y) => ...body...)
es fácilmente traducible a
({(input) =>
object next {
def apply(y:Int):Int = ...body...
}
next(input)
})
He tolerado aplicación macro de orientación de Scala 2.11 (con pequeño ajuste también debe trabajar con 2.10) en this gist.
Con esta macro, podemos realizar tareas recursivas ordinarias de forma anónima sin temor al desbordamiento de pila, p.
import asia.blip.ymacro.YMacro._
(y[BigInt,BigInt]((xx) => (y) => if(y==1) 1 else y * xx(y-1)))(2000)
da
res0: BigInt = 33162750924506332411753933805763240382811...
Wow, amaizing. Gracias. – aioobe
"Asombroso" en el sentido original de hacerme sentir como si estuviera perdido en un laberinto. 'fix' es una función que toma como entrada una función que toma un solo argumento y devuelve otra función que toma un solo argumento, y luego ... OK, voy a necesitar una mejor explicación de * alguien * .. – Malvolio
Pero esto no permite la optimización de la cola de llamadas, ¿estoy en lo correcto? – fresskoma