Ответ 1
Вы не можете определить постфиксные операторы в F # - см. 4.4 Операторы и приоритет. Если вы согласны вместо этого использовать префикс, вы можете определить, например,
let (++) x = incr x; !x
и используйте его, как показано ниже:
let y = ref 1
(++) y;;
val y : int ref = {contents = 2;}
UPDATE: fpessoa указал, что ++
не может использоваться в качестве подлинного префиксного оператора, действительно (см. здесь и там для правил на символы и последовательности символов, содержащие действительные операторы префикса F #).
Интересно, что унарные +
могут быть перегружены для этой цели:
let (~+) x = incr x; !x
позволяет
let y = ref 1
+y;;
val y : int ref = {contents = 2;}
Тем не менее, имеет смысл упомянуть, что идея итерации массива, как показано ниже
let v = [| 1..5 |]
let i = ref -1
v |> Seq.iter (fun _ -> printfn "%d" v.[+i])
для "удобочитаемости" выглядит как минимум странным по сравнению с идиоматическим функциональным образом
[|1..5|] |> Seq.iter (printfn "%d")
которые некоторые из них уже высказали в комментариях к исходному вопросу.