F#中的增量值

时间:2013-03-04 22:12:40

标签: f#

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

3 个答案:

答案 0 :(得分:23)

与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 + (...)是C ++代码中与i++对应的代码,它迭代列表并计算其长度。表达式的结果未分配给新变量,因为它是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

答案 1 :(得分:4)

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

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

答案 2 :(得分:3)

如果您不想使用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