F# 对于 OO 或命令式来说缺少什么? [关闭]

2024-05-10

我多次听说 F# 不适合特定任务,例如 UI。 “使用正确的工具”是一个常见的短语。

除了缺少 WinForms/WPF/ORM 设计器等工具之外,我不确定 F# 中究竟缺少什么——老实说!然而,特别是在 UI 方面,我听说 C# 做得更好。那么,F# 在命令式使用时实际的差异和遗漏是什么?

这是我列出的清单:

  • 许多缺少工具支持

  • 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(使用前将#替换为@)

F# 对于 OO 或命令式来说缺少什么? [关闭] 的相关文章

随机推荐

  • CollapsingToolbarLayout 禁用绘制扩展

    我有一个已有条件禁用的 CollapsingToolbar 当用户在这种情况下加载视图时 它看起来就像一个普通的 ToolBar 对象 唯一奇怪的是 如果它们向下拖动 例如在拉动刷新样式操作中 折叠工具栏就会展开 尽管我的愿望和代码与此相反
  • AWS MobileHub:重命名 Android / iOS 示例项目

    我是 AWS Mobilehub 的新手 我喜欢它允许我使用 AWS 配置选项创建项目 但是 当我尝试构建应用程序 ios swift android 时 它总是使用我的示例项目作为项目名称 在 AWS 项目的大多数配置设置中 例如使用 c
  • Doctrine 生成实体命名空间问题?

    好吧 我对原则有最后一个问题 生成 实体命令 我运行以下命令 并得到预期的文件 src MyNamespace Bundle MyNamespaceBundle Resources config doctrine metadata orm
  • 如何消除警告:使用“$”而不是“.”对于 Eclipse 中的内部类

    我是 Android 开发新手 当我将 eclipse 和 Android SDK 更新到最新版本后 我收到警告 Use instead of for inner classes or use only lowercase letters
  • 专门针对命名空间的模板

    Given namespace A class Foo class Bar namespace B class Foo class Bar 我想在命名空间 A 或 B 上模板化一个类 以便执行以下操作 template
  • 克隆代码更改在开发站点中不可见

    我对克隆很陌生 我在 eclipse 中有一个项目文件夹 我是从cvs项目导入的 我有 zope 作为服务器 我启动 zope bin instance restart 当我在文件夹中进行更改时 我无法在开发网站中看到更改 我似乎无法发现发
  • 如何模拟一个方面

    我目前正在使用aspectj 开发一些监控工具 因为这个工具应该是技术独立的 尽可能 所以我没有使用 Spring 进行注入 但我希望我的方面能够经过单元测试 方面示例 Aspect public class ClassLoadAspect
  • 独占锁定ConcurrentHashMap

    我知道不可能锁定 ConcurrentHashMap 进行独占访问 但是 我找不到原因 是因为构成CHM的 Segment 没有被api公开吗 据推测 如果是的话 客户端代码可以执行 交接 锁定 Cheers 我知道不可能锁定 Concur
  • document.registerElement - 为什么我们需要指定“prototype”和“extends”?

    考虑我想扩展本地button元素 并创建我自己的super button元素 据我所知 它必须遵循以下模式 var SuperButton document registerElement super button prototype Ob
  • 在基于视图的 NSTableView 中,如何通过单击使控件成为第一响应者?

    基于视图的 NSTableView 似乎只有标准行为 为了使表内的文本字段成为第一响应者 用户必须双击或单击并 保持冷静 然而 考虑到基于视图的 NSTableViews 提供的灵活性 这种行为并不总是可取的 因为现在可能有很多不同且复杂的
  • 发送 OneSignal 推送通知时 Android 应用程序崩溃

    Android 应用程序在发送信号推送通知后立即崩溃 我收到这个错误 尝试查看其他 stackoverflow 答案 但没有帮助 请检查下面的代码 build gradle 和错误 不明白为什么它不起作用 P 请检查下面的代码 build
  • wait task.delay 有助于加快 UI 刷新速度,但是如何实现呢?

    我有一个视图模型 它正在获取一行记录并显示在 Windows Phone UI 上 这个获取数据的视图模型方法正在执行大量任务 所有任务都标记为等待操作 如下所示 async Task GetData var dataCollection
  • 如何使用 grid.arrange 移动图例位置

    我试图在一页中排列 4 个图 将图例放在底部中心 我用它来获取其中一个图的图例 因为它们对于四个图来说是相同的 get legend lt function myggplot tmp lt ggplot gtable ggplot buil
  • Java 的 QP 求解器 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Angular flex-layout - fxLayoutGap 导致包裹行末尾出现恼人的间隙

    使用fxLayoutGap 和wrap 在被换行的每一行的末尾留下令人讨厌的边距 有没有办法来解决这个问题 https stackblitz com edit angular fxlayoutgap calc mralnz file app
  • 在 Spring 中设置 WS https 调用超时 (HttpsUrlConnectionMessageSender)

    我正在尝试为 WS 调用设置超时 我延长了WebServiceGatewaySupport并尝试将发送者超时设置为如下 public Object marshalSendAndReceive Object requestPayload We
  • 颤动附近的连接

    当我尝试在设备上做广告或发现时 我收到此错误 但是前一天在环路上效果很好 PlatformException Failure 17 API Nearby CONNECTIONS API is not available on this de
  • 在 Django Rest Framework 中过滤多个值

    我有一个模型想要过滤多个值 我的模型 class Product models Model ean models CharField max length 13 unique True product id models CharField
  • 不支持函数调用。考虑用对导出函数的引用替换函数或 lambda

    我在我的应用程序中使用 APP INITIALIZER 并在 app module ts 中将其设置如下 并进行必要的导入 NgModule providers ContextService provide APP INITIALIZER
  • F# 对于 OO 或命令式来说缺少什么? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi