Подтвердить что ты не робот

Как определить x ++ (где x: int ref) в F #?

В настоящее время я использую эту функцию

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

чтобы писать такие вещи, как

let str = input.[inc index]

Как определить оператор инкремента ++, чтобы я мог писать

let str = input.[index++]
4b9b3361

Ответ 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")

которые некоторые из них уже высказали в комментариях к исходному вопросу.

Ответ 2

Я пытался написать его как префиксный оператор, как было предложено, но вы не можете определить (++) как правильный префиксный оператор, т.е. запускать такие вещи, как ++ y, без(), как вы могли бы, например, для (+!):

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

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

Извините, но я думаю, что ответ заключается в том, что на самом деле вы не можете этого сделать.