F#中的增量值

che*_*zer 9 f#

也许这太简单了,但我在网上找不到任何答案
我试着在F#中增加价值(比如count++在C#中).
我不想使用"mutable"选项,我只是想看一个例子,F#中的Increment函数应该是什么样子.
我该如何使用它.

Tom*_*cek 23

当你使用可变值或者使用可变参考单元(本质上是一个存储可变值的简单对象)时,与C++中相同意义上的"递增值"的想法才有意义.如果你有一个可变的引用单元格,你可以使用incr函数:

let count = ref 0
incr count
Run Code Online (Sandbox Code Playgroud)

如果你使用一个可变变量,那么没有内置函数,你需要写count + 1:

let mutable count = 0
count <- count + 1
Run Code Online (Sandbox Code Playgroud)

如果您使用不可变值编写代码,那么您通常只需编写count + 1然后将结果传递给某个函数(或其他地方 - 这取决于具体情况).例如,要计算F#列表的长度,您可以编写:

let rec length list =
  match list with 
  | [] -> 0
  | _::tail -> 1 + (length tail)
Run Code Online (Sandbox Code Playgroud)

在此示例中,表达式1 + (...)是对应i++于C++代码的代码,该代码迭代列表并计算其长度.表达式的结果未分配给新变量,因为它是作为length函数的结果直接返回的.

编辑函数的参数是不可变的,这意味着您无法更改其值.正如Lee所提到的,您可以使用变量阴影来隐藏旧值 - 但请注意,这只会产生局部效果(就像定义一个具有不同名称的新变量来存储新值).例如:

let rec length list count =
  match list with 
  | [] -> count
  | _::tail -> 
     let count = count + 1 // Variable shadowing used here
     length tail count
Run Code Online (Sandbox Code Playgroud)

你不能编写一个函数来简化这一行let count = count + 1,如上所述,这相当于写入let newCount = count + 1然后newCount在最后一行使用.


小智 5

您无法模拟后增量运算符,但可以进行预增量

let inline (+=) (x : byref<_>) y = x <- x + y

let mutable a = 0
&a += 1
Run Code Online (Sandbox Code Playgroud)

要么

let inline incv (x : byref<_>) = x <- x + LanguagePrimitives.GenericOne; x

let mutable b = 0
incv &b
Run Code Online (Sandbox Code Playgroud)