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