F# - 维基百科,自由的百科全书

F#
编程范型多范型: 函数式, 指令式, 面向对象, 元编程, 并发计算
設計者微软研究院, Don Syme英语Don Syme
實作者微软, F♯软件基金会英语F Sharp Software Foundation
发行时间2005年 (2005) (version 1.0)
当前版本
  • 16.8 (2020年11月10日)[1]
編輯維基數據鏈接
型態系統静态类型, 强类型, 类型推论
操作系统跨平台 (.NET, .NET框架, Mono, JavaScript)
許可證Apache许可证
文件扩展名.fs, .fsi, .fsx, .fsscript
網站fsharp.org
啟發語言
ML, OCaml, C#, Python, Haskell,[2] Scala, Erlang
影響語言
F*, LiveScript英语LiveScript

F#是由微软发展的为.NET语言提供运行环境的程序设计语言,是函數程式語言FP,Functional Programming),函數程式語言最重要的基礎是Lambda Calculus。它是基于OCaml的,而OCaml是基于ML函数程式语言。有時F#和OCaml的程式是可以交互編譯的。

F#支援高阶函数柯里化惰性求值续体模式匹配闭包列表推导式元编程。这是一个用于显示.NET在不同编程语言间互通的程序设计,可以被.NET中的任意其它代碼編譯和調用。

2002年微软開始由Don Syme帶領研發F#,從C#,LINQHaskell中獲取了經驗,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") 

参考文献

[编辑]
  1. ^ Release 16.8. 2020年11月10日 [2023年3月19日]. 
  2. ^ Syme, Granicz & Cisternino (2007:2頁) "F# also draws from Haskell particularly with regard to two advanced language features called sequence expressions and workflows."

外部链接

[编辑]