F# 中的命令式多态性

2024-01-30

OCaml 的 Hindley-Milner 类型系统不允许命令式多态性(类似于 System-F),除非通过最近对记录类型的扩展。这同样适用于 F#。

然而,有时需要将用命令式多态性(例如 Coq)编写的程序翻译成此类语言。 Coq 的 OCaml 提取器的解决方案是(谨慎地)使用Obj.magic,这是一种通用的不安全强制转换。这有效是因为

  • 在 OCaml 的运行时系统中,所有值都具有相同的大小,无论其类型如何(32 或 64 位,具体取决于体系结构)
  • 应用于原始程序的更复杂的类型系统保证了类型安全。

在 F# 中是否可以做类似的事情?


如果您能详细说明您想要实现的目标,将会很有帮助。一些命令式用法(例如来自 Haskell wiki)使用带有单个通用方法的附加名义类型相对容易编码:

type IForallList =
    abstract Apply : 'a list -> 'a list

let f = function
| Some(g : IForallList) -> Some(g.Apply [3], g.Apply ("hello" |> Seq.toList))
| None -> None

let rev = { new IForallList with member __.Apply(l) = List.rev l }

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

F# 中的命令式多态性 的相关文章

随机推荐

  • Laravel/dingo API 上的 Transformer 使用

    我正在创建一组 REST API 以便使用 Laravel 存储库模式向我的移动应用程序公开 我使用 dingo 作为 REST 框架 我对如何使用变压器来完成 API 的响应感到困惑 我有以下控制器功能 if user Authentic
  • 如何更改/设置 Postgres 中的块大小?有没有什么文件可以进行配置?

    我正在寻找 postgres 中的 BLOCKSIZE 配置 我想知道有没有办法更改 设置该值 您需要从源代码编译 postgres 并在配置步骤中传递大小为 kB 的附加标志 configure with blocksize BLOCKS
  • Java 反射:“java.lang.NoSuchMethodException”

    我试图使用反射从另一个类获取该方法 但由于某种原因 它一直给我一个没有这样的方法的异常 这些是我使用的类 脚本表类 for Class
  • git 存储库中二进制文件的高效存储

    我想要一个主要由二进制文件组成的 git 存储库 我需要跟踪存储库中已更改 添加和删除的文件 但我不希望 git 对文件本身的内容进行版本控制 换句话说 我只需要 git 来跟踪更改 更改日志 而不需要内容 这对于 git 来说是可能的吗
  • 重置选择器无法正确重置表数据

    我有一个带有多个选项的选择器和一个重置按钮 单击该按钮时必须将选择器重置为第一个选项 单击该按钮时将重置选择器 但表中的数据不会更改 这些是选择器和按钮
  • 用于在 Android 版 Firefox 中激活阅读器模式的书签

    最近 Android 上的 Firefox 发生了变化 这使得我无法使用向阅读列表添加内容并从那里打开它以强制页面进入阅读器模式的变通办法 考虑到这一点 我试图找到并最终制作一个小书签 以强制页面进入阅读器模式 到目前为止 我发现通过在 u
  • 如何使用 Google Apps 脚本替换电子表格中的文本?

    我想在电子表格中找到指定的文本并将其替换为其他单词 我这样尝试过 sheet SpreadsheetApp getActiveSheet sheet replaceText ga sessions Sessions 然后它说 Cannot
  • 后端使用Vite

    我们使用 Vite 作为前端 在 SvelteKit 内 它可以很好地创建 SSR 和前端代码 我特别喜欢通过 esbuild 预捆绑第 3 方软件包 有人可以告诉我是否可以将 Vite 捆绑管道用于仅后端项目 基于 koa 的 Nodej
  • iOS Swift Mi Scale 2 蓝牙称重

    我正在编写一个可以从小米米秤2获取体重测量的应用程序 读取所有可用的uuid后 只有 181B 连接 特别是 2A9C 特征 蓝牙GATT中的体重测量 收到通知 值数据为 2 164 178 7 1 1 2 58 56 253 255 24
  • 在 php-fpm/mod_fastcgi 中使用 mod_headers 时出现问题

    我正在尝试添加HSTS http en wikipedia org wiki HTTP Strict Transport Security我的应用程序中每个响应的标题 我的第一个想法是使用 mod headers 我将此指令放置在文档根目录
  • WCF REST 服务 POST 在 IIS 上返回 404 Not Found

    我在Win8上用VS2012创建了一个WCF服务 如果我通过 VS localhost port 启动服务 我就可以执行 GET 和 POST 操作 当我部署到同一台计算机上的 IIS 时 只有 GET 有效 POST 返回 404 Not
  • ListView:通过 Filterable 进行过滤与使用新 URI 重新启动 CursorLoader

    The ListView实现过滤内容的方法 您能详细说明一下什么时候应该使用它吗 据我了解 这种过滤适用于基于数组的适配器 所有数据都已经在内存中 这样 过滤器只是帮助跳过不应该显示的数据 然而 如果ListView与游标适配器 SQLit
  • 清单合并失败:uses-sdk:minSdkVersion 8 不能更小

    问题是 Error Execution failed for task app processDebugManifest 清单合并失败 uses sdk minSdkVersion 8 不能小于库 com android support s
  • 运行 showdown.js 服务器端将 Markdown 转换为 HTML(在 PHP 中)

    我正在尝试在我的网站上实现 WMD 并且想知道如何运行 showdown js 服务器端以将 markdown 转换为 HTML 为了将两者存储在数据库中 我正在使用 PHP 任何提示都会有帮助 之前从未从 php 运行过任何类型的 js
  • 升级到 AngularDart 0.13.0 并收到有关路由和 di 的错误

    我升级到 AngularDart 0 13 0 但收到以下错误 使用新的路由模块初始化 RoutingModule 的正确方法是什么di包2 0 1 In main dart I have class RoutingModule exten
  • 运行时异常 (Chromecast)

    我尝试配置 Chromecast 但收到 RuntimeException 并且不明白原因 Fabric 有日志 致命异常 java lang RuntimeException 无法启动活动 ComponentInfo activity T
  • 在 Google App Engine 上使用 Python 验证 Android 应用内购买消息的签名

    Android 开发人员网站上的示例应用程序使用 java 代码验证购买 json 有没有人有幸弄清楚如何用 python 验证购买 特别是在 GAE 中 以下是android应用内计费的相关摘录示例程序 http developer an
  • 模式浏览器不显示我在 Solr 中添加到 schema.xml 中的字段

    我在 solr v5 1 中创建的名为 Core3 的核心的 schema xml 中添加了一些字段 我不是指示例文件夹 而是使用 服务器 文件夹来运行 solr 服务器并创建 solr 核心 我使用 bin 文件夹中提供的 solr cr
  • MVVM Light WPF 打开新窗口

    我是 MVVM 新手 正在使用 MVVM Light 学习它 我在 wpf 中有一个带有登录窗口的应用程序 当用户输入正确的凭据时 登录窗口应关闭并应打开一个新的主窗口 登录部分已经可以工作 但是如何打开一个新窗口并关闭当前窗口 login
  • F# 中的命令式多态性

    OCaml 的 Hindley Milner 类型系统不允许命令式多态性 类似于 System F 除非通过最近对记录类型的扩展 这同样适用于 F 然而 有时需要将用命令式多态性 例如 Coq 编写的程序翻译成此类语言 Coq 的 OCam