F# 运算符重载奇怪的行为

2024-02-25

假设由于某种奇怪的原因我想要这个功能:

let (~-) (str:string) = 42

所以我可以做这样的事情并得到 42 结果:

-"test"
val it : int = 42

这很好。但现在当我这样做时:

let a = 100
-a

I get:

error FS0001: This expression was expected to have type
    string    
but here has type
    int    

知道为什么会发生这种情况吗?


当您使用定义运算符时let,新定义hides运算符的所有先前定义。因此,在您的示例中,您隐藏了一元减号(适用于数字)的默认实现,并将其替换为仅适用于字符串的新运算符。

在内置类型上重新定义重载运算符并不容易。如果您需要这样做,最好避免使用运算符(只需使用函数)。但是,如果您想为自定义类型提供重载运算符,可以通过将运算符添加为静态成员来实现:

type MinusString(s:string) =
  member x.Value = s
  /// Provide unary minus for MinusString values
  static member (~-) (ms:MinusString) =
    MinusString("-" + ms.Value)

-(MinusString "hi") // Returns "-hi"

如果您确实想重新定义内置运算符(例如一元减号)并使其工作string,那么实际上有一种方法可以使用之前SO答案中描述的技巧 https://stackoverflow.com/questions/19682432/global-operator-overloading-in-f。但是,如果您有充分的理由,我只会使用它。

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

F# 运算符重载奇怪的行为 的相关文章

  • 在 F# 列表中键入扩展名

    假设我有一个类型 let MyType some info 但是 它通常用于列表 MyType list 所以我可以定义 let MyTypeList MyType list 有没有办法在 MyTypeList 上定义类型增强 我的实际情况
  • 对 F# 联合类型列表进行操作

    这是我的问题的延续F 联合类型列表 https stackoverflow com questions 13770911 f list of union types 感谢有用的反馈 我能够创建一个列表Reports with Report要
  • 在 F# 中处理 Deedle 时间序列中的缺失值 (1)

    这是一个小例子 我想处理系列上自定义函数的缺失值 假设我已经获得了一系列 series4 val it Series
  • 使用 F# 进行循环与递归

    这里的示例代码解决了一个项目欧拉问题 从数字 1 开始 按顺时针方向向右移动 方向 5 x 5 螺旋形成如下 21 22 23 24 25 20 7 8 9 10 19 6 1 2 11 18 5 4 3 12 17 16 15 14 13
  • 在 F# 中的 Choice 之上构建 Either(或 Result)

    我根据 Scott Wlaschin 中的信息构建了一个成功 失败的 monadblog http fsharpforfunandprofit com posts computation expressions wrapper types
  • 定义具有多种消息类型的消息传递域

    到目前为止 我见过的大多数 F 消息传递示例都使用 2 4 种消息类型 并且能够利用模式匹配将每条消息定向到其正确的处理函数 对于我的应用程序 由于处理和所需参数的不同性质 我需要数百种独特的消息类型 到目前为止 每个消息类型都是其自己的记
  • F# 中使用抽象类还是接口?

    从 C 背景开始摸索 F 在 C 中 决定何时使用接口和何时使用抽象类有明显的区别 在 F 中 我发现两者几乎合而为一 我知道 就 CLR 而言 F 中的做法与 C 中的做法相同 但是在 F 中编程时使用的 最佳实践 是什么 我应该完全避免
  • 在 Blazor 中显示计时器

    我正在尝试在服务器端 Blazor 应用程序中显示倒计时器 我的代码同时使用 F 和 C 语言 该代码在某种程度上可以工作 但计时器永远不会按预期停止 并且计时器显示偶尔不会呈现所有数字 这是我第一次尝试 Blazor 服务器端应用程序 我
  • Async.TryCancelled 不适用于 Async.RunSynchronously

    我尝试创建一个根据用户交互更新 UI 的代理 如果用户单击按钮 则应刷新 GUI 模型的准备需要很长时间 因此希望如果用户单击其他按钮 则取消准备并开始新的准备 到目前为止我所拥有的 open System Threading type p
  • 如何判断 F# 函数是否是纯函数?

    假设我有这两个 F 函数 let sq x x x let tm DateTime Now 显然 sq 是纯的 因为它对于给定的输入总是返回相同的值 而 tm 是不纯的 因为每次调用它时都会返回不同的值 一般来说 有没有一种方法可以确定 F
  • 管道序列中的异常处理

    我正在开发一个基本的 2D CAD 引擎 管道操作符显着改进了我的代码 基本上 有几个函数从空间中的点 x y 开始 并在多次移动操作后计算最终位置 let finalPosition startingPosition gt moveByL
  • F# 编码练习

    我一直在 Visual Studio 2010 中涉足 F 我是一名在 C 和 Java 等面向对象语言方面拥有更多代码 架构设计经验的开发人员 为了扩展我的技能并帮助做出更好的决策 我正在尝试使用不同的语言来做不同的事情 特别是掌握使用函
  • 当两个模式共享“when”子句时,模式匹配不完整

    A 共同的惊喜 https stackoverflow com q 18691622 2314532对于 F 初学者来说 以下事实是不完全匹配 let x y 5 10 match something with when x lt y gt
  • 使用 SqlBulkCopy 和 F# 在 SQL 中导出矩阵

    我想将大量数据从 F 传输到 SQL 表 基本上我的 F 代码创建了一个三列矩阵 UserID ProductID and price 和N行 我想将其 复制 粘贴 到数据库中 我尝试了多种选择 但最终 从 F 传输数据非常慢 10000
  • F# nameof 运算符不是一等函数

    我正在使用 F 4 7
  • Async.StartChild是否存在内存泄漏?

    当我运行以下测试 使用 F 2 0 构建 时 我得到 OutOfMemoryException 在我的系统上大约需要 5 分钟才能达到异常 如果它作为 x86 进程运行 则为 i7 920 6gb ram 但无论如何我们都可以在任务管理器中
  • 如何使用 FLinq 在 F# 中进行外连接?

    问题几乎说明了一切 我有一个如下形式的大 flinq 查询 for alias1 in table1 do for alias2 in table2 do if alias1 Id alias2 foreignId 使用这种形式 如何在这两
  • 在 Deedle 系列中算得上独一无二

    我想对我的数据框中的系列有一个概述 例如 pandas 的唯一值计数 我不知道是否有内置函数可以实现这一点 到目前为止 我已经完成了一个函数来获取不同特征的数量 我可以设法完成这项工作 我的问题只是关于内置功能 let unique s D
  • F# 中的数组初始化

    如何根据给定的记录类型在 F 中创建和初始化数组 假设我想创建一个包含 100 个 record1 记录的数组 e g type record1 value1 string value2 string let myArray Array i
  • F# 检查列表是否为空

    作为 F 新手 我正在尝试实现一个简单的函数 该函数将索引和列表作为参数 然后返回给定索引的列表值 let rec getElementAtIndex index int list a list match index list with

随机推荐

  • 从 Eclipse 推送到 Github 时出现“411 Length required”异常

    我正在 Eclipse 中为一个学校项目开发一个 Android 应用程序 并尝试推送到 Github 它工作了一段时间 然后突然开始告诉我 推送期间发生内部异常 http github com 我的用户名 repo name git 41
  • asp.net:response.redirect 不起作用

    我有一个 aspx 表单 其中有一个组合框 其中包含从数据库表检索的主题 提交按钮 单击该按钮可在网格视图中查看与该主题相关的问题 我通过在按钮单击事件中调用函数 FillGrid 来完成此操作 我还为我的 gridview 更改了 pag
  • 依赖于其他 slib 的静态库是否需要它们的实际“代码”才能工作?

    抱歉 问题标题含糊不清 我只是想确定一些事情 静态库不会与其他静态库链接 对吧 因此 当我编写一个 slib A 它使用另一个 B 的功能时 我所需要提供的只是 B 到 A 的标头 而且只有这些标头 即使 A 实际上使用了 B 的功能 是的
  • 后面代码中的计算

    司机服务费用为 30 美元 用户可以选择是否需要该服务 当他们已经选择汽车和租赁日期时 我将其存储在会话中 Session car1 Label1 Text Session price Label5 Text Session day Dro
  • 比较子列表并合并它们

    我有一个包含很多子列表的列表 这些子列表最初是数字对 所以它看起来像 list 2 3 4 5 7 8 8 9 11 12 14 15 15 16 16 17 17 18 18 19 20 21 我想要的是将子列表的最后一个数字与下一个子列
  • 如何使用 Pony ORM 存储 Python 枚举?

    假设我在这里有这个简单的小 Pony ORM 映射 内置 Enum 类是从 Python 3 4 开始新增的 并向后移植到 2 7 from enum import Enum from pony orm import Database Re
  • Jquery Div 点击隐藏

    我在页面中使用 coda 滑块 在这里查看 http www ndoherty com demos coda slider 1 1 1 http www ndoherty com demos coda slider 1 1 1 单击每个选项
  • 使用 Flask 处理大文件上传

    使用 Flask 处理非常大的文件上传 1 GB 的最佳方法是什么 我的应用程序本质上需要多个文件 为它们分配一个唯一的文件编号 然后根据用户选择的位置将其保存在服务器上 我们如何将文件上传作为后台任务运行 以便用户在 1 小时内不会旋转浏
  • MethodImpl 属性在 .NET 中如何工作?

    我正在研究一些框架代码 System AppDomain GetDynamicDir 方法 这就是汇编程序显示的全部内容 MethodImpl MethodImplOptions InternalCall private extern st
  • “if”语句可以在 bitbucket 管道中使用吗?

    我尝试运行以下步骤 但它不执行 if 步骤 第5行和第6行 我很确定它们应该执行 因为测试的目录不存在 我尝试了多种格式的bash if 但他们都失败了 有没有一种方法可以测试我正在使用的条件 step name Google Cloud
  • 在 R 中从列表创建多个饼图

    我想一次创建多个饼图 我有一个名称列表 1 361 456 745 858 1294 1297 2360 2872 3034 5118 5189 因此第一个饼图应标记为 361 依此类推 然后我有几个列表 其中每个饼图都有值 1 102 9
  • UIScrollView 中的 UITableView - 如何使视图滚动,而不是 TableView 本身滚动?

    想象一下 有一个 UIViewController 里面有一个 UIScrollView 视图的顶部有一个 UIImageView 一些 UILabels 和其他东西 此外 还有一个 UITableView 其内容是动态原型 我附上一张图片
  • Selenium 2 WebDriver 实现无法正确处理可扩展菜单

    我有一个网页 单击一个按钮 例如 EXPAND CONTEXT MENU 内部实现为 href 会导致隐藏的上下文菜单在其下方展开 然后单击上下文菜单中的菜单项 由于 Selenium 2 不允许直接访问隐藏元素 因此我首先单击 EXPAN
  • 在 PostgreSQL 9.6.3 中,percentile_cont 和percentile_disc 都没有计算所需的第 75 个百分位

    使用百分位数函数 但我没有得到所需的输出 我会说 不正确 但这些功能可能按预期工作 而我只是没有正确理解它们 这些是我正在处理的数字 n 32 160000 202800 240000 250000 265000 280000 285000
  • Python 决策树 GraphViz

    我正在尝试使用 scikit learn 实现决策树 然后使用 Graphviz 可视化该树 我认为这是可视化 DT 的标准选择 我正在使用 PyCharm anaconda Python 2 7 和 OS X El Capitan 据我所
  • 如何使用GWT的SimpleEventBus或EventBus?

    我正在开发一些简单的绘图软件 需要在 swing 和 gwt 中实现 在 gwt 方面 我将使用 gwt g2d 作为画布 我希望在这两种实现中使用事件总线来简化一些软件 我的理解是它应该是这样的 实例化EventBus 实例化父控件 接收
  • 在C中提取两个特定字符串之间的字符串

    如何提取两个指定字符串之间的字符串 例如 有没有一种简单的方法可以使用它strtok 或者更简单的东西 编辑 两个指定的字符串是提取的字符串是Extract this 使用搜索第一个子字符串strstr 如果找到 则保存子字符串的数组索引
  • 取消/中止/中断 spring-android Resttemplate 请求

    我在一个专门执行 spring android 请求的线程中使用 spring android 我无法中止从 spring android 发起的请求 例如 getForObject 我尝试过了 到达底层输入流关闭但它完全包裹在spring
  • less.js 惰性工作表加载

    我想知道是否有办法加载单个less https github com cloudhead less js页面加载后的某个时间 这个问题 https stackoverflow com questions 3175013 load less
  • F# 运算符重载奇怪的行为

    假设由于某种奇怪的原因我想要这个功能 let str string 42 所以我可以做这样的事情并得到 42 结果 test val it int 42 这很好 但现在当我这样做时 let a 100 a I get error FS000