我现在一直在使用功能反应编程(Reflex-FRP)在Haskell中编写全堆栈Web应用程序3年。好奇心让我发现了在这个区域中不得不提供Haskell以外的FP语言。
Haskell的GHCJS(ESP。与方尖碑一起使用时)满足所有这些,但有一个痛苦点:GHCJ的未来(在一年内没有更新)和反射似乎掌握在一家小公司的手中,黑曜石系统。
将我带到F#,混合FP语言(“混合”,因为它支持OOP,这对于与.NET生态系统的其余部分集成至关重要)。我在这里记录了我的学习。
完全访问整个库和框架的整个.NET生态系统(大于Haskell的框架)。
.NET 5.0生态系统很乐意与之合作(并且在Linux上使用vscode);您可以比Haskell更直接地创建跨平台应用程序,包括在移动设备上。如果我今天开始开发神经元,我肯定会考虑f#(但是见下文)。
微软有一个伟大的全堆栈网络开发故事;他们支持WebasseMbly(Blazor),包括实时通信(SignalR)的框架。在F#中,今天的Bolero是使用上述技术的转移框架。
我发现我可以依赖微软推进全堆栈Web开发超过一个小咨询(黑曜石系统),而不是哈尔克尔土地的透明开源开发。也就是说,我有一些希望Tweage的Asterius赶上,并且鼓励社区在Haskell中扩散全新的全部堆叠开发工具生态系统,而不一定与反射联系。
由于GHCID,快速开发重新加载工作流程在Haskell中超级良好。在.NET中,您有Dotnet手表 - 但这会对整个项目重新编译导致令人讨厌的延迟的每个变化;它让我切换回使用基于DSL的静态站点的Haskell,而实时重新加载对于获得CSS更改的内容,这是必不可少的。
必须使用基于OOP的.NET库(用C#编写)可以是纯FP透视图的烦恼,但可以通过在功能图层中包装这些库,然后在F#程序中使用该库来处理。
以直接的方式使用叉的覆盖依赖性几乎是不可能的。您必须创建一个包含overriden依赖性二进制文件的本地Nuget Repo。虽然在Haskell World,人们可以轻松使用NIX来使用Git Repo(Neuron这样做)作为包依赖性。 1
F#将继续保留在我的工具箱中。如果上述缺点是以某种方式解决的,我可能只是为Haskell的一些项目选择它,这仍然是我今天的进入语言。