2010-08-03 43 views
6

Tôi chỉ mới bắt đầu vào F #, và khi chơi xung quanh với quá tải nhà điều hành, tôi đã chạy vào một cái gì đó tôi không hoàn toàn hiểu. Bây giờ, tôi hiểu rằng bạn không thể sử dụng, ví dụ: +* làm toán tử tiền tố bị quá tải; nó chỉ có thể là một toán tử infix. Đây là nơi tôi bị lẫn lộn, tuy nhiên:F # Toán tử/Chức năng Lẫn lộn

let (+*) a = a + a * a;; 

Nếu tôi chạy này, FSI nói với tôi rằng các chức năng (+*) là một int->int. Tuyệt, tôi có thể khai thác nó - nó không phải là một toán tử quá tải, chỉ là một hàm bình thường có tên là (+*). Vì vậy, nếu tôi làm:

printf "%d" ((+*) 6) 

Tôi sẽ nhận được 42, như tôi mong đợi. Tuy nhiên, nếu tôi thử:

printf "%d" (+*) 6 
or 
printf "%d" (+*)6 

Nó sẽ không biên dịch. Tôi không thể đưa ra lỗi chính xác ngay bây giờ vì tôi không có quyền truy cập vào trình biên dịch F # tại thời điểm này, nhưng tại sao lại là điều này? Điều gì đang xảy ra với sự ràng buộc ở đây?

Trả lời

7

Nó giải thích này:

printf "%d" (+*) 6 

Như thế này:

printf ("%d") (+*) (6) 

Nói cách khác, đi qua ba đối số cà ri để printf, thứ hai trong số đó là một tham chiếu đến các chức năng +*.

+0

Ah, điều đó có ý nghĩa gì đó. Tuy nhiên, cú pháp khoảng cách cho các tham số có vẻ như nó có thể làm cho ràng buộc khó hiểu. Theo thứ tự nào, các không gian liên kết các tham số? Tôi đã quen với các ngôn ngữ giống như C với các dấu ngoặc bắt buộc cho các tham số, do đó loại ràng buộc đó rõ ràng đối với tôi. – Perrako

+0

Perrako, đó là một câu hỏi tiếp theo tuyệt vời. Gửi nó như là một câu hỏi riêng biệt vì vậy chúng tôi sẽ có một tham chiếu cho tương lai (tức là "Làm thế nào để làm quen với cú pháp truyền tham số F # khi tôi được sử dụng để tham số C-like?"). (Tôi xin lỗi vì tôi không thể tự trả lời, tôi đã học Lisp trước F # vì vậy tôi đã quen với cú pháp không gian theo cách đó.) –

+0

Đừng bận tâm, tôi đã tìm thấy câu hỏi hiện tại có thể sẽ trả lời của bạn: http: // stackoverflow .com/questions/2725202/f-function-calling-syntax-confused –