在什么条件下单位是一种类型?

2023-12-19

在此被标记为重复之前:我知道这个问题与使用单位作为类型参数时有关编译错误的各种问题有关。一些例子:

  • Why is unit用作通用接口参数时,F# 类型系统会以不同方式对待吗? https://stackoverflow.com/q/26296401/4191347
  • F# 接口因单位继承失败 https://stackoverflow.com/q/4485445/4191347
  • 使用单位作为类型参数和重写方法 https://stackoverflow.com/q/10012078/4191347

这些都遇到了与此类似的问题:

type Interface<'a> = 
    abstract member MyFunc : unit -> 'a

let implementingInstance =
  { new Interface<_> with
        member __.MyFunc () = () } // Compiler error!

据我了解,代码无法编译,因为返回单位的函数是用void内部返回,这是 CLI 的额外功能而不是类型。

然而!以下似乎使编译器满意:

type RecordVersion<'a> =
  { MyFunc : unit -> 'a }

let recordInstance =
  { MyFunc = ignore }

如果我替换这也有效ignore与 lambda 或let绑定模块功能。

对我来说,这只是同一件事的另一种表述。 (尽管与 F# 设计指南不一致,该指南建议优先选择接口而不是携带函数的记录类型。)

我对设计由用户指定所使用的行为和类型的 API 感兴趣。因此,我希望避免发生意外和令人困惑的编译器错误。但我不太确定该怎么做。看起来像 F# 的“函数式”函数do将单位视为一种类型。

单位出现此类虚假误差的确切条件是什么?我可以通过打破设计准则并使用函数记录而不是接口来避免 API 中出现这些问题吗? (我不太介意,但我不确定它是否能永远解决问题。)


我相信规则是静态已知具有返回类型的方法unit将被编译为具有返回类型的 .NET 方法void在 .NET 类型系统中(所谓静态已知,是指与泛型方法或泛型类型上使用类型参数作为返回类型的方法相比)。在调用时,编译器隐藏返回方法之间的区别void以及返回 true 的方法unitCLR 级别的值。

您的示例中出现问题是因为正确实现通用接口实际上需要unitCLR 级别的返回类型(并且 CLR 确实关心两者之间的区别)unit and void)。换句话说,当且仅当您想通过静态已知返回的方法覆盖返回泛型类的类型参数的方法时,才会出现问题unit(基于替换unit对于该类型参数)。这里的重写是指在类或接口上实现抽象方法,或者在类上重写非密封方法。

正如 Tamil 指出的,解决此限制的一种方法是确保使用 F# 函数而不是方法。另一种解决方法是在层次结构中引入一个额外的具体类,该类具有虚拟泛型类型参数(假设额外的类是T<'unit>),并返回Unchecked.defaultof<'unit>代替()任何会引起问题的地方。然后你可以派生一个额外的非泛型具体类T from T<unit>一切都会很好。

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

在什么条件下单位是一种类型? 的相关文章

随机推荐

  • Django 选择查询时间差异

    我正在尝试查询 django 中的数据库表 其中包括以下列 id start time end time 我可以直接在查询中获取差异 而不是获取两者的单独值吗 有这样的效果 SELECT id Diff start time end tim
  • 从 shell 脚本在 Firefox 的特定实例中打开新选项卡

    我有一个 shell 脚本 可以创建 Firefox 配置文件 然后使用它们同时打开多个 Firefox 实例 问题是如何在特定的 Firefox 实例中打开 URL 我努力了 firefox CREATEPROFILE test fire
  • 如何自动启动/预热 IIS 中托管的 .net core Web 应用程序

    我有一个 net core 3 1 Web 应用程序 托管在 IIS 上 我无法弄清楚如何在第一个请求之前运行一段代码 我做了以下事情 设置应用程序池的 启动模式 AlwaysRunning 和 空闲超时 0 在网站上设置 预加载已启用 t
  • 有关 SP 和 UDF 的帮助吗?

    我正在尝试通过 MySQL 和 PHP 学习和使用 SP 存储过程 和 UDF 用户定义函数 SP和UDF有什么区别 用途是什么 一段简单的代码在 PHP 和 SQL 中会是什么样子 其中 SP 正在更新 写入或从 MySQL 数据库的表中
  • 为什么应用程序通常不使用 int 在内部表示货币值?

    为什么应用程序通常不使用整数数据类型 例如int or long在 C Java C 中 在内部表示货币值 而不是使用浮点数据类型 float double 或者类似Java的BigDecimal 例如 如果我正在编写一个 Java 应用程
  • 在移动 safari 中是否有使用 onbeforeunload 的替代方法?

    在 mobile safari 中是否有替代方法可以代替 onbeforeunload 我注意到 Google 能够捕获onbeforeunloadmobile safari 中的事件 有谁知道他们是怎么做到的吗 谷歌能够使用他们的 Gma
  • 在heroku上使用node.js开发时钟和workers

    我正在开发一项服务 需要每五分钟为不同的用户分析来自社交媒体网络的数据 我正在使用 node js 开发它 并将在 Heroku 上实现它 根据本文 https devcenter heroku com articles scheduled
  • 用于 mysql 的多个 docker 容器或一个具有多个数据库的实例

    我有一个关于使用 docker 容器的最佳实践的问题 我开发的每个应用程序都需要一个数据库 现在我的问题是我是否应该使用一个内部有多个数据库的 mysql docker 实例 还是应该为每个数据库创建一个实例 我发现为每个数据库创建一个实例
  • 网格布局内的中心列[重复]

    这个问题在这里已经有答案了 我已经开始学习网格系统 显示 网格 并且我有以下代码 但我不知道如何将最后两列 4和5 居中而不在网格模板列中添加更多列并使用网格列中的 column start 和 grid column end 是否可以 H
  • R 中逻辑回归的混淆矩阵

    我想使用我的训练数据和测试数据计算逻辑回归的两个混淆矩阵 logitMod lt glm LoanStatus B data train family binomial link logit 我将预测概率的阈值设置为 0 5 confusi
  • 枚举中定义的项目总数

    如何获取枚举中定义的项目数 您可以使用静态方法Enum GetNames https msdn microsoft com en us library system enum getnames它返回一个数组 表示枚举中所有项目的名称 该数组
  • Java 继承 - this 关键字

    我在网上搜索了类似的问题 但没有找到 所以 在这里发帖 在下面的程序中 为什么 i 的值被打印为100 AFAIK this 指的是当前对象 在本例中是 TestChild 并且类名也被正确打印 但为什么实例变量的值不是200呢 publi
  • 无论旋转如何锁定方向

    我有一个UITabBar嵌入式应用UINavigation对于一些观点 在一个特定的导航视图上 我显示图形 图表 最好将它们显示在landscape就像 iPhone 向左或向右旋转一样 该应用程序的其余部分更适合纵向 因此 我想 强制 包
  • WPF DataGrid 好的教程吗? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 有人可以向我指出互联网上优秀的 WPF DataGrid 教程吗 这些都是很好的 第二个是旧的 但仍然足够好 www wpftutoria
  • 退出命令行程序的首选方式是什么?

    这应该很简单 我只需要简单地退出我的命令行 C 程序 没有什么花哨的东西 我应该使用 Environment Exit or this Close 或者是其他东西 刚刚从Main method Edit 如果您确实失去了流程并希望从应用程序
  • 从 Elasticsearch 返回父数据和子文档

    是否可以通过在 Elasticsearch 查询中搜索子文档来返回父数据 我有两种文档类型 例如书籍和章节 作为父 子相关 非嵌套 我想对子文档运行搜索并返回子文档以及父文档中的一些字段 我试图避免对父级执行单独的查询 Update 我能找
  • 无法通过JAVA连接到HIVE2

    Referring to Hive2 https cwiki apache org confluence display Hive HiveServer2 Clients HiveServer2Clients JDBC created a
  • iPhone / iOS Facebook SDK - 您可以在应用程序内登录并保留登录凭据吗?

    是否可以使用 Facebook iOS SDK 在应用程序内进行身份验证 而不是转到 Safari 并保留这些身份验证凭据以供下次启动应用程序时使用 当我尝试在模拟器中使用演示应用程序时 它总是转到 safari 进行身份验证 这看起来有点
  • WPF UIElement.IsHitTestVisible=false;还在回击吗?

    我从 FrameworkElement 派生一个控件以用作 VisualCollection 的容器 因为我正在使用 DrawingVisuals 进行大量自定义渲染 创建游戏地图 我的容器有几个不同的实例 彼此层叠 我只想命中测试影响当前
  • 在什么条件下单位是一种类型?

    在此被标记为重复之前 我知道这个问题与使用单位作为类型参数时有关编译错误的各种问题有关 一些例子 Why is unit用作通用接口参数时 F 类型系统会以不同方式对待吗 https stackoverflow com q 26296401