F# 和运算符重载:(>) 和 (^)

2023-12-01

好的,有人可以向我解释为什么 F# 允许您重载 > 和 ^ 运算符,但不允许您使用它们吗?

+ (op_Addition): Works just fine.
^ (op_Concatenate): Compiler error in F#. Apparently only strings can be concatenated.
> (op_GreaterThan): Runtime Error – Failure during generic comparison: the type Program+OppTest4 does not implement the System.IComparable interface.

如果我将 F# 代码编译为库并使用 VB 中的这些运算符,它们都可以工作。如果我使用 C# 中的这些运算符,则除了 op_Concatenate 之外的所有运算符都可以工作(如预期)。但 F# 不仅忽略了其中一些,静态类型检查器甚至懒得告诉您它计划这样做。

Edit代码示例

type OppTest4(value: int) =
   member this.value = value
   static member (^) (left : OppTest4, right : OppTest4) =
     OppTest4( Int32.Parse( left.value.ToString() ^ right.value.ToString()  ))
   static member (+) (left : OppTest4, right : OppTest4) =
     OppTest4(left.value + right.value )
   static member (>) (left : OppTest4, right : OppTest4) =
     left.value > right.value
   static member (<) (left : OppTest4, right : OppTest4) =
     left.value < right.value

F# 对这些运算符符号具有适合 F# 的默认含义。您始终可以定义自己的含义来掩盖默认值,例如

let (>) x y = ...

例如,您可以将此运算符定义为“T.operator>(U)”(假设 x 的类型为 T,y 的类型为 U)。

有关默认定义,请参阅源发行版中 FSharp.Core 中的 prim-types.fs。 (它们可不简单!)

考虑到 (1) CLR 上缺乏对类似类型类的机制的支持(用于在一组其他不相关的类型之间定义公共语义)和 (2) 原始类型(如“int”)通常需要针对任何编程语言实现进行特殊处理(例如 System.Int32 没有定义运算符+方法,但大多数编程语言选择表现得好像存在这样的方法),很难想象跨所有语言的任何普遍可互操作的运算符内容今天在.Net 上。有很多设计权衡取决于语言选择做什么(这里总结了太多的交互问题)。无论如何,您应该能够从 F# 调用任何方法,并且如果默认运算符行为不理想,您可以将运算符重新定义(隐藏)为您想要的行为。如果您认为在某种特定情况下您会遇到工作困难,请告诉我。

EDIT

我在以下位置添加了更多详细信息

http://cs.hubfs.net/forums/thread/10869.aspx

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

F# 和运算符重载:(>) 和 (^) 的相关文章

随机推荐

  • 有谁的 iOS 应用程序因使用设备 UDID 而被 Apple 拒绝吗?

    我听到一些传言称苹果正在拒绝使用 iOS5 已弃用方法的应用程序 UIDevice uniqueIdentifier 任何人都可以确认他们的应用程序因此被拒绝吗 我知道使用这种已弃用的方法的替代方法 但我们的一位客户要求我们使用我们知道使用
  • 在使用 java 日志记录 API 时,如何禁用默认控制台处理程序?

    您好 我正在尝试在我的应用程序中实现 java 日志记录 我想使用两个处理程序 文件处理程序和我自己的控制台处理程序 我的两个处理程序都工作得很好 我的日志记录发送到文件和控制台 我的日志记录也被发送到默认的控制台处理程序 这是我不想要的
  • 处理 bash for...in 循环中的特殊字符

    假设我有一个文件列表 file1 file 1 file2 for in 循环将其分解为空格 而不是换行符 for x in ls do echo x done results file 1 file1 file2 我想对每个文件执行一个命
  • 如何在预定义的固定时间运行 MYSQL 查询?

    我有一个 Mysql 插入查询 我需要每天上午 11 00 运行查询 如何在MySQL中执行固定时间的查询 在 MS SQL 中 我可以通过 SQL Server 代理作业调度程序轻松完成此操作 那么 有什么方法可以在 MySQL 中运行预
  • 空手道测试在每个场景/功能之后进行清理[重复]

    这个问题在这里已经有答案了 这是我们使用空手道进行测试时面临的一个实际场景 我们有一个使用空手道测试的图形 API 想象一下这个 每个空手道功能都会在图中创建父节点和子节点以验证某些业务逻辑 然后想象一下有一套 100 个测试 这意味着创建
  • Heroku 错误:Web 进程无法在启动后 60 秒内绑定到 $PORT(使用 axios)

    这是完整的错误代码 错误 R10 启动超时 gt Web 进程未能在启动后 60 秒内绑定到 PORT 很多答案都说这与设置端口有关 因为heroku是动态设置的 但是如果我使用axios而不是server listen 并且需要mcsrv
  • 使用 FileWriter (Java) 以 UTF-8 写入文件?

    但是 我有以下代码 我希望将其编写为 UTF 8 文件来处理外来字符 有没有办法做到这一点 是否需要有一个参数 我非常感谢您对此的帮助 谢谢 try BufferedReader reader new BufferedReader new
  • Ajax 函数(如 .load())从 HTML 中删除注释。如何保留评论?

    例如 some div load http foo bar content 将检索 content from http foo bar但对于所有 HTML被剥夺了 我如何检索内容 content 包括任何意见 来自jQuery 手册 jQu
  • Rust 与 C++:从函数返回对象

    我是 Rust 新手 试图了解从函数返回对象时如何传递所有权 在以下基于引用的实现中 由于引用没有所有权 因此当 s 超出范围时 它会被删除并释放 fn dangle gt String dangle returns a reference
  • MPMoviePlayerController 多任务问题

    我在 iPhone 上开发一个应用程序 使用 MPMoviePlayerController 来播放音频文件 当应用程序进入后台时 如果 mpmovieplayer 正在播放 iPhone 会继续播放当前音乐 但当播放结束时 下一首曲目不会
  • React,从组件中的脚本访问 var

    我一直在尝试导入外部库 谷歌地图 以便在 React 组件中使用它 索引 html file div div
  • SSL 证书不受信任 - 仅在移动设备上[关闭]

    Closed 这个问题是无关 目前不接受答案 我的网站在桌面上通过 SSL 运行良好 chrome 我的地址栏附近有一个绿色的锁 上面写着 身份已验证 但是使用移动移动浏览器 Chrome Safari 我看到以下消息 该网站的身份尚未得到
  • 以 10 为基数的 int() 的文字无效 - django - 更新

    我是 django 初学者 并且 我正在尝试制作一个像组合框一样的子父项 条形取决于城市取决于国家 地区 我收到此错误 更新 更改了外键的模型和默认值 但仍然是相同的错误 有什么帮助吗 谢谢 这是 models py from django
  • 为什么这段代码的输出是111111?

    这是代码 我试图解决它 但我不明白它的输出怎么是111111 public class Test public static void main String args int list 1 2 3 4 5 6 for int i 1 i
  • 我如何找到 - 哪些 portlet 部署在 Liferay 6.1 的哪些页面上?

    换句话说 我需要查看哪些数据库表才能将 portlet 映射到组织中的页面 如果有这样的事 我们正在使用 Liferay 6 1 20 除了市场门户组件 如果您有权访问数据库 您可以在Layout表以了解您的 portlet 添加在哪些页面
  • Apple 在使用 PushKit 实现静默通知后遭到拒绝

    我们添加了需要 PushKit 并在 Info plist 中启用 VoIP 的静默通知 See Apple 的 PushKit 文档 现在我的应用程序被苹果拒绝了 您的应用程序在 Info plist 的 UIBackgroundMode
  • 带 CSS 的半圆(仅边框、轮廓)

    我正在尝试使用 CSS 创建一个圆圈 如下图所示 只有一个div div class myCircle div 并通过使用only CSS定义 不允许使用 SVG WebGL DirectX 等 我尝试画一个完整的圆圈 然后用另一个圆圈淡化
  • mvc如何修改默认路由

    我正在阅读 Pro Asp net mvc3 框架书 我想更改默认路由 以便我可以拥有不同的主页 我添加了一个名为 Pages 的新控制器和一个名为 Home 的视图 这就是我想要的主页 我尝试将其添加到我的 global asax cs
  • 如何在离线模式下保存Firebase实时数据库的一部分

    我想将 Firebase 数据库 JSON 中的特定路径存储在本地手机存储中 而不是实时 Firebase 数据库中的所有数据 假设我的 Firebase 数据库中有每个用户的新闻源路径 并且我只想保存为用户指定的新闻源 而不是在用户移动设
  • F# 和运算符重载:(>) 和 (^)

    好的 有人可以向我解释为什么 F 允许您重载 gt 和 运算符 但不允许您使用它们吗 op Addition Works just fine op Concatenate Compiler error in F Apparently onl