F♯

F#是由微软发展的为.NET语言提供运行环境的程序设计语言，是函數程式語言（FP，Functional Programming），函數程式語言最重要的基礎是Lambda Calculus。它是基于OCaml的，而OCaml是基于ML函数程式语言。有時F#和OCaml的程式是可以交互編譯的。 F#支援高阶函数、柯里化、惰性求值、续体、模式匹配、闭包、列表推导式和元编程。这是一个用于显示.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。 一些小小范例如下： // 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位非負整數的阶乘函数为例，使用F#。 /// 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") Release 16.8. 2020年11月10日 [2023年3月19日].  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." 微软F#（页面存档备份，存于互联网档案馆） F Sharp Planet F# （英文）F#（页面存档备份，存于互联网档案馆）