我多次听说 F# 不适合特定任务,例如 UI。 “使用正确的工具”是一个常见的短语。
除了缺少 WinForms/WPF/ORM 设计器等工具之外,我不确定 F# 中究竟缺少什么——老实说!然而,特别是在 UI 方面,我听说 C# 做得更好。那么,F# 在命令式使用时实际的差异和遗漏是什么?
这是我列出的清单:
许多缺少工具支持
F# 仍处于测试阶段
-
您的开发人员不了解 F#
可变的需要“可变”或者需要被引用,引用需要!取消引用
可变变量使用
val 需要 DefaultValue 属性来获取默认值
F# 不发出隐式接口
受保护成员更难对付
无自动属性
抽象类上实现的虚拟成员需要两个定义
Quotations-to-LINQ-Expression-Trees 生成的树与 C#/VB 略有不同(对于期望其表达式采用特定格式的 API 来说很烦人)
无堆栈分配
F# 没有 ?: 条件运算符
在 F# 中指针可能被认为更麻烦
代表/活动可能被认为更麻烦(我认为它们更容易,但至少它们是不同的)
没有自动类型转换(例如 int 到 float,或隐式转换)
没有对 Nullable 的特殊语法支持(C# 的 ? 类型注释和 ?? 运算符,以及在可为 null 值上使用运算符。)
不会自动向上转换为公共基类或装箱(例如:let x : obj = if true then 1 else "hi" // 这不会进行类型检查)
在没有警告的情况下不能丢弃值(“忽略”来绕过它)
没有 C 风格的语法:)
对于以下问题:哪些是编写命令式代码或面向对象代码的障碍?为什么(简短的例子)?我错过了哪些?最好的解决方法是什么?为什么它们还不够?
请注意,我不是在谈论编写所谓的惯用F#,当然也不是在谈论函数式编程。我更感兴趣的是“如果我强迫自己在 F# 中编写 UI 或命令式/OO 代码,使用 F# OO/命令式功能和类类型,什么伤害最大?”
Bonus如果您不了解 F#,但使用 C# 或 VB.NET,并且认为它在某些情况下是更好的工具,请指出您认为有吸引力的特定语言功能和语法。
我不太喜欢这个问题,因为它抱怨 F# 不支持惯用的 C#。例如,我认为批评 F# 使用
无论如何,有一些命令式/面向对象的事情可以在 C# 中完成,而在 F# 中却无法完成。
F# 不支持嵌套类。在 C# 中,您可以在另一个类的主体中声明一个类,作为确定类型范围的机制。 F# 不支持这一点。
F# 不允许您两次实现相同的通用接口。例如,在 C# 中,您可以实现IComparable<int>
and IComparable<string>
在同一类型上。
在 F# 中,您必须具有架构分层。由于 F# 的类型推断,您只能使用已在类型声明“之前”或同一类型声明“块”中声明的类。然而,在 C# 中,您可以引用任何其他类。 (这实际上强制执行了一些良好的编程实践。)
F# 没有对 LINQ 的“本机”支持,如没有 from 关键字。但是,您可以使用 LINQ API 和 lambda 表达式来获得相同的结果。
F# 可以做而 C# 不能做的事情:
受歧视的工会。这使得在 F# 中创建树状数据结构变得很简单,而在 C# 中则必须求助于复杂的类型层次结构。
异步工作流程。 F# 库的这一功能消除了与 APM 相关的所有麻烦,从而使异步和并行编程变得更加简单。
模式匹配和活动模式。
用于消除与使用错误单位相关的错误的测量单位。 (例如,将“英尺”添加到“米”。)
etc.
您不应该关注 F#“不能像 C# 那样做”的事情,因为学习 F# 的全部目的是提供一种思考问题解决的新方法。如果您在 F# 中编写惯用的 C# 代码,您实际上并没有获得任何好处。
AFAIK F# 并没有缺少 .NET / COM 互操作的任何“必备功能”。在 F# 中,您可以执行诸如使用 out 和 byref 参数、声明字符串文字以及支持在任何内容上添加属性等操作。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)