2009-11-06 32 views
24

Trong C# Tôi có thể thêm các nhà khai thác ngầm để một lớp học như sau:Có tương đương với việc tạo toán tử ngầm định C# trong F # không?

public class MyClass 
{ 
    private int data; 

    public static implicit operator MyClass(int i) 
    { 
     return new MyClass { data = i }; 
    } 

    public static implicit operator MyClass(string s) 
    { 
     int result; 

     if (int.TryParse(s, out result)) 
     { 
      return new MyClass { data = result }; 
     } 
     else 
     { 
      return new MyClass { data = 999 }; 
     } 
    } 

    public override string ToString() 
    { 
     return data.ToString(); 
    } 
} 

Sau đó, tôi có thể vượt qua bất kỳ chức năng được mong đợi một MyClass đối tượng một chuỗi hoặc một int. ví dụ:

public static string Get(MyClass c) 
{ 
    return c.ToString(); 
} 

static void Main(string[] args) 
{ 
    string s1 = Get(21); 
    string s2 = Get("hello"); 
    string s3 = Get("23"); 
} 

Có cách nào để thực hiện việc này trong F # không?

Trả lời

27

Như những người khác đã chỉ ra, không có cách nào để thực hiện chuyển đổi ngầm định trong F #. Tuy nhiên, bạn luôn có thể tạo ra điều hành riêng của mình để làm cho nó một chút dễ dàng hơn để chuyển đổi một cách rõ ràng mọi thứ (và để tái sử dụng bất kỳ định nghĩa op_Implicit rằng các lớp học hiện đã xác định):

let inline (!>) (x:^a) : ^b = ((^a or ^b) : (static member op_Implicit : ^a -> ^b) x) 

Sau đó, bạn có thể sử dụng nó như thế này:

type A() = class end 
type B() = static member op_Implicit(a:A) = B() 

let myfn (b : B) = "result" 

(* apply the implicit conversion to an A using our operator, then call the function *) 
myfn (!> A()) 
+0

Đây dường như là tên toán tử tiền tố không hợp lệ trong F # 2.0. Các quy tắc cho tên toán tử được xác định ở đâu đó? Tôi không thấy bất cứ điều gì trên trang [MSDN] (http://msdn.microsoft.com/en-us/library/dd233204.aspx) cho biết hạn chế này. – Daniel

+0

Bỏ qua '~' từ tên xuất hiện để hoạt động. Các quy tắc có thay đổi không? – Daniel

+0

@Daniel - vâng, tôi nghĩ rằng các quy tắc phải thay đổi. Bỏ qua '~' sẽ không hoàn toàn hoạt động vì nó sẽ làm cho nó trở thành một toán tử infix chứ không phải là tiền tố. Tuy nhiên, thay thế '~' bằng '!' Sẽ hoạt động. – kvb

8

Chuyển đổi ngầm định khá là có vấn đề đối với an toàn loại và suy luận kiểu, vì vậy câu trả lời là: Không, nó thực sự sẽ là một tính năng có vấn đề.

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