2010-02-22 30 views
6

Khi xác định toán tử tùy chỉnh từ tập hợp giới hạn các toán tử đơn ký tự có thể là cả hai toán tử tiền tố và tiền tố (+ - % &), tôi quyết định sử dụng ký hiệu và chỉ một trong những nhà khai thác mà tôi đã không cho đến nay đã có dịp sử dụng trong mã F # của tôi. Tôi lý luận rằng kể từ khi & dường như có fairly limited use trong F #, việc xác định lại nó sẽ ít gây nhầm lẫn cho những người sử dụng thư viện của tôi.F #: Toán tử '&' thường không được định nghĩa lại

Tuy nhiên, khi tôi làm như vậy, tôi nhận được một cảnh báo trình biên dịch:

Các '&' nhà điều hành nên thường không được định nghĩa lại. Xem xét sử dụng tên toán tử khác.

Câu hỏi của tôi là, tại sao toán tử này hiếm khi tạo thông điệp cảnh báo này, trong khi các toán tử thường dùng như cộng và trừ thì không? Ngoài ra, tôi nên cảnh báo nghiêm túc như thế nào?

+0

Hmm, việc sử dụng duy nhất một dấu hiệu '&' duy nhất mà tôi biết là tính toán địa chỉ của một giá trị có thể thay đổi. – gradbot

+0

Trang được liên kết cho biết rằng trang này cũng "Được sử dụng trong các mẫu AND" nhưng tôi không thể tìm thấy ví dụ về ý nghĩa của nó. –

Trả lời

8

Khi tạo toán tử tùy chỉnh, tôi thường thích tìm một tổ hợp biểu tượng đơn giản không xung đột với bất kỳ toán tử F # hiện có nào. Sự thật là bộ biểu tượng rất hạn chế, vì vậy điều này không phải lúc nào cũng có thể. Tuy nhiên, bạn có thể ví dụ xác định một cái gì đó như -&- và bạn thường có thể chọn một số kết hợp phản ánh ý nghĩa của nhà điều hành. Chỉ cần ra khỏi tò mò, ý nghĩa của nhà điều hành của bạn là gì?

Dù sao, khi tôi không thể tìm thấy tên nhà điều hành tốt, tôi coi đó là dấu hiệu có thể tôi không nên sử dụng toán tử tùy chỉnh (afterall, nhiều ngôn ngữ sống mà không có chúng dễ dàng). Tôi nghĩ việc sử dụng chính các toán tử tùy chỉnh có lẽ là một số công cụ toán học chuyên biệt. Bạn thường có thể thay thế toán tử (ví dụ: a -&- b) bằng một functiong được sử dụng với pipelining (ví dụ: a |> connectTo b). Ngoài ra còn có một neat trick cho phép bạn sử dụng các chức năng như các toán tử infix.

Trong trường hợp &, tôi nghĩ rằng đó là một lựa chọn khá hợp lý để bỏ qua cảnh báo nếu bạn sử dụng tốt cho người vận hành và hành vi của toán tử bạn muốn xác định bằng cách nào đó tương ứng với trực giác về biểu tượng &.

EDIT Xác định nhà điều hành & của riêng bạn sẽ không vi phạm việc sử dụng biểu tượng & khác (trong kết hợp mẫu). Dưới đây là một ví dụ về và mẫu:

// define custom & operator 
let (&) a b = a + b 

match 2 with 
| num1 & num2 -> num1 + num2 // Still works fine 

Các mô hình cho phép bạn để phù hợp với một giá trị duy nhất agains nhiều mô hình trong một mô hình duy nhất (trong ví dụ trên, chúng tôi chỉ ràng buộc nó vào hai riêng biệt giá trị)

+0

Để trả lời câu hỏi của bạn về những gì tôi đang làm - Tôi đang cố gắng viết một DSL để tạo HTML, và tôi muốn cung cấp một phím tắt thuận tiện cho một cái gì đó khá phổ biến. Phiên bản tiền tố của toán tử tạo ra một nút Text từ một chuỗi, và phiên bản infix kết thúc tốt đẹp nút Text trong một danh sách, và chuyển nó đến hàm đó là đối số bên trái. Đó là một dịp mà tôi muốn F # cho phép đúc ngầm. –

4

Bạn sẽ không thể gọi các phương thức có tham số byref. Điều này có thể hoặc có thể không phải là một việc lớn đối với bạn.

Đối với câu hỏi của bạn về "VÀ mẫu", đây là ví dụ nhanh. Tuy nhiên, lưu ý rằng việc xác định toán tử & đơn nhất của riêng bạn sẽ không ảnh hưởng đến hành vi này theo cách này hay cách khác.

let (|Contains|_|) (s:string) (x:string) = 
    if (x.Contains(s)) then Some() else None 

match "test" with 
| Contains "e" & Contains "s" -> printfn "Success!" 
| _ ->() 

Nhưng kỳ lạ, tôi chỉ thấy cảnh báo bạn đề cập đến khi xác định một nhà điều hành nhị phân(&), không phải là unary (~&) điều hành.

EDIT

Mặc dù tôi không nhìn thấy nó gọi ra một cách rõ ràng trong spec, nó trông giống như & điều hành nhị phân được sử dụng như một từ đồng nghĩa với các nhà điều hành && nhị phân. Tôi đoán rằng đề nghị không xác định lại toán tử này tồn tại vì nó là toán tử mạch ngắn, nhưng quá tải của bạn không thể.

+0

+1 - Câu trả lời tuyệt vời, và gần như giống hệt với Tomas. Tôi sợ tôi phải cho anh ta cái gật đầu chi tiết hơn một chút và thủ thuật chức năng mát mẻ. Thêm vào đó tôi thích cuốn sách của anh ấy. –

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