Tôi có một hàm cà ri mà tôi muốn nó để hỗ trợ các loại khác nhau của các thông số, mà không phải là trên một mối quan hệ thừa kế:F # khớp mẫu trên các loại của các bộ
type MyType1 = A | B of float
type MyType2 = C | D of int
Những gì tôi cố gắng làm là:
let func x y =
match (x, y) with
| :? Tuple<MyType1, MyType1> -> "1, 1"
| _ -> "..."
Tuy nhiên điều này là không thể. F # than phiền:
Loại '' a * 'b' không có bất kỳ loại phụ thích hợp nào và không thể được sử dụng làm nguồn kiểm tra loại hoặc cưỡng chế thời gian.
Cách thanh lịch để làm điều này là gì?
EDIT: Hãy để tôi cố làm rõ điều này.
Tôi có hai loại tương tự nhưng khác biệt. Tôi có thể rất dễ dàng chuyển đổi loại này sang loại khác. Tôi muốn xác định một hoạt động nhị phân sẽ hành động trên các thực thể của các loại, nhưng tôi muốn để lộ một hoạt động duy nhất cho khách hàng.
Đó là, thay vì cung cấp:
let op11 (x : MyType1) (y : MyType1) = // do something useful
let op12 (x : MyType1) (y : MyType2) =
// convert y to MyType1
let y' = // ...
// dispatch to op11
op11 x y'
let op21 (x : MyType2) (y : MyType1) = // similar
let op22 (x : MyType2) (y : MyType2) = // similar
những gì tôi muốn là để lộ một hàm duy nhất để mã khách hàng:
let op (x : obj) (y : obj) = // ...
này giống như mô phỏng hành vi của phương pháp quá tải, nhưng với các chức năng được thu thập.
Type-thử nghiệm trong F #? Có vài điều sai sót ở đây. Chính xác những gì bạn đang cố gắng để làm? – Juliet
Tôi không hiểu những gì bạn đang yêu cầu - chữ ký của 'func' là gì (các loại 'x' và 'y') là gì? – Brian