2010-09-01 10 views
11

thể trùng lặp:
[F#] How to have two methods calling each other?F #: chức năng lẫn nhau đệ quy

Xin chào tất cả,

I Have một kịch bản mà tôi có hai chức năng sẽ được hưởng lợi từ việc đệ quy lẫn nhau nhưng Tôi không thực sự chắc chắn cách thực hiện việc này trong F #

Kịch bản của tôi là n ot đơn giản như đoạn mã sau, nhưng tôi muốn để có được một cái gì đó tương tự để biên dịch:

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

Xem thêm http://stackoverflow.com/questions/1378575/f-forward-type-declarations – Brian

+0

Tôi ngần ngại để đánh dấu cái này là trùng lặp, vì tiêu đề có lẽ là tốt hơn ... – Benjol

+0

@Benjol: Nói chung, chúng tôi không * xóa * trùng lặp với các tiêu đề khác nhau đáng kể để cải thiện khả năng tìm kiếm, nhưng chúng tôi vẫn đóng chúng. – dmckee

Trả lời

22

Bạn có thể cũng sử dụng letrec ... and dạng:

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

Đánh bại tôi với nó bằng 42 giây ... :-) –

+1

+1, Nice, không nhận ra bạn có thể sử dụng 'và' với các ràng buộc. Tôi nghĩ rằng việc sử dụng nó bị hạn chế đối với các khai báo 'type'. – JaredPar

+0

Nó đặc biệt hữu ích (cần thiết) nếu bạn có các kiểu đệ quy lẫn nhau (như hai DU) và hai hàm lấy mỗi đối số đầu vào. – Stringer

2

Để có được chức năng hai bên đệ quy đơn giản là vượt qua một đến khác như một tham số

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

sử dụng let rec ... and ... xây dựng:

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