(评论)
(comments)
原始链接: https://news.ycombinator.com/item?id=38122679
当然! 让我对此进行扩展。 首先,让我们讨论语法。 语法是个人喜好。 我相信 F# 的语法,特别是与函数式编程概念混合时,可以提供比 C# 或 Java 等其他静态类型命令式编程语言中的传统结构化编程概念更清晰、更优雅的抽象。 这部分是由于高阶函数、lambda 和轻量级函数值的可用性导致更短、更简单的表达式,而无需冗余语句或中间赋值。 它使代码阅读起来流畅且自然。 其次,关于库,虽然 F# 中的标准库确实比 DotNet 小得多,但 FSL 和各种包管理器中仍然有大量可用的高质量库,包括那些在 MIT 许可证下分发的库,这些库允许开放 在商业环境中创建源代码和自由软件。 此外,GitHub 和 OCP 等平台上也提供了越来越多流行且广泛采用的 OCaml 库,从而使跨不同语言系列共享通用功能成为可能。 关于原始性能指标,根据场景的不同,肯定会有优点和缺点。 在其他条件相同的情况下,并且纯粹基于数值,C# 在速度和内存利用率方面表现出了相对于 F# 的卓越性能。 然而,原始数据并不能说明全部情况。 在比较性能结果时,除了这些单维测量之外,重要的是要考虑影响实际应用场景的因素,例如易用性、灵活性、可维护性、可扩展性以及整体生产力和投资回报率。 当然,需要考虑一些权衡和缺点。 例如,F# 和 OCaml 的优势之一是都支持惰性求值,为优化计算效率提供了额外的机会。 由于有限的本机命令式控制结构集与高级函数构造的简洁表达相结合,掌握函数式编程技术的进入门槛也较低。 另一个需要考虑的关键领域是垃圾收集,它在确定生产环境中语言选择的有效性和效率方面发挥着重要作用,特别是在处理数据集合时。 OCaml 和 F# 利用高效的垃圾收集器,其运行水平相当于或超过流行的编译静态类型语言(例如 C++ 或 Rust)所达到的水平,同时还实现了高水平的内存安全
As some additional background, there's a very good reason why the F# language typechecks files sequentially. Because F# supports type inference at every scope, a single change in the body of a function can result in cascading type changes across an entire project. This kind of change can not only affect other files, but other files inside of other projects in the same solution.
A way to curb these kinds of cascading changes is explicit type annotations and/or signature files, which "lock" the type signature for a given construct/file. And the F# compiler has had optimizations in place when signature files are used to know when to re-check stuff based on this. However, these didn't extend to the sequential typechecking of files, and for the large majority of codebases that don't use signature files, these optimizations didn't really kick in anyways.
reply