F#

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

F#
多范型: 函数式, 指令式, 面向对象, 元编程, 并发计算
设计者微软研究院, Don Syme
实作者微软, F♯软件基金会
2005年 (2005) (version 1.0)
当前版本
  • 7.0 (2022年11月8日;稳定版本)[1]
  • 16.8 (2020年11月10日)[2]
型态系统静态类型, 强类型, 类型推论
操作系统跨平台 (.NET, .NET框架, Mono, JavaScript)
许可证Apache许可证
文档扩展名.fs, .fsi, .fsx, .fsscript
网站fsharp.org
启发语言
ML, OCaml, C#, Python, Haskell,[3] Scala, Erlang
影响语言
F*, LiveScript

F#支持高阶函数、柯里化惰性求值、Continuations、模式匹配、闭包、列表处理和元编程。这是一个用于显示.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# A simple example that is often used to demonstrate the syntax of functional languages is the factorial function for non-negative 32-bit integers, here shown in 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://devblogs.microsoft.com/dotnet/announcing-fsharp-7/.
  2. . 2020年11月10日 [2023年3月19日].
  3. Syme, Granicz & Cisternino (2007:2页) "F# also draws from Haskell particularly with regard to two advanced language features called sequence expressions and workflows."

外部链接

This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.