2010-02-05 34 views
9

Có cách nào để xác định toán tử của riêng bạn trong F # không?Bạn có thể xác định toán tử của riêng mình trong F # không?

Nếu có ai đó có thể cho tôi ví dụ về điều này? Tôi tìm kiếm một thời gian ngắn, nhưng không thể tìm thấy bất cứ điều gì.

+0

Để tham khảo trong tương lai của bạn Joan - khái niệm này được gọi là quá tải toán tử. Nếu bạn Google F # và Toán tử quá tải, bạn sẽ tìm thấy khá một chút về chủ đề này. –

+0

Xin cảm ơn, sẽ làm điều đó trong tương lai. –

Trả lời

25

Có:

let (+.) x s = [for y in s -> x + y] 
let s = 1 +. [2;3;4] 

Các nhân vật có thể được sử dụng trong một # điều hành F được liệt kê trong section 3.7 of the spec. Chúng là !%&*+-./<=>@^|~ và cho bất kỳ ký tự nào sau số đầu tiên, ?. Ưu tiên và độ cố định được xác định bởi ký tự đầu tiên của toán tử (xem thông số kỹ thuật).

Bạn có thể tạo các toán tử tự giới hạn của riêng mình như tôi đã thực hiện ở trên, trong trường hợp này chúng hoạt động giống như các hàm bỏ qua. Bạn cũng có thể xác định chúng là thành viên trên một loại:

type 'a Wrapper = Wrapper of 'a with 
    static member (+!)(Wrapper(x), Wrapper(y)) = Wrapper(x+y) 

let w = (Wrapper 1) +! (Wrapper 2) 

Trong trường hợp này, bạn không cần phải xác định trước chức năng bỏ ràng buộc để sử dụng toán tử; F # sẽ tìm thấy nó trên loại. Bạn có thể tận dụng lợi thế đặc biệt tốt về điều này sử dụng định nghĩa inline:

let inline addSpecial a b = a +! b 
let w2 = addSpecial w (Wrapper 3) 

Lấy này hơn nữa, bạn có thể làm cho các nhà khai thác trên các loại của inline là tốt, để bạn có thể sử dụng chúng trên một sự đa dạng của các trường hợp lớp học của bạn:

type 'a Wrapper = Wrapper of 'a with 
    static member inline (+!)(Wrapper(x), Wrapper(y)) = Wrapper(x+y) 

let wi = (Wrapper 1) +! (Wrapper 2) 
let wf = (Wrapper 1.0) +! (Wrapper 2.0) 
let wi2 = addSpecial wi wi 
let wf2 = addSpecial wf wf 
+3

phần 4.4 (http://research.microsoft.com/en-us/um/cambridge/projects/fsharp/manual/spec.html) có thêm một số thông tin liên quan đến các toán tử kết xuất và những ký tự nào được cho phép. – nlucaroni

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