F♯

**F#**係由微軟為.NET語言提供運行環境而整出嚟嘅一隻程式語言，係函數程式語言（**FP**，Functional Programming），函數程式語言最重要嘅基礎係Lambda Calculus。佢係基於OCaml嘅，而OCaml係基於ML嘅，所以有時F#同埋OCaml嘅程式可以交互編譯。

F#支援高階函數、柯里化、惰性求值、Continuations、模式匹配、閉包、列表處理同埋元編程。呢個係一個用喺顯示.NET喺不同編程語言間互通嘅程序設計，可以畀.NET中嘅任意其它代碼編譯同埋調用。

2002年微軟開始由Don Syme帶領研發F#，由C#，LINQ同埋Haskell入面獲取嘅經驗，2005年推出第一個版本，2007年7月31日出咗1.9.2.9版。2007年底，微軟宣布F#進入產品化嘅階段。

F#已經被人集成喺Visual Studio 2010入面，版本係2.0，含有對.Net Framework嘅完全支持。

依家F#喺Visual Studio 2015入面，版本係4.0。

依家F#喺Visual Studio 2017入面，版本係4.1。

## 應用領域
F# 係一種 通用編程語言。

### 網絡編程
SAFE Stack 係用喺開發 Web 應用程序嘅P2P F# 堆棧。佢係伺服器端用 ASP.NET Core，喺客戶端用 Fable。

另一個P2P F# 選項係 WebSharper 框架。

### 跨平台應用開發
F# 可以同 Visual Studio Tools for Xamarin 一齊用，幫 iOS 同埋 Android 開發應用程序。https://fsprojects.github.io/Fabulous/Fabulous 庫提供咗更好睇嘅功能界面。

### 分析編程
其中，F# 用於量化金融編程、 能源交易同投資組合優化、 機器學習， 商業智能 同埋 Facebook 上嘅社交遊戲。

2010 年代，F# 被人定位做 C# 嘅優化替代品。F# 嘅腳本編寫能力同所有 Microsoft 產品嘅跨語言兼容性令佢喺開發人員入面廣受歡迎。

### 腳本
F# 可以用喺腳本語言，主要用喺桌面 read–eval–print loop（REPL）腳本。

## 開源社區
F# open-source 社區包括 F# Software Foundation 同埋 GitHub 上的 F# Open Source Group。 流行嘅開源 F# 項目包括：

* https://fable.io/Fable，一個基於 Babel 嘅 F# 轉 Javascript 嘅轉譯器。
* https://fsprojects.github.io/Paket/Paket，.NET 嘅替代包管理器，仍然可以用 NuGet 存儲庫，但係具有集中嘅版本管理。
* https://fake.build/FAKE，一個 F# 友好嘅構建系統。
* Giraffe，用於 ASP.NET Core 面向功能嘅中間件。
* https://suave.io/Suave，一個輕量級嘅網絡伺服器同埋網絡開發庫。

## 兼容性
F# 具有傳統嘅「ML 兼容模式」，可以粗略咁直接編譯用 OCaml 嘅大子集編寫嘅程序，冇函子、對象、多態變體或者其他添加。

## 例子
下面係F#嘅Hello World：
 
```fsharp
// This is a comment for a sample hello world program.
 printfn "Hello World!"
```


具有構造函數嘅Person類，呢個構造函數具有名稱同埋年齡仲有兩個唔變得嘅屬性。
 
```fsharp
/// This is a documentation comment for a type definition.
 type Person(name : string, age : int) =
     member x.Name = name
     member x.Age = age
    
 /// class instantiation
 let mrSmith = Person("Smith", 42)
```

一個經常用喺演示函數式語言語法嘅簡單示例。呢度用32位嘅階乘函數作為例子：
 
```fsharp
/// Using pattern matching expression
 let rec factorial n =
     match n with
     | 0 -> 1
     | _ -> n * factorial (n - 1)

 /// For a single-argument functions there is syntactic sugar (pattern matching function):
 let rec factorial = function 
     | 0 -> 1 
     | n -> n * factorial (n - 1)
    
 /// Using fold and range operator
 let factorial n = [1..n] |> Seq.fold (*) 1
```


迭代示例：
 
```fsharp
/// Iteration using a 'for' loop
 let printList lst = 
     for x in lst do
         printfn "%d" x

 /// Iteration using a higher-order function
 let printList2 lst = 
     List.iter (printfn "%d") lst

 /// Iteration using a recursive function and pattern matching
 let rec printList3 lst =
     match lst with
     | [] -> ()
     | h :: t ->
         printfn "%d" h
         printList3 t
```

斐波那契數列數列示例：
 
```fsharp
/// Fibonacci Number formula
 let fib n =
     let rec g n f0 f1 =
         match n with
         | 0 -> f0
         | 1 -> f1
         | _ -> g (n - 1) f1 (f0 + f1)
     g n 0 1

 /// Another approach - a lazy infinite sequence of Fibonacci numbers
 let fibSeq = Seq.unfold (fun (a,b) -> Some(a+b, (b, a+b))) (0,1)

 // Print even fibs
 [1 .. 10]
 |> List.map     fib
 |> List.filter  (fun n -> (n % 2) = 0)
 |> printList

 // Same thing, using a list expression
 [ for i in 1..10 do
     let r = fib i
     if r % 2 = 0 then yield r ]
 |> printList
```

一個Windows程序樣本示例：
 
```fsharp
// Open the Windows Forms library
 open System.Windows.Forms

 // Create a window and set a few properties
 let form = new Form(Visible=true, TopMost=true, Text="Welcome to F#")

 // Create a label to show some text in the form
 let label =
     let x = 3 + (4 * 5)
     new Label(Text = sprintf "x = %d" x)

 // Add the label to the form
 form.Controls.Add(label)

 // Finally, run the form
 [<System.STAThread>]
 Application.Run(form)
```

多線程編程示例（呢度係CPU同I/O任務同時進行）：
 
```fsharp
/// A simple prime number detector
 let isPrime (n:int) =
    let bound = int (sqrt (float n))
    seq {2 .. bound} |> Seq.forall (fun x -> n % x <> 0)

 // We are using async workflows
 let primeAsync n =
     async { return (n, isPrime n) }

 /// Return primes between m and n using multiple threads
 let primes m n =
     seq {m .. n}
         |> Seq.map primeAsync
         |> Async.Parallel
         |> Async.RunSynchronously
         |> Array.filter snd
         |> Array.map fst

 // Run a test
 primes 1000000 1002000
     |> Array.iter (printfn "%d")
```


## 參考

## 出面網頁
* 微軟F#
* 喺 GitHub入面嘅 F# 開源碼
* F Sharp
* Planet F#
* F#