9

¿Hay alguna manera de declarar una función antes de definirla en OCaml? Estoy usando un intérprete OCaml.OCaml: declarar una función antes de definirla

Tengo dos funciones:

let myFunctionA = 
(* some stuff here..... *) myFunctionB (*some stuff *) 

let myFunctionB = 
(* some stuff here .... *) myFunctionA (* some stuff *) 

esto no funciona, sin embargo, ya no se puede llamar myFunctionA myFunctionB antes de que está hecho.

He hecho algunas búsquedas en Google pero parece que no encuentro nada. ¿Cómo puedo lograr esto?

+0

Palabras claves relevantes: "función núcleocurricular ocaml". Ver [Notas sobre OCaml: Funciones mutuamente recursivas] (http://www.csc.villanova.edu/~dmatusze/resources/ocaml/ocaml.html#Mutually%20recursive%20functions). –

+1

No puedo decir que alguna vez haya escuchado que la co-recursión implique una recursión mutua, aunque es bastante obvio lo que significa. – nlucaroni

Respuesta

21

Lo que desea es que estas dos funciones sean mutuamente recursivas. En lugar de utilizar "dejar que ... vamos ...", usted tiene que utilizar "dejar que rec ... y ..." de la siguiente manera:

let rec myFunctionA = 
(* some stuff here..... *) myFunctionB (*some stuff *) 

and myFunctionB = 
(* some stuff here .... *) myFunctionA (* some stuff *) 
2

realidad "vamos rec .." tiene una muy grave limitación: solo funciona dentro de un solo módulo. Esto obliga al programador a escribir grandes módulos donde no se desea ... ¡un problema que no ocurre en baja C!

Hay varias soluciones, todas insatisfactorias. La primera es crear una variable del tipo de función e inicialmente almacenar una función que genera una excepción en ella, y luego almacenar el valor deseado.

El segundo es usar tipos de clases y clases (y una indirección). Si tiene muchas funciones mutuamente recursivas, esta es la mejor manera (porque solo necesita pasar un solo objeto a cada una de ellas).

Lo más fácil y feo es pasar las funciones entre sí como argumentos, una solución que rápidamente se sale de control. En un módulo que sigue todas las definiciones, puede simplificar el código de llamada introduciendo un conjunto de envoltorios "let rec". Desafortunadamente, esto no ayuda a definir las funciones, y es común que la mayoría de las llamadas ocurran en tales definiciones.

+0

Tenga en cuenta que esto ahora se ve facilitado por los módulos recursivos, por ejemplo: http://stackoverflow.com/a/33482273/2482998. Sin embargo, sigue siendo bastante incómodo. – antron

Cuestiones relacionadas