12

也许这太简单了,但我在网络上找不到任何答案
我试图在 F# 中增加值(就像count++在 C# 中一样)。
我不想使用“可变”选项,我只想看一个例子,F# 中的增量函数应该是什么样的。
以及如何使用它。

4

3 回答 3

26

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

let count = ref 0
incr count

如果您使用可变变量,则没有内置函数,您需要编写count + 1

let mutable count = 0
count <- count + 1

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

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

在此示例中,表达式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

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

于 2013-03-04T22:17:05.487 回答
5

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

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

let mutable a = 0
&a += 1

或者

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

let mutable b = 0
incv &b
于 2013-03-05T07:01:23.333 回答
4

如果你不想使用 mutable,那么你就不能像++在 C# 中那样进行破坏性更新。您可以使用具有相同名称的新变量来隐藏变量,例如

let x = 4;
let x = x + 1 in (x+4)  //returns 8

虽然你不能把它写成一个函数。

编辑:如果确实想使用可变变量,那么您可以创建一个修改ref的函数:

let increment (ir: int ref) = ir := !ir + 1

然后,您可以将其用作

let i = ref 1
increment i
let iv = !i    //iv contains 2

正如托马斯在他的回答中指出的那样,这个函数已经存在并被调用incr

于 2013-03-04T22:22:47.807 回答