ag百家乐贴吧

ag百家乐官网 为什么说微软的F#是一门被低估的编程说话?

在编程领域,数百种编程说话各有千秋,各自顺应不同的哄骗场景。修复者 Bozhidar Batsov 近日发布了一篇主题为《Why F#》的著作,激励了平日关怀,以致登上了 Hacker News 的热榜。这也让东说念主不禁有趣,F# 这门照旧发布了 20 年的编程说话,如今有哪些值得关怀的独特之处?

对此,一位网友驳倒说念:“F# 与 AI 特殊契合,悉数 AI 模子齐能缩小生成习用的 F# 代码。更蹙迫的是,F# 领有一个特殊强盛的类型系统,这使得在齐全之前,通过 AI 模子准确建模问题,能够有用拿获潜在的幻觉作假。”本文中,Batsov 深入推敲了 F# 的优污点、生态系统及修复用具,揭示了这门说话在当代编程和AI领域中的私有上风。

原文伙同:https://batsov.com/articles/2025/03/30/why-fsharp/

作家 | Bozhidar Batsov

责编 | 苏宓

出品 | CSDN(ID:CSDNnews)

如果几个月前有东说念主告诉我,我会在时隔 15 年之后再次使用 .NET,我确定会对此嗤之以鼻。在我早期做事生活中,我曾战争过 .NET 和 Java,尽管 .NET 在某些方面比 Java 作念得更好(毕竟它有契机从 Java 早期的作假中吸取训诫),但我最终采用了 Java,因为它是真实的跨平台环境。

其着实当年几年里,我断断续续地也在玩 OCaml(一个函数式、辅导式、模块化、面向对象的通用的编程说话),可以说它照旧成为我最心爱的编程说话之一,就像 Ruby 和 Clojure 相通。我对 OCaml 的磋磨让我最近开动关怀F#——一种面向 .NET 的 ML 说话,由微软修复。它是 C#(主淌若面向对象的说话)的函数式对应版块,亦然最新的 ML 说话之一。

什么是 F#?

可怜的是,莫得东说念主能被奉告“Matrix”是什么,你必须我方去看。 ——莫菲斯,《黑客帝国》

在接头 F# 之前,咱们起始应该回报“F# 是什么?”这个问题。我借用官方页面的一些容貌来回报:

F# 是一种通用编程说话,用于编写纯粹、健壮且高性能的代码。

F# 让你能够编写纯粹、自解说的代码,让你的注意力集中在问题领域,而不是编程的细节。

它在保证速率和兼容性的同期作念到这少量——它是开源的、跨平台的,况兼具有精湛的互操作性。

open System // Gets access to functionality in System namespace.\n\n// Defines a list of names\nlet names = [ \"Peter\"; \"Julia\"; \"Xi\" ]\n\n// Defines a function that takes a name and produces a greeting.\nlet getGreeting name = $\"Hello, {name}\"\n\n// Prints a greeting for each name!\nnames\n|> List.map getGreeting\n|> List.iter (fun greeting -> printfn $\"{greeting}! Enjoy your F#\")

趣闻:F# 是让管说念操作符 |> 流行起来的编程说话。

F# 领有繁密特点,包括:

轻量级语法

默许不可变

类型推导和自动泛化

一等函数(First-class functions)

强盛的数据类型

方法匹配

异步编程

完好意思的特点集可以在 F# 说话指南中找到:https://learn.microsoft.com/en-us/dotnet/fsharp/language-reference/

看起来很有出息,对吧?

F# 1.0 由微软磋磨院于 2005 年 5 月考究发布。率先,它由微软剑桥磋磨院的 Don Syme 修复,发源于一个名为“Caml.NET”的磋磨技俩,旨在将 OCaml 引入 .NET 平台。2010 年,跟着 F# 2.0 的发布,F# 从微软磋磨院转动到微软的修复者用具部门,成为考究复古的修复说话。

自率先发布以来,F# 一直在束缚演进,最近的版块F# 9.0已于 2024 年 11 月发布。恰逢 F# 出生 20 周年,这时候关怀它似乎再合适不外了!

我想尝试 F# 的原因有几个:

.NET 在几年前造成了开源且可移植的,我想望望它的发挥何如。

我很有趣 F# 是否比较 OCaml 有额外的上风。

我传闻 F# 的修复用具(如 Rider 和 Ionide)体验可以。

我心爱尝试新的编程说话。

接下来是我对几个方面的初步印象。

说话特点

看成 ML 说话家眷的一员,F# 的语法对熟悉 OCaml 的东说念主来说不会有太大惊喜。不外,由于熟悉 OCaml 的东说念主并未几,我要补充少量:Haskell 方法员会很容易上手,Lisp 修复者也会感到亲切。

对于其他东说念主来说,掌捏基础学问并不难。

// function application\nprintfn \"Hello, World!\"\n// function definition\nlet greet name =\n    printfn \"Hello, %s!\" name\ngreet \"World\"\n// whitespace is significant, like in Python\nlet foo =\n    let i, j, k = (1, 2, 3)\n    // Body expression:\n    i + 2 * j + 3 * k\n// conditional expressions\nlet test x y =\n  if x = y then \"equals\"\n  elif x < y then \"is less than\"\n  else \"is greater than\"\nprintfn \"%d %s %d.\" 10 (test 10 20) 20\n// Looping over a list.\nlet list1 = [ 1; 5; 100; 450; 788 ]\nfor i in list1 do\n   printfn \"%d\" i\n// Looping over a sequence of tuples\nlet seq1 = seq { for i in 1 .. 10 -> (i, i*i) }\nfor (a, asqr) in seq1 do\n  printfn \"%d squared is %d\" a asqr\n// A simple for...to loop.\nlet function1 () =\n  for i = 1 to 10 do\n    printf \"%d \" i\n  printfn \"\"\n// A for...to loop that counts in reverse.\nlet function2 () =\n  for i = 10 downto 1 do\n    printf \"%d \" i\n  printfn \"\"\n// Records\n// Labels are separated by semicolons when defined on the same line.\ntype Point = { X: float; Y: float; Z: float }\n// You can define labels on their own line with or without a semicolon.\ntype Customer =\n    { First: string\n      Last: string\n      SSN: uint32\n      AccountNumber: uint32 }\nlet mypoint = { X = 1.0; Y = 1.0; Z = -1.0 }\n// Discriminated Union\ntype Shape =\n    | Circle of radius: float\n    | Rectangle of width: float * height: float\n// Functing using pattern matching\nlet area shape =\n    match shape with\n    | Circle radius -> System.Math.PI * radius * radius\n    | Rectangle (width, height) -> width * height\nlet circle = Circle 5.0\nlet rectangle = Rectangle(4.0, 3.0)\nprintfn \"Circle area: %f\" (area circle)\nprintfn \"Rectangle area: %f\" (area rectangle)

这里没什么令东说念主胆寒的,对吧?

这是另一个稍许复杂一些的例子:

open System\n\n// Sample data - simple sales records\ntype SalesRecord = { Date: DateTime; Product: string; Amount: decimal; Region: string }\n\n// Sample dataset\nlet sales = [\n    { Date = DateTime(2023, 1, 15); Product = \"Laptop\"; Amount = 1200m; Region = \"North\" }\n    { Date = DateTime(2023, 2, 3);  Product = \"Phone\";  Amount = 800m;  Region = \"South\" }\n    { Date = DateTime(2023, 1, 20); Product = \"Tablet\"; Amount = 400m;  Region = \"North\" }\n    { Date = DateTime(2023, 2, 18); Product = \"Laptop\"; Amount = 1250m; Region = \"East\" }\n    { Date = DateTime(2023, 1, 5);  Product = \"Phone\";  Amount = 750m;  Region = \"West\" }\n    { Date = DateTime(2023, 2, 12); Product = \"Tablet\"; Amount = 450m;  Region = \"North\" }\n    { Date = DateTime(2023, 1, 28); Product = \"Laptop\"; Amount = 1150m; Region = \"South\" }\n]\n\n// Quick analysis pipeline\nlet salesSummary =\n    sales\n    |> List.groupBy (fun s -> s.Product)                          // Group by product\n    |> List.map (fun (product, items) ->                          // Transform each group\n        let totalSales = items |> List.sumBy (fun s -> s.Amount)\n        let avgSale = totalSales / decimal (List.length items)\n        let topRegion =\n            items\n            |> List.groupBy (fun s -> s.Region)                   // Nested grouping\n            |> List.maxBy (fun (_, regionItems) ->\n                regionItems |> List.sumBy (fun s -> s.Amount))\n            |> fst\n\n        (product, totalSales, avgSale, topRegion))\n    |> List.sortByDescending (fun (_, total, _, _) -> total)      // Sort by total sales\n\n// Display results\nsalesSummary\n|> List.iter (fun (product, total, avg, region) ->\n    printfn \"%s: $%M total, $%M avg, top region: %s\"\n        product total avg region)

你可以尝试将上头的代码片断保存到一个名为 Sales.fsx 的文献中,然后这样运行它:

dotnet fsi Sales.fsx

当今你照旧知说念,F# 是进行临时剧本(ad-hoc scripts)的绝佳采用!此外,径直运行 dotnet fsi 会启动F# REPL(交互式环境),让你可以庸俗探索这门说话。

我不会在这里详备先容 F#,如果你想快速了解 F# 的语法,我提议阅读 F# 快速初学教程:https://learn.microsoft.com/en-us/dotnet/fsharp/tour

让我印象深切的少量是,F# 说话设想者特殊真贵裁减初学门槛,通过许多细节优化进步生手体验。以下是几个示例,这些可能对你来说不足轻重,但如果你熟悉 OCaml,就会发现它们的意旨所在:

// line comments\n(* the classic ML comments are around as well *)\n\n// mutable values\nlet mutable x = 5\nx <- 6\n\n// ranges and slices\nlet l = [1..2..10]\nname[5..]\n\n// C# method calls look pretty natural\nlet name = \"FOO\".ToLower()\n\n// operators can be overloaded for different types\nlet string1 = \"Hello, \" + \"world\"\nlet num1 = 1 + 2\nlet num2 = 1.0 + 2.5\n\n// universal printing\nprintfn \"%A\" [1..2..100]

我猜其中一些转变可能会激励争议,具体取决于你是否是ML 说话的原教旨目的者。但在我看来,任何让 ML 说话更受接待的矫正,齐是一件善事。

趁机提一句,F# 处理Unicode 字符串和正则抒发式也特殊方便!

时时有东说念主说,F# 主淌若C# 将来功能的试验田。也许这是真实,但由于我莫得历久关怀这两门说话,是以没法给出我方的判断。不外,我如实诧异地发现,广受接待的 async/await 语法最早果然是发源于 F# 2.0!

在 2012 年,跟着C# 5的发布,async/await 语法才考究进入 C#,并逐渐流行开来。这项功能让修复者能够写出像同步代码相通易读,但同期又能享受手写异步代码的悉数上风(举例幸免 UI 线程被梗阻)。如今,这种方法照旧被许多当代编程说话模仿,比如Python、JavaScript、Swift、Rust,以致 C++。

F# 的异步编程神志天然和 async/await 有些不同,但标的是相通的。本色上,async/await 仅仅 F#更早推出的异步机制的简化版块,该机制最早出当今 F# 2.0。

—— Isaac Abraham,《F# in Action》

将来 F# 会何如发展,还需要时候测验。但我认为,C#很难十足取代 F#。

我还发现了一条来自2022 年的好音问,标明微软可能会加大对 F# 的投资:

“终于有好音问了!当年 10 年,F# 在微软里面唯独 2.5 个东说念主在爱护(再加上一些社区孝敬者)。但在 2022 年夏天,微软终于决定 考究投资 F#,并在布拉格组建了一支完好意思的 F# 修复团队 。我亦然这个团队的成员,看成又名多年的 F# 粉丝,我很欢腾终于有了真实的发挥。”

从 F# 8.0 到 F# 9.0 的变化来看,这支新团队如实作念出了不少超卓的责任!

F# 生态系统

短短几天的体验,很难全面评估 F# 的生态,但全体来看,原生的 F# 库和框架并未几。大多数修复者主要依赖.NET 中枢 API和针对 C# 的第三方库。这在托管说话(如 Scala、Clojure、Groovy)中是很常见的情况,因此也不算不测。

如果你想了解 F# 生态,可以稽查Awesome F#(https://github.com/fsprojects/awesome-fsharp),它整理了 F# 关系的流行库、用具和框架。以下是一些值得关怀的技俩:

Web 修复关系Giraffe:基于 ASP.NET Core 的轻量级 Web 修复库,提供函数式修复神志。Suave:一个纯粹的 Web 办事器库,提供组合式的路由和任务治理(Giraffe 受 Suave 启发)。Saturn:基于 Giraffe 和 ASP.NET Core,提供雷同 Ruby on Rails 和 Elixir Phoenix 的 MVC 框架。Bolero:基于 WebAssembly 和 Blazor 的 F# 前端修复框架。Fable:将 F# 代码编译为 JavaScript,可与 React、Node.js 等生态集成。Elmish:MVU(Model-View-Update)架构,适用于 F# 前端修复,常与 Fable 结合使用。SAFE Stack:端到端的 F# Web 修复栈,结合 Saturn、Azure、Fable 和 Elmish,提供类型安全的修复体验。数据科学关系Deedle:雷同 Python pandas 的数据分析库。DiffSharp:复古自动微分和机器学习的库。FsLab:数据科学用具集,包括可视化和统计分析用具。

目下我还莫得深入体验这些库,是以具体的反映和推选留到以后再说。

文档

官方文档质料可以,不外有点散布,一部分在微软官网(https://learn.microsoft.com/en-us/dotnet/fsharp/what-is-fsharp),另一部分在F# 软件基金会的 fsharp.org 站点(https://fsharp.org/)上,这点让我有些疑心。

我独特心爱以下几部分文档:

F# 立场指南:https://learn.microsoft.com/en-us/dotnet/fsharp/style-guide/

F# 设想 RFC 仓库(悉数说话齐应该有雷同的 RFC 机制!):https://github.com/fsharp/fslang-design

F# 门径库 API:https://fsharp.github.io/fsharp-core-docs/

此外,F# for Fun and Profit(https://fsharpforfunandprofit.com/)亦然一个可以的学习资源(尽管内容有点旧)。

修复用具F# 的修复用具复古一直是个问题。当年,ag百家乐贴吧F#主要在 Visual Studio 上体验精湛,但在其他剪辑器上的复古较差。不外,当年十年情况有了很大改善。 2014 年,Tomas Petricek、Ryan Riley 和 Dave Thomas修复了FSharp.Compiler.Service(FCS)包,将F# 编译器、剪辑器用具和剧本引擎整合成一个库。这使得 F# 能够适配更多剪辑器,举例:

JetBrains Rider—— .NET 生态的强盛 IDE,对 F# 友好。

Emacs(fsharp-mode)

Zed(第三方插件)

Helix(内置 F# 复古)

VS Code(Ionide 插件)

不外,我如故要提一下,我发现 F# 的用具链在某些方面有所欠缺:

fsharp-mode 目下还不复古TreeSitter(至少暂时如斯),而且似乎修复并不活跃。从代码来看,它是从caml-mode派生出来的。

Zed 对 F# 的复古特殊粗野。

在VS Code中,采用区域的推广和收缩功能果然是坏的,这对于 F# 这样一个本应在 VS Code 上有精湛复古的说话来说,着实让东说念主迷糊。

我如实很难顺应VS Code的快捷键绑定(对我来说,修饰键和功能键太多了),以及它的剪辑方法。是以,我可能会不时对持使用Emacs,或者抽出时候好好磋磨neovim!

好音问是,天下似乎齐在使用并吞个代码风景化用具Fantomas,包括 F# 官方团队,这少量很棒!不外,F# 的linter(代码搜检用具)情况就不太期许,目下独一流行的FSharpLint似乎照旧造成弃坑技俩了。不外话说总结,F# 的编译器自身照旧敷裕强盛,是以对 linter 的需求也莫得那么高。

看起来微软并莫得独特进入到 F# 用具链的复古中,简直悉数的中枢用具技俩齐是由社区驱动的。

至于 AI 扶植编程用具(如 GitHub Copilot),对 F# 的复古也可以,不外我暂时莫得深入体验。

最终来说,任何复古 LSP(说话办事器条约)的剪辑器齐应该可以胜任 F# 修复。

趁机说一下,我在使用F#(以及 OCaml)编程时有一个意念念的发现:当你使用一门领有优秀类型系统的说话时,对剪辑器的需求其实并不高。大多数时候,我只需要一些内联类型信息(比如雷同CodeLens的功能)、自动补全,以及能够方便地将代码发送到 F# 交互式环境(fsi就够用了。通俗才是终极的复杂……

其他值得关怀的用具:

Paket - 一个用于.NET技俩的依赖治理用具。可以把它看作是bundler(Ruby)、npm(Node.js)或pip(Python)在.NET生态中的等价物。

FAKE - 一个基于 F# 的DSL,用于构建任务等。它雷同于 Ruby 的rake,一些东说念主以致认为这是在现存 .NET 技俩中“悄悄”引入 F#的最好神志。

哄骗场景

.NET 生态自身特殊雄壮,是以F# 表面上适用于任何 .NET 关系领域。

不外,我认为F# 独特允洽数据分析,因为它提供了类型提供方法(Type Providers)这一私有功能。

底下是一个使用JSON 类型提供方法的示例:

#r \"nuget: FSharp.Data\"\n\nopen System\nopen FSharp.Data\n\n// Define the type based on a sample JSON entry\ntype PeopleJson = JsonProvider<\"\"\"\n[\n  { \"name\": \"Alice\", \"age\": 30, \"skills\": [\"F#\", \"C#\", \"Haskell\"] }\n]\n\"\"\">\n\n// Simulated JSON list (could be loaded from file or API)\nlet jsonListString = \"\"\"\n[\n  { \"name\": \"Alice\",  \"age\": 30, \"skills\": [\"F#\", \"C#\", \"Haskell\"] },\n  { \"name\": \"Bob\",    \"age\": 25, \"skills\": [\"F#\", \"Rust\"] },\n  { \"name\": \"Carol\",  \"age\": 28, \"skills\": [\"OCaml\", \"Elixir\"] },\n  { \"name\": \"Dave\",   \"age\": 35, \"skills\": [\"Scala\", \"F#\"] },\n  { \"name\": \"Eve\",    \"age\": 32, \"skills\": [\"Python\", \"F#\", \"ML\"] },\n  { \"name\": \"Frank\",  \"age\": 29, \"skills\": [\"Clojure\", \"F#\"] },\n  { \"name\": \"Grace\",  \"age\": 27, \"skills\": [\"TypeScript\", \"Elm\"] },\n  { \"name\": \"Heidi\",  \"age\": 33, \"skills\": [\"Haskell\", \"PureScript\"] },\n  { \"name\": \"Ivan\",   \"age\": 31, \"skills\": [\"Racket\", \"F#\"] },\n  { \"name\": \"Judy\",   \"age\": 26, \"skills\": [\"ReasonML\", \"F#\"] }\n]\n\"\"\"\n\n// Parse the JSON\nlet people = PeopleJson.Parse(jsonListString)\n\n// Print it\nprintfn \"People in the list:\\n\"\nfor p in people do\n    printfn \"%s (age %d) knows:\" p.Name p.Age\n    p.Skills |> Array.iter (printfn \"  - %s\")\n    printfn \"\" 

我第一次看到这个时,嗅觉就像魔法相通。F# 能够从一个小的数据样本中预计出数据的结构和类型,并自动生成领略器。你可以将代码保存为TypeProvidersDemo.fsx 文献,然后像这样运行它:

dotnet fsi TypeProvidersDemo.fsx

但这还不啻于此,你还可以缩小地从 HTML 表格中索求数据并对其进行可视化:

#r \"nuget:FSharp.Data\"\n#r \"nuget: Plotly.NET, 3.0.1\"\n\nopen FSharp.Data\nopen Plotly.NET\n\ntype LondonBoroughs = HtmlProvider<\"https://en.wikipedia.org/wiki/List_of_London_boroughs\">\nlet boroughs = LondonBoroughs.GetSample().Tables.``List of boroughs and local authorities``\n\nlet population =\n    boroughs.Rows\n    |> Array.map (fun row ->\n                  row.Borough,\n                  row.``Population (2022 est)``)\n    |> Array.sortBy snd\n    |> Chart.Column\n    |> Chart.show

如果你运行该剧本,你将在浏览器中看到一张展示伦敦各区东说念主口的细密无比图表。可以吧!

在这里,咱们也体会到了 F# 剧本中使用外部库(举例 Plotly.NET)的方便性!

瞻望将来,我认为 F# 适用于后端办事,以致可以用于构建全栈哄骗,尽管我尚未深入尝试 F# 在这一领域的原生治理决策。

Fable 和 Elmish 使 F# 成为客户端编程的可行采用,并可能为你在日常责任中引入 F# 提供一种通俗的路线。

注意:传统上,Fable 主要用于调养为 JavaScript,但自 Fable 4 以来,它还复古调养为 TypeScript、Rust、Python 等其他说话。

以下是将 F# 代码调养为其他说话的通俗示例:

# If you want to transpile to JavaScript\ndotnet fable\n# If you want to transpile to TypeScript\ndotnet fable --lang typescript\n# If you want to transpile to Python\ndotnet fable --lang python
社区情况

我对 F# 社区的初步印象是边界相对较小,可能以致比 OCaml 社区还要小。F# 关系接头最活跃的场所似乎是 Reddit 和 Discord(Reddit 上列出的阿谁)。

目下,我还不太明晰微软在 F# 社区中饰演什么扮装,因为全体上很少看到他们的参与。

对我来说,社区边界小并不是问题,只须它敷裕活跃、充满生机就行。此外,我也发现我方时时更容易融入袖珍社区。当年从 Java 转向 Ruby 时,这种社区氛围和包摄感的变化简直是一丈差九尺。

对于 F# 的竹素、社区网站或博客并未几,但这亦然我想到之中的情况。

我发现的一些比较蹙迫的社区技俩包括:

Amplifying F# —— 一个奋力于本质 F# 并眩惑更多企业参与的技俩

F# for Fun and Profit —— 一个相聚了 F# 教程和著作的网站

F# Lab —— 一个社区驱动的 F# 数据科学用具包

F# Weekly —— 每周更新的 F# 关系新闻和动态

总的来说,F# 还有许多本质和眩惑新用户的空间,但对于一个照旧存在 20 年的技俩来说,这并拒接易。我仍然不太相识为什么微软莫得更积极地本质 F#,因为我认为它本可以成为微软的一个很好的营销用具。

全体而言,我目下还不太有履历对 F# 社区作念太多评价。

受接待经过

是否在乎一门编程说话的“流行度”,这取决于个东说念主。有些东说念主时时问我,为什么花这样多时候在一些简直不会带来做事契机的说话上,比如:

Emacs Lisp

Clojure

OCaml

F#

天然,做事发展很蹙迫,但对我来说,还有其他身分:

编程的乐趣(F# 里的 “F” 代表 “Fun”)

学习新的编程范式和念念想

挑战我方,换一种念念维神志去编程

从大多数主流贪图来看,F# 并不是一门流行的说话。它在 TIOBE、Stack Overflow 或大多数招聘网站上的名次齐不高。但如果与其他主流的函数式编程说话比较,F# 也莫得更不受接待。缺憾的是,函数式编程于今仍未进入主流,省略永恒不会。

F# 与 OCaml 的比较

F# 率先的标的是将 OCaml 的上风带入 .NET,同期让 .NET 生态可以使用 OCaml 立场的强类型函数式编程。率先的任务相对明确:再行齐全 OCaml 说话的中枢部分,并移植部分门径库,使其可以在 .NET 运行时(CLR)上运行。

如果你问大多数东说念主 F# 优于 OCaml 的优污点,你可能会获取以下的谜底:

F# 的优点:

运行在 .NET 平台上:可以使用大齐 .NET 生态中的库

由微软复古

对 OO 修复者来说更容易上手:语法比 OCaml 略微通俗、编译器的作假和教导更易相识、调试更友好

强盛的异步编程复古

具有 OCaml 所莫得的一些私有特点,比如匿名纪录、行径方法、筹划抒发式、序列推导、类型提供器、单元类型

F# 的污点:

运行在 .NET 上(这既是优点亦然污点):与 .NET 的互操作性影响了一些说话设想(如允许 null 值)

由微软复古(有些东说念主不心爱微软),微软对 F# 的资源进入似乎较少,历久复古不纯真

定名立场:F# 偏向 PascalCase 和 camelCase,而 OCaml 使用 snake_case

浮泛一些 OCaml 的特点,如一流的模块和函子(First-class Modules & Functors)、广义代数数据类型(GADTs)

莫得 OCaml 那只能人的骆驼 Logo

F# 这个名字天然很酷,但在搜索和文献定名时可能会带来困扰(时时会看到 FSharp)

F# 和 OCaml 齐可以编译为 JavaScript,F# 通过Fable,OCaml 通过Js_of_ocaml和Melange。从名义上看,Fable 似乎更熟谙,但我莫得深入磋磨它们,是以无法给出详备对比。

总体而言,这两者齐是强盛但小众的说话,将来很难进入主流。不外,由于 .NET 生态雄壮,F# 可能更容易在任业环境中找到落脚点,尤其是与 C# 代码库共存时。

总结

问:C# 能作念而 F# 不可作念的事情是什么?

答:抛出 NullReferenceException!

—— 来自 F# 社区的见笑

总体来说,我比预期更心爱 F#!它让我想起当年学习 Clojure 的经历 —— 那时 Clojure 是最实用的 Lisp 说话之一,主要成绩于它与 Java 生态的精湛互操作性。

如果 .NET 从一开动便是跨平台和开源的,也许ClojureCLR会和 Clojure 相通流行,而 F# 也可能会领有更大的社区和更平日的哄骗。事实上,如果莫得 .NET Core,我可能根底不会再碰 .NET,而我深信有许多东说念主和我相通。F# 直到 2010 年才开源,这无疑影响了它的早期本质。

即便如斯,F# 依然是一门值得学习的说话,尤其允洽那些熟悉 .NET 的修复者。对于想要深入了解 ML(元说话)家眷说话的东说念主来说,F# 亦然一个可以的采用。

更蹙迫的是,Fable 让 F# 可以运行在 JavaScript、Dart、Rust 和 Python 等多个环境中,这进一步拓宽了它的适用场景。

是以,为什么要学 F#?

F# 社区有句话——F# 里的 “F” 代表 “Fun”(意念念)。

在我片时的体验中,这少量如实获取了考据!

此外,如果你的 F# 代码能够奏凯编译,那么它很可能会按照你的预期运行 —— 这在编程界但是个很可贵的特点!