"Why use F#?" in one page

https://swlaschin.gitbooks.io/fsharpforfunandprofit/content/why-use-fsharp/

占位符,这个系列太长了,我先去翻译比较干的部分

尽管F#非常适合科学或数据分析等专业领域,但它也是企业开发的绝佳选择。以下是你应该考虑在你的下一个项目中使用F#的五个好理由。

简洁性 Conciseness

F#不会被大括号、分号等编码 "噪音 "弄得杂乱不堪。

由于有强大的类型推理系统,你几乎不需要指定一个对象的类型。

而且,与C#相比,解决同样的问题通常需要更少的代码行。

// one-liners
[1..100] |> List.sum |> printfn "sum=%d"

// no curly braces, semicolons or parentheses
let square x = x * x
let sq = square 42 

// simple types in one line
type Person = {First:string; Last:string}

// complex types in a few lines
type Employee = 
  | Worker of Person
  | Manager of Employee list

// type inference
let jdoe = {First="John";Last="Doe"}
let worker = Worker jdoe

方便性 Convenience

许多常见的编程任务在F#中都要简单得多。这包括创建和使用复杂的类型定义,进行列表处理,比较和平等,状态机,以及更多的事情。

由于函数是第一类对象,通过创建有其他函数作为参数的函数,或者结合现有的函数来创建新的功能,可以很容易地创建强大和可重用的代码。

// automatic equality and comparison
type Person = {First:string; Last:string}
let person1 = {First="john"; Last="Doe"}
let person2 = {First="john"; Last="Doe"}
printfn "Equal? %A"  (person1 = person2)

// easy IDisposable logic with "use" keyword
use reader = new StreamReader(..)

// easy composition of functions
let add2times3 = (+) 2 >> (*) 3
let result = add2times3 5

正确性 Correctness

F#有一个强大的类型系统,可以防止许多常见的错误,如空引用异常。

默认情况下,值是不可变的,这可以防止一大类错误。

此外,你通常可以使用类型系统本身对业务逻辑进行编码,这样实际上就不可能写出错误的代码或混淆计量单位,大大减少了对单元测试的需求。

// strict type checking
printfn "print string %s" 123 //compile error

// all values immutable by default
person1.First <- "new name"  //assignment error 

// never have to check for nulls
let makeNewString str = 
   //str can always be appended to safely
   let newString = str + " new!"
   newString

// embed business logic into types
emptyShoppingCart.remove   // compile error!

// units of measure
let distance = 10<m> + 10<ft> // error!

并发性 Concurrency

F#有许多内置的库,可以在同一时间发生多件事情时提供帮助。

异步编程非常容易,并行也是如此。 F#也有一个内置的角色模型,以及对事件处理和功能反应式编程的出色支持。

当然,由于数据结构默认是不可变的,所以共享状态和避免锁是非常容易的。

// easy async logic with "async" keyword
let! result = async {something}

// easy parallelism
Async.Parallel [ for i in 0..40 -> 
      async { return fib(i) } ]

// message queues
MailboxProcessor.Start(fun inbox-> async{
    let! msg = inbox.Receive()
    printfn "message is: %s" msg
    })

完整性 Completeness

尽管本质上它是一种函数式语言,但 F# 确实支持其他并非 100% 纯的样式,这使得与网站、数据库、其他应用程序等非纯世界的交互变得更加容易。

特别是,F# 被设计为一种混合函数式/OO 语言,因此它几乎可以完成 C# 可以做的所有事情。

当然,F# 是 .NET 生态系统的一部分,它使您可以无缝访问所有第三方 .NET 库和工具。它可以在大多数平台上运行,包括 Linux 和智能手机(通过 Mono 和新的 .NET Core)。

最后,它与 Visual Studio (Windows) 和 Xamarin (Mac) 完美集成,这意味着您将获得一个支持 IntelliSense 的强大 IDE、一个调试器以及许多用于单元测试、源代码控制和其他开发任务的插件。

或者在 Linux 上,您可以改用 MonoDevelop IDE。

// impure code when needed
let mutable counter = 0

// create C# compatible classes and interfaces
type IEnumerator<'a> = 
    abstract member Current : 'a
    abstract MoveNext : unit -> bool 

// extension methods
type System.Int32 with
    member this.IsEven = this % 2 = 0

let i=20
if i.IsEven then printfn "'%i' is even" i

// UI code
open System.Windows.Forms 
let form = new Form(Width= 400, Height = 300, 
   Visible = true, Text = "Hello World") 
form.TopMost <- true
form.Click.Add (fun args-> printfn "clicked!")
form.Show()

# The "Why Use F#?" series

占位,太长了,只翻译标题不翻译内容意义不大,等翻译完后面的文章了再回来把这里补上(也许永远不补呢,谁知道呢,我这个大鸽子)(TODO:补全翻译)

Last updated