2010-09-01 16 views
11

Duplicar posibles:
[F#] How to have two methods calling each other?F #: funciones mutuamente recursivas

Hola a todos,

Tengo un escenario en el que tengo dos funciones que se beneficiarían de ser mutuamente recursivo, pero No estoy seguro de cómo hacer esto en F #

Mi escenario es n OT tan simple como el siguiente código, pero me gustaría conseguir algo similar para compilar:

let rec f x = 
    if x>0 then 
    g (x-1) 
    else 
    x 

let rec g x = 
    if x>0 then 
    f (x-1) 
    else 
    x 
+0

Véase también http://stackoverflow.com/questions/1378575/f-forward-type-declarations – Brian

+0

dudo en marcar éste como el duplicado, porque el título es probablemente mejor ... – Benjol

+0

@Benjol: Por lo general, no * eliminamos * duplicados con títulos sustancialmente diferentes para mejorar la capacidad de búsqueda, pero aún así los cerramos. – dmckee

Respuesta

22

Puede también utilizar letrec ... and formulario:

let rec f x = 
    if x>0 then 
    g (x-1) 
    else 
    x 

and g x = 
    if x>0 then 
    f (x-1) 
    else 
    x 
+1

Pásame por 42 segundos ... :-) –

+1

+1, Bonito, no me di cuenta de que podías usar 'y' con soltar enlaces. Pensé que su uso estaba restringido a las declaraciones de 'tipo'. – JaredPar

+0

Es especialmente útil (necesario) si tiene tipos mutuamente recursivos (como dos DU) y dos funciones que toman cada uno como un argumento de entrada. – Stringer

2

Para obtener funciones mutuamente recursivas simplemente pasar uno al otro como un parámetro

let rec f g x = 
    if x>0 then 
    g (x-1) 
    else 
    x 

let rec g x = 
    if x>0 then 
    f g (x-1) 
    else 
    x 
2

utilizar la construcción let rec ... and ...:

let rec f x = 
    if x>0 then 
    g (x-1) 
    else 
    x 

and g x = 
    if x>0 then 
    f (x-1) 
    else 
    x 
Cuestiones relacionadas