2009-03-23 31 views
23

Tôi có một hàm trong C# và tôi muốn chuyển nó (trong số một số thứ khác) sang F #, chỉ để làm việc đó. Thật không may, tôi chỉ cần nhấn một trường hợp mà dường như không có cách nào để thể hiện điều này trong F #: Hãy sử dụng chức năng C# nàyHowto viết một hàm lấy số biến số của các đối số trong F #

public static T Min<T>(params T[] p) where T : IComparable 
{ 
    T m1 = p[0]; 

    foreach (T v in p) 
    { 
     m1 = (m1.CompareTo(v) < 0) ? m1 : v; 
    } 

    return m1; 
} 

Tôi nghĩ điều này sẽ khá dễ dàng, nhưng tôi không hiểu làm cách nào sẽ chỉ định một danh sách đối số biến trong F #. Tôi đã thử điều này:

let rec Min l = 
    match l with 
    | [] -> 0 // should throw exception here 
    | [v] -> v 
    | (h::t) -> min h (Min t) 

nhưng gọi từ C# mong đợi Microsoft.FSharp.Collections.List. Có thể làm cho nó mong đợi một params T[], và nếu có, làm thế nào?

+0

Đối với giá trị của nó, tôi khuyên bạn nên viết lại chức năng của bạn như thế này: let min l = Seq.reduce min l – Juliet

+0

Đúng, chỉ nhìn thấy nó, đã trải qua các phương thức Seq ngay bây giờ (lần truy cập đầu tiên là gấp, nhưng giảm là chính xác những gì tôi đang tìm kiếm) – Anteru

Trả lời

22

Mảng params đơn giản là một mảng có thuộc tính, như Jon lưu ý. Thêm thuộc tính trước tham số.

let test ([<ParamArray>] arr : 'a array) = 
    if arr.Length = 0 then invalid_arg "arr" 
    // .... 

Bạn không cần phải xác định loại:

let test ([<ParamArray>] arr) = ... // lets type inference do its thing 

... Nhưng kiểu kết hợp không hoạt động trên các loại mảng. Bạn có thể viết một mẫu hoạt động để trợ giúp. Về cơ bản, bạn phải quyết định điều gì quan trọng hơn: mã F # hoặc mã C#. Sự cân bằng tương tự sẽ được áp dụng khi bạn thiết kế các hàm bậc cao hơn, sử dụng bộ dữ liệu, sử dụng các công đoàn phân biệt, vv C# không thể diễn tả hầu hết mọi thứ, và F # hiện không hỗ trợ một số bit nhỏ của đường C#. trình biên dịch, ví dụ).

+2

Tuy nhiên, trong F #, các mảng tham số chỉ có thể được xác định trong các phương thức. Chúng không thể được sử dụng trong các hàm độc lập hoặc các hàm được định nghĩa trong các mô-đun. http://msdn.microsoft.com/en-us/library/vstudio/dd233213.aspx Vì vậy, hãy kiểm tra ([] arr) không hoạt động không may –

+0

Ý của bạn là gì, không hoạt động? hệ thống mở;; để kiểm tra ([] arr) =() ;; - Có vẻ như chỉ biên dịch thôi. – MichaelGG

+0

mô-đun Thử nghiệm = \ n \ t để thử nghiệm = \ n \ t \ t để kiểm tra '([] arr) =() \ n \ t \ t kiểm tra' \ n Thuộc tính không được phép trên 'let 'ràng buộc trong các biểu thức –

6

Bạn có muốn gọi phương thức này từ F # hoặc C# không? This hubFS post dường như chỉ ra rằng F # không hỗ trợ mảng tham số ở phía gọi, nhưng tôi nghi ngờ nếu bạn sử dụng chú thích kiểu thông thường cho tham số để tạo thành một mảng và cũng trang trí nó với ParamArrayAttribute, bạn sẽ có thể gọi nó với các đối số biến từ C#.

Không thể nói tôi đã thấy cách trang trí thông số với thuộc tính trong F #, nhưng tôi có thể tìm kiếm nếu bạn muốn ... This blog post đưa ra một vài ví dụ, nhưng không ở cấp tham số.

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