也许这太简单了,但我在网络上找不到任何答案
我试图在 F# 中增加值(就像count++
在 C# 中一样)。
我不想使用“可变”选项,我只想看一个例子,F# 中的增量函数应该是什么样的。
以及如何使用它。
3 回答
只有在使用可变值或使用可变引用单元格(本质上是一个存储可变值的简单对象)时,与 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
。
您无法模拟后增量运算符,但可以进行前增量
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
如果你不想使用 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
。