12

現在、この機能を使用しています

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

のようなものを書く

let str = input.[inc index]

インクリメント演算子 ++ を定義する方法

let str = input.[index++]
4

2 に答える 2

13

F# では後置演算子を定義できません - 4.4 Operators and Precedenceを参照してください。代わりにプレフィックスにすることに同意する場合は、たとえば次のように定義できます。

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")

一部の開始者は、元の質問へのコメントですでに表明していました。

于 2012-04-20T20:54:20.663 に答える
4

提案されているようにプレフィックス演算子として記述しようとしましたが、(++)を適切なプレフィックス演算子として定義することはできません。つまり、たとえば(!+)のように、()なしで++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])

申し訳ありませんが、答えは実際にはそれさえできないということだと思います。

于 2012-04-20T21:31:53.703 に答える