F#语言入门之什么是F#语言

F#是一种函数式编程语言,可以轻松编写正确且可维护的代码。

F#编程主要涉及定义类型推断和自动泛化的类型和函数。 这使您可以将焦点保留在问题域上并操纵其数据,而不是编程的细节。

open System // Gets access to functionality in System namespace. // Defines a function that takes a name and produces a greeting. let getGreeting name = sprintf "Hello, %s! Isn't F# great?" name [<EntryPoint>] let main args = // Defines a list of names let names = [ "Don"; "Julia"; "Xi" ] // Prints a greeting for each name! names |> List.map getGreeting |> List.iter (fun greeting -> printfn "%s" greeting) 0

F#有许多功能,包括:

  • 轻量级语法
  • 默认不变
  • 类型推断和自动泛化
  • 一流的功能
  • 强大的数据类型
  • 模式匹配
  • 异步编程

丰富的数据类型

记录和识别联合等数据类型允许您表示复杂的数据和域。

// Group data with Records type SuccessfulWithdrawal = { Amount: decimal Balance: decimal } type FailedWithdrawal = { Amount: decimal Balance: decimal IsOverdraft: bool } // Use discriminated unions to represent data of 1 or more forms type WithdrawalResult = | Success of SuccessfulWithdrawal | InsufficientFunds of FailedWithdrawal | CardExpired of System.DateTime | UndisclosedFailure

F#记录和区分联合在默认情况下是非null,不可变和可比较的,使它们非常容易使用。

通过功能和模式匹配强制执行正确性

F#函数在实践中很容易声明和强大。 与模式匹配结合使用时,它们允许您定义编译器强制执行的行为。

// Returns a WithdrawalResult let withdrawMoney amount = // Implementation elided let handleWithdrawal amount = let w = withdrawMoney amount // The F# compiler enforces accounting for each case! match w with | Success s -> printfn "Successfully withdrew %f" s.Amount | InsufficientFunds f -> printfn "Failed: balance is %f" f.Balance | CardExpired d -> printfn "Failed: card expired on %O" d | UndisclosedFailure -> printfn "Failed: unknown :("

F#函数是一等公民,这意味着它们可以作为参数传递并从其他函数返回。

用于定义对象操作的函数

F#完全支持对象,当您需要混合数据和功能时,这些对象是有用的数据类型。 F#函数用于操作对象。

type Set<[<EqualityConditionOn>] ‘T whenT: comparison>(elements: seq<'T>) = member s.IsEmpty = // Implementation elided member s.Contains (value) =// Implementation elided member s.Add (value) = // Implementation elided // ... // Further Implementation elided // ... interface IEnumerable<‘T> interface IReadOnlyCollection<‘T> [<RequireQualifiedAccess>] module Set = let isEmpty (set: Set<'T>) = set.IsEmpty let contains element (set: Set<'T>) = set.Contains(element) let add value (set: Set<'T>) = set.Add(value)

在F#中,您不必编写面向对象的代码,而是经常编写将对象视为操作函数的另一种数据类型的代码。 诸如通用接口,对象表达和成员的明智使用等功能在较大的F#程序中很常见。

原创版权所有,禁止未经授权的复制转载。喜欢就关注。


关注公众号获得技术支持

给作者留言

提交留言