- mutable可變值關鍵字
F#這個語言與其他入門語言有個很大的不同,那就是,定義的值是不可變的。
也就是說,默認情況下,系統自動認爲值是不可變的。
這樣的兩行代碼在C語言可行,在F#中卻說x的定義重複。
不可變值有很多優點:
- 內在的線程安全
- 在推理和理解方面較簡單
- 有較高的安全性
但是如果必須用到可變的值呢?
就可以使用mutable關鍵字了。
//val mutable x : int = 5代表x可變let mutable x = 5 x x <- 10 x
//val it : int = 5現在x值爲5
//val mutable x : int = 10現在x這個可變關鍵字被賦值爲10
//val it : int = 10現在x值爲10
<- 這個運算符的功能是將值賦值給已定義標識符
mutable 與 <- 要一起出現
-
if條件表達式(if … then …else…)
then和else返回值必須相同let x = 56 let msg = if x = 56 then "是56" else "不是56"
//val x : int = 56
//val msg : string = “是56”
這是最普通的一種表達let test x y = if x = y then "等於" elif x<y then "小於" else "大於" printfn "%d %s %d."10 (test 10 20) 20 //這裏的(test 10 20)必須加括號,代表是string類型,要不然會報錯。
//10 小於 20.
//val test : x:'a -> y:'a -> string when 'a : comparison
//val it : unit = ()
這些都是完整的if語句,那要是語句不完整,會出現什麼情況?
缺少else是要報錯的,原因是if是一個表達式,而非語句,(這句話我讀了好幾遍還是雲裏霧裏,但是我知道)後面可以跟(printf語句,或者<- 運算符),就是unit類型,就不會報錯。let x1 = 1 if 10 > 20 then printfn"哇哦"
//val x1 : int = 1
//val it : unit = () unit是if語句默認的類型let x1 = 1 if 30 > 20 then printfn"哇哦"
//哇哦 ( print語句也是unit類型,所以可以運行嗎,不會報錯。)
//val x1 : int = 1
//val it : unit = () -
遞歸
這裏遞歸必須要用關鍵字rec。遞歸由兩部分組成:1.遞歸出口2.遞歸體。
以下是求階乘的例子:let rec fact x = if x = 1 then 1 else x * fact(x-1) let y = fact 5
//val fact : x:int -> int
//val y : int = 120
以下是求和公式:let rec sum x = if x = 0 then 0 else sum(x-1) + x let y = sum 100
//val sum : x:int -> int
//val y : int = 5050 -
循環表達式(for…to…do…)
for循環最後返回值必須是unit類型
以下是1到10求和:let mutable s = 0 for i = 1 to 10 do s <- s + i //<-和mutable對應 printf"%d "i printfn"s = %d"s
//1 2 3 4 5 6 7 8 9 10 s = 55
//val mutable s : int = 55
//val it : unit = ()
以下是打印10到1:let fun1 = //將for循環封裝成一個函數 for i = 10 downto 1 do printf"%d "i printfn"" fun1 //調用
//10 9 8 7 6 5 4 3 2 1
//val fun1 : unit = ()
//val it : unit = ()
以下是使用函數表示起始值和終值:let beginning x y = x - 2 * y let ending x y = x + 2 * y let function3 x y = for i = (beginning x y ) to (ending x y) do //加括號 printf"%d "i printfn"" function3 10 4
//2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
//val beginning : x:int -> y:int -> int
//val ending : x:int -> y:int -> int
//val function3 : x:int -> y:int -> unit
//val it : unit = () -
while…do循環表達式(while…do…)
以下是構造1到10的循環:let fun1 = let mutable i = 1 while i <= 10 do printf"%d "i i <- i + 1 printfn"" fun1
//1 2 3 4 5 6 7 8 9 10
//val fun1 : unit = ()
//val it : unit = () -
生成隨機數,使用while循環生成隨機數,直到這個這個隨機數等於我們固定好的數
open System let lookForValue value maxValue = //想找value,隨機數最大能到maxValue let mutable contimueLooping = true //控制循環條件 let randomNumbleGenerator = new Random() //生成一個實例,以後用這個實例幹活 while contimueLooping do //while循環,生成1到maxValue之間的隨機數 let rand = randomNumbleGenerator.Next(maxValue) //這個函數看下圖,生成一個非負且不大於maxValue的整數 printf"%d "rand //打印每個隨機數 if rand = value then //如果找到 printfn"\n找到數據 %d " value //就打印找到 contimueLooping <- false //並且停止循環 lookForValue 12 29 //1到29生成隨機數,找12
//17 28 5 15 17 17 2 9 23 7 20 1 10 1 7 7 4 0 2 28 14 9 16 23 1 14 23 6 10 24 17 25 22 28 6 0 8 1 5 17 0 27 0 19 21 21 25 28 12
//找到數據 12
//val lookForValue : value:int -> maxValue:int -> unit
//val it : unit = ()