2013-08-14 31 views
6

Tôi đã có một lớp trong ứng dụng của tôi - vì đơn giản chúng ta hãy giả định nó được định nghĩa như thế này:Sử dụng một hàm với một cuộc tranh cãi của một loại có nguồn gốc (F #)

type baseType() = 
    member this.A = 5. 

Ngoài ra, tôi đã có rất nhiều các hàm lấy đối tượng thuộc loại này làm đối số. Hơn nữa, một số người trong số họ lấy một mảng thuộc loại này:

let myFun (xArr : baseType[]) = 
    // ... do something inspirig ;) 

Bây giờ tôi nhận ra rằng sẽ tốt hơn nếu có một lớp khác xuất phát từ "baseType". ví dụ .:

type inhType() = 
    inherit baseType() 
    member this.B = 8. 

Tuy nhiên, tôi không thể sử dụng các mảng của kiểu di truyền với các chức năng như "myFun"

let baseArr = [| baseType() |] 
let inhArr = [| inhType() |] 

myFun baseArr 
myFun inhArr // won't work 

đó sẽ là "tốt đẹp để có". Có cách nào đơn giản để tái sử dụng các chức năng của tôi mà không áp dụng quá nhiều thay đổi?

Tôi đoán một trong những giải pháp là ánh xạ mảng của tôi bằng cách sử dụng ví dụ: các chức năng (vui vẻ (d: inhType) -> d:> baseType), nhưng tôi tự hỏi nếu có bất cứ điều gì khác có thể được thực hiện.

Trả lời

9

Bạn cần chú thích chức năng của mình khi chấp nhận flexible type.

type A() = class end 
type B() = inherit A() 

let aArr = [| A() |] 
let bArr = [| B() |] 

// put # before type to indicate it's a flexible type 
let f (x : #A[]) =() 

f aArr 
f bArr // works! 
+0

Làm việc tốt cho tôi - cảm ơn :). –

3

Bạn cũng có thể cư một mảng của A với trường hợp của một subtype, B, bằng cách sử dụng một loại chú thích:

let bArr: A[] = [| B() |] 

Điều này có thể hữu ích cho một lần sử dụng hoặc nếu chức năng là trong thư viện của bên thứ ba. Một cách sử dụng phổ biến khác là tạo các ô được đóng hộp (obj[]).

+2

Đúng, nhưng lưu ý rằng điều này chỉ hoạt động với các mảng chữ. Một cái gì đó như 'let bArr: A [] = Array.create 1 (B())' sẽ không hoạt động. – kvb

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