维基F#译文: 值与函数(上)
原文地址:http://en.wikibooks.org/wiki/F_Sharp_Programming
1. 声明变量
1.1 值是值,变量是变量
在F#里最常见的关键字就是let,用来声明变量或是函数。 举例如下:
let x = 5 let y = 10 let z = x + y
这样就声明了x,y,然后分别赋值。最后z等于x加y的值。 然后你可以再把它们打印出来
printfn "x: %i" x printfn "y: %i" y printfn "z: %i" z
最后输出的结果是什么,到FSI里试下就知道了。 记得不要忘记,在FSI里要在程序的最后加两个分号,这样才能执行你的程序。
最后再来看下值和变量的区别。
let w = 5
这里先定义w等于5。好了,现在你再把6赋值给w,看看会发生什么!
w = 6 val it : bool = false
这里的=等已经不再是赋值操作了,而是对比。这里其实就是说,w的值是5,现在说,5是不是等于6,显然不等,所以返回了一个布尔值,假(FALSE).
所以如果你要给w赋值的话,应该如前面说的那样用let。
let w = 100
但其实这样并不是真正的赋值,他只是给w重新绑定过了一个值,而不是找到内存中原来w的值,也就是5,然后把5修改为100。那如果我要真正的改这个值呢,那就得用 <-
w <- 99
但是这样你会得到一个错误
error FS0027: This value is not mutable
F#说这个值是不可变的。原来在F#里,其实应该说要函数式编程语言里,变量其实都是不可变。所以你会得到这个这个错误。那你也许就会问,<- 这个操作岂不是没用的?其实F#是一种多重范式的语言,它是支持真正的变量的。但是它默认你声明的变量是不可变的(immutable)。那我们怎么声明可变的变量,这里就要用到另一个关键字 mutable
let mutable i = 100;; val mutable i : int = 100
这样就定义一个可变变量i,现在你再给i赋值
i <- 999;; val it : unit = () i;; val it : int = 999
为什么函数式语言的变量是不可变的?简单来说,这其实函数式语言的优势,现在来说可能很难理解。以后自然会明白,不过好在F#并不是纯的函数式语言,要不然可能上手的难度会大很多。