**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 開發應用程序。 庫提供咗更好睇嘅功能界面。

### 分析編程

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

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

### 腳本

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

開源社區
----

F# open-source 社區包括 F# Software Foundation 同埋 GitHub 上的 F# Open Source Group。<ref name="fsharposg" / > 流行嘅開源 F# 項目包括：

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

兼容性
---

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

例子
--

下面係F#嘅Hello World：

```
 // This is a comment for a sample hello world program.
 printfn "Hello World!"

```

具有構造函數嘅Person類，呢個構造函數具有名稱同埋年齡仲有兩個唔變得嘅屬性。

```
 /// 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位嘅階乘函數作為例子：

```
 /// 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

```

迭代示例：

```
 /// 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

```

斐波那契數列數列示例：

```
 /// 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程序樣本示例：

```
 // 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任務同時進行）：

```
 /// 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")

```

參考
--

1. ↑  .
2. ↑  Syme, Granicz & Cisternino (2007:2) harv error: no target: CITEREFSymeGraniczCisternino2007 (help) "F# also draws from Haskell particularly with regard to two advanced language features called *sequence expressions* and *workflows*."
3. ↑  〈Fable：你可以引以為豪嘅 JavaScript！〉. *fable.io*. 喺2017-12-09搵到.
4. ↑  Intellifactory. "WebSharper home". `{{cite web}}`: Unknown parameter `|訪問日期=` ignored (help)
5. ↑  〈Microsoft 案例研究：Microsoft Visual Studio 2012 - 金融服務公司〉. *Microsoft*. 喺2012-11-25搵到.
6. ↑  〈F# 用於能源交易和投資組合優化〉. .msdn.com/b/dsyme/archive/2011/01/12/f-for-energy-trading-and-energy-portfolio-optimization.aspx 原著喺2015年9月1號歸檔. 喺2012 -11-25搵到. `{{cite web}}`: Check `|url=` value (help); Check date values in: `|access-date=` (help)
7. ↑  〈Microsoft 案例研究：Grange 保險〉. *Microsoft*. 喺2012-11-25搵到.
8. ↑  Trelford, Phil (2007). .cfm?id=1362702.1362709&coll=ACM&dl=ACM&type=series&idx=SERIES824%25E2%2588%2582=series&WantType=Proceedings&title=ICFP http://dl.acm.org/citation .cfm?id=1362702.1362709&coll=ACM&dl=ACM&type=series&idx=SERIES824%25E2%2588%2582=series&WantType=Proceedings&title=ICFP. 《第四屆 ACM SIGPLAN 函數式編程商業用戶研討會論文集 - CUFP '07》. Cufp '07. pp. 1–2. doi:10.1145/1362702.1362709. ISBN 9781450378444. S2CID 24018363. 喺2012-11-25搵到. `{{cite book}}`: `|chapter-url=` missing title (help); Check `|chapter-url=` value (help); Unknown parameter `|ch apter=` ignored (help)CS1 maint: url-status (link)
9. ↑  [http  ://blogs.msdn.com/b/dsyme/archive/2012/10/23/f-job-in-social-gaming-inn-london.aspx 〈F# Facebook 社交遊戲工作〉]. 喺2012-11-25搵到. `{{cite web}}`: Check `|url=` value (help)
10. ↑  "F# Developer Testimonials". 喺2021 年 5 月 25 日搵到. `{{cite web}}`: Check date values in: `|access-date=` (help)
11. ↑  /archive/blogs/chrsmith/scripting-in-f 〈F# 中嘅腳本〉. 喺2020-01-17搵到. `{{cite web}}`: Check `|url=` value (help)
12. ↑

出面網頁
----

* 微軟F#Wayback Machine嘅版面存檔備份
* 喺 GitHub入面嘅 F# 開源碼
* F Sharp
* Planet F#
* （英文）F#Wayback Machine嘅版面存檔備份