2012-04-20 23 views
12

Tôi hiện đang sử dụng chức năng nàyCách xác định x ++ (trong đó x: int ref) trong F #?

let inc (i : int ref) = 
    let res = !i 
    i := res + 1 
    res 

để viết những thứ như

let str = input.[inc index] 

Làm thế nào xác định toán tử tăng ++, vì vậy mà tôi có thể viết

let str = input.[index++] 
+2

Một câu hỏi: tại sao bạn cần điều này? – pad

+0

Tôi với @pad trên cái này - trong khi câu hỏi là hợp lệ và câu trả lời đã được cung cấp (như một toán tử tiền tố), ví dụ được đưa ra ở đây không phải là kiểu F #. Hiếm khi một lý do tốt để làm một cái gì đó như thế này. – yamen

+0

Tôi muốn điều đó cho dễ đọc. (Tôi đến từ nền C++/C#). Tôi mặc dù nó có thể nhưng không thể làm cho nó bản thân mình. –

Trả lời

13

Bạn không thể định nghĩa các nhà khai thác postfix trong F # - xem 4.4 Operators and Precedence. Nếu bạn đồng ý làm cho nó tiền tố thay vào đó, sau đó bạn có thể định nghĩa, ví dụ,

let (++) x = incr x; !x 

và sử dụng nó như sau:

let y = ref 1 
(++) y;; 

val y : int ref = {contents = 2;} 

CẬP NHẬT: như fpessoa chỉ ra ++không thể được được sử dụng như một nhà điều hành tiền tố chính hãng, thực sự (xem herethere cho các quy tắc khi ký tự và chuỗi ký tự bao gồm các toán tử tiền tố F # hợp lệ).

Điều thú vị là unary + có thể bị quá tải với mục đích:

let (~+) x = incr x; !x 

phép

let y = ref 1 
+y;; 

val y : int ref = {contents = 2;} 

Tuy nhiên, nó có ý nghĩa kể rằng ý tưởng lặp lại một mảng như dưới đây

let v = [| 1..5 |] 
let i = ref -1 
v |> Seq.iter (fun _ -> printfn "%d" v.[+i]) 

vì mục đích "dễ đọc" trông ít nhất là phạm vi so với cách chức năng thành ngữ

[|1..5|] |> Seq.iter (printfn "%d") 

mà một số bắt đầu đã có ý kiến ​​cho câu hỏi ban đầu.

4

Tôi đã cố gắng viết nó như một toán tử tiền tố như được đề xuất, nhưng bạn không thể xác định (++) làm toán tử tiền tố thích hợp, ví dụ, chạy những thứ như ++ y không có() như bạn có thể làm ví dụ cho (! +):

let (!+) (i : int ref) = incr i; !i 

let v = [| 1..5 |] 
let i = ref -1 
[1..5] |> Seq.iter (fun _ -> printfn "%d" v.[!+i]) 

Xin lỗi, nhưng tôi đoán câu trả lời là bạn thực sự không thể làm được điều đó.

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