2010-09-01 4 views
11

Можно создать дубликат:
[F#] How to have two methods calling each other?F #: Взаимно рекурсивные функции

Привет всем,

У меня есть сценарий, где у меня есть две функции, которые выиграют от взаимно рекурсивная, но Я не уверен, как это сделать в F #

Мой сценарий - n Ot так просто, как следующий код, но я хотел бы получить что-то похожее на компилировать:

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

Смотрите также http://stackoverflow.com/questions/1378575/f-forward-type-declarations – Brian

+0

стесняюсь, чтобы отметить этот как дубликат, потому что название, вероятно, лучше ... – Benjol

+0

@Benjol: Как правило, мы не дублируем * delete * с существенно разными названиями, чтобы улучшить возможности поиска, но мы все еще закрываем их. – dmckee

ответ

22

Вы можете также использовать letrec ... 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 
+1

Ударьте меня на 42 секунды ... :-) –

+1

+1, Ницца, не понял, что вы можете использовать 'и' с let bindings. Я думал, что использование ограничено декларациями типа. – JaredPar

+0

Это особенно полезно (необходимо), если у вас есть взаимно рекурсивные типы (например, два DU) и две функции, которые принимают каждый в качестве входного аргумента. – Stringer

2

Чтобы получить взаимно рекурсивные функции просто переходят друг к другу в качестве параметра

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

используйте 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 
Смежные вопросы