F#

✍ dations ◷ 2024-12-22 20:32:27 #F#

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。

一些小小范例如下:

// 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 instantiationlet 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 expressionlet 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 operatorlet factorial n =  |> Seq.fold (*) 1

迭代示例:

/// Iteration using a 'for' looplet printList lst =     for x in lst do        printfn "%d" x/// Iteration using a higher-order functionlet printList2 lst =     List.iter (printfn "%d") lst/// Iteration using a recursive function and pattern matchinglet rec printList3 lst =    match lst with    |  -> ()    | h :: t ->        printfn "%d" h        printList3 t

斐波那契数列数列示例:

/// Fibonacci Number formulalet 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 numberslet fibSeq = Seq.unfold (fun (a,b) -> Some(a+b, (b, a+b))) (0,1)// Print even fibs|> List.map     fib|> List.filter  (fun n -> (n % 2) = 0)|> printList// Same thing, using a list expression|> printList

一个Windows程序样本示例:

// Open the Windows Forms libraryopen System.Windows.Forms// Create a window and set a few propertieslet form = new Form(Visible=true, TopMost=true, Text="Welcome to F#")// Create a label to show some text in the formlet label =    let x = 3 + (4 * 5)    new Label(Text = sprintf "x = %d" x)// Add the label to the formform.Controls.Add(label)// Finally, run the formApplication.Run(form)

多线程编程示例(此处为CPU和I/O任务同时进行):

/// A simple prime number detectorlet isPrime (n:int) =   let bound = int (sqrt (float n))   seq {2 .. bound} |> Seq.forall (fun x -> n % x <> 0)// We are using async workflowslet primeAsync n =    async { return (n, isPrime n) }/// Return primes between m and n using multiple threadslet primes m n =    seq {m .. n}        |> Seq.map primeAsync        |> Async.Parallel        |> Async.RunSynchronously        |> Array.filter snd        |> Array.map fst// Run a testprimes 1000000 1002000    |> Array.iter (printfn "%d")

参考文献

  1. ^ 1.0 1.1 https://devblogs.microsoft.com/dotnet/announcing-fsharp-7/.
  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 and ."

外部链接

相关