📑 Table of Contents

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

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

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. ^ https://learn.microsoft.com/en-us/dotnet/fsharp/whats-new/fsharp-10.
  2. ^ Syme, Granicz & Cisternino (2007:2頁) "F# also draws from Haskell particularly with regard to two advanced language features called sequence expressions and workflows."

外部链接

编辑

📚 Artikel Terkait di Wikipedia

Java

比较Java和C++ 比较C Sharp和Java Java元数据接口 Java applet Java平臺 Java RMI Java 5.0的多种新特性(包括foreach循环,自动装箱、拆箱(英语:Object type (object-oriented programming

Lua

https://lua.org/versions.html#5.5. Ring Team. The Ring programming language and other languages. ring-lang.net. ring-lang. 5 December 2017 [2020-09-22]

C♯

int[5]"而不是"int a[5]")。 枚舉位於其所在的命名空間中。 C#中沒有模版(Template),但是在C# 2.0中引入了泛型(Generic programming),並且支持一些C++模版不支持的特性。比如泛型參數中的類型約束。另一方面,表達式不能像C++模版中被用於類型參數。 屬性支持,使用類似訪問成員的方式調用。

程序語言時間線

Ballerina Programming Language. 25 November 2019 [2022-11-03]. (原始内容存档于2019-02-17) –通过GitHub.  Online Historical Encyclopaedia of Programming Languages

J语言

“rationalization” of SHARP APL. …… ACM SIGAPL, the ACM Special Interest Group on APL, reinterpreted the “APL” in its name in early 2009 as Array Programming Languages

BOO

官方網站提供了很好的入門課程:BOO Tutorial 目前有支援BOO的整合開發環境並不多: MonoDevelop(页面存档备份,存于互联网档案馆) SharpDevelop(页面存档备份,存于互联网档案馆) BooLangStudio(页面存档备份,存于互联网档案馆)在2008年八月釋出Alpha 1,可以整合在Visual

Logo (程序设计语言)

edu. [2025-01-15]. (原始内容存档于2025-02-03).  MSWLogo, An Educational programming language. softronix.com. [2025-01-15]. (原始内容存档于2025-01-03).  StarLogo on the

Q Sharp

(原始内容存档于2017-12-11) (美国英语).  Microsoft announces quantum computing programming language. [2017-12-14]. (原始内容存档于2017-12-14) (美国英语).  QuantumWriter. Setting