2012-04-26 23 views
5

Tôi muốn triển khai hàm F # có thể chấp nhận 1 hoặc 2 đối số. Tôi muốn sử dụng chức năng như sau:Cách triển khai đối số biến trong F #

let foo = ... 
foo "a" 
foo "a" "b" 

Cả hai đối số đều có thể cùng loại. Tôi đã đọc các trang về mô hình đối sánh , mẫu đang hoạt động, nhưng không thể tìm thấy một mẫu phù hợp với tôi.

+0

Đó là một thói quen xấu để trả lời, bạn không thực sự cần nó, nhưng đó là những gì đến với tâm trí của tôi. Nếu đối số của bạn là danh sách các giá trị cùng loại, chỉ cần đặt chúng thành 'danh sách'. Nếu một trong số chúng là tùy chọn (ví dụ: có thể có giá trị mặc định có thể bỏ qua), hãy đặt tùy chọn: 'foo (a,? B)'. Bạn cũng có thể xem xét DU, nếu dữ liệu của bạn có thể được đại diện theo cách này. Nếu không, tôi sẽ chỉ sử dụng hai chức năng. – bytebuster

Trả lời

2

Ngoài các câu trả lời khác, bạn cũng có thể làm những gì bạn muốn thông qua một phần ứng dụng và currying. Như thế này:

let foo a b = 
    a + b 

let foo2 a = 
    foo 1 a;; 

Rõ ràng bạn muốn sửa chữa các tham số đầu tiên trong các cuộc gọi đến foo trong foo2 để bất cứ điều gì mặc định mà bạn muốn.

7

Tôi tin rằng điều này là do một số tính năng cơ bản Net, nhưng tôi nghĩ rằng bạn phải sử dụng một lớp học với phương pháp quá tải - một cái gì đó giống như

type t() = 
    static member foo a = "one arg" 
    static member foo (a,b) = "two args" 
+5

Lưu ý rằng thứ hai phải là một bộ tuple vì nếu không 'foo 'a" 'là mơ hồ giữa việc gọi quá tải đầu tiên và nghiền thứ hai. – Guvante

5

Trên một thành viên loại, bạn có thể sử dụng tùy chọn params :

type Helper private() = 
    static member foo (input1, ?input2) = 
      let input2 = defaultArg input2 "b" 
      input1, input2 

Để gọi phương pháp này:

Helper.foo("a") 
Helper.foo("a", "b") 

đây có phải là những gì bạn đang sau?

Tuy nhiên, bạn không thể sử dụng các tham số tùy chọn trên một hàm.

3

Ngoài các câu trả lời khác, dưới đây là một vài "giải pháp gần như" khác. Họ không hoàn toàn là những gì bạn muốn, nhưng dù sao cũng đáng biết.

Sử dụng một danh sách (hoặc một mảng) và phù hợp với mô hình:

let f = function 
    | [a, b] -> ... 
    | [a] -> ... 
    | [] -> failwith "too few arguments" 
    | _ -> failwith "too many arguments" 

f ["a"] 
f ["a" ; "b"] 

vấn đề: các thông số không được đặt tên, không rõ ràng từ chữ ký chức năng có bao nhiêu thông số phải mất.

Sử dụng một kỷ lục để vượt qua tất cả các thông số tùy chọn:

type FParams = { a : string; b : string } 
let fdefault = { a = "a" ; b = "b" } 

let f (pars: FParams) = ... 

f { fdefault with b = "c" } 

Vấn đề: một cũng là tùy chọn, mà không phải là những gì bạn muốn. Có thể hữu ích mặc dù.

Các vấn đề liên quan