Ocaml - 多态打印和类型丢失

2024-01-31

OCaml中有print_int、print_endline、Printf等一系列函数。我不能做这样的事情:

let n = 10 in
print n;; (* And I haven't to change `print` in case type of `n` changed *)

这就是 Java、C#、Python 等中的多态打印。相反,我们有类似 C 语言的类型,由程序员显式定义。所以我认为 OCaml 在编译期间丢失了类型信息,并且在运行时没有它,对吧?这就是为什么我们还需要 mli 文件的原因?

EDIT:我厌倦了编写 *print_listi*、*print_list_tuple2i* ​​等函数。我怎样才能做得更好?


你是对的:OCaml 在运行时丢弃类型,因此无法区分你的 10 是否真的是 int 或第 10 个 0 元变体构造函数。构造函数名称都不可用,因此无法打印数据。

而且,OCaml的多态性是参数化的。您不能定义根据类型不同而工作方式不同的函数。

对此的一种部分解决方法是使用 CamlP4 自动生成数据类型的打印机函数。但是,你仍然不可能拥有适用于所有情况的“多魔法”印刷品。您必须手动组合打印机,例如 print_list (print_option print_int)。

几年前我已经扩展了 OCaml 来拥有这样的多态打印(和其他好的东西)。它称为 GCaml。但维护时间不长。

mli文件与此无关。它们用于编写模块签名,为模块用户隐藏更简单接口的实现。

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

Ocaml - 多态打印和类型丢失 的相关文章

  • lxml 的类型提示?

    Python 新手 具有静态类型语言背景 我想要类型提示https lxml de https lxml de只是为了便于开发 mypy 标记问题并建议方法会很好 据我所知 这是一个 python 2 0 模块 没有类型 目前我用过http
  • 在 Swift 3 中打印

    我想知道这两种在 Swift 中打印对象的方法有什么不同 结果看起来是一样的 var myName String yohoo print My name is myName print My name is myName 功能上几乎没有区别
  • Python:检查对象是否是字符串列表

    如何检查一个对象是否是字符串列表 我只能检查对象是否是字符串 def checktype obj if isinstance obj str print It s a string obj1 foo bar bar black sheet
  • Oracle中“NUMBER”和“NUMBER(*,0)”相同吗?

    在甲骨文中文档 http docs oracle com cd B28359 01 server 111 b28318 datatype htm i22289据说 数字 精度 小数位数 如果未指定精度 则该列将存储给定的值 如果 未指定比例
  • 表达式“ap zip tail”如何工作

    我想知道怎么写f x zip x tail x 点免费 所以我使用了pointfree程序 结果是f ap zip tail ap作为 Control Monad 的函数 我不明白点自由定义是如何工作的 如果我能从类型的角度去理解的话 希望
  • 如何使用可以是多种类型的变量?

    我经常使用以下方法将对象链接到其父对象 Video parent 有时我的对象可以是不同对象类型的子对象 我也是如此 int parentType Video parentVideo if parent VIDEO then this wi
  • 为什么不允许接口作为注释成员?

    考虑这段代码 Retention RetentionPolicy RUNTIME Target ElementType METHOD public interface Bar Foo foo default FooImpl FooConst
  • 在android中的webview中运行时更改URL

    我创建了一个小程序 可以在 webview 中加载特定网站 我想密切关注 URL 如果 URL 包含 xxx 单词 那么它应该导航到另一个页面 例如 如果我设置 www example com 我现在可以导航到 www example co
  • 如何在wpf中打印屏幕截图

    首先我英语说得不太流利 反正 我正在尝试这样做 然而这还不是第三天 我现在正在做的是屏幕捕获后的程序屏幕打印 我参考这段代码 https social msdn microsoft com Forums windows en US 0623
  • Parsec 函数“parse”和类“Stream”的类型签名

    约束条件是什么 Stream s Identity t 下面的类型声明是什么意思 parse Stream s Identity t gt Parsec s a gt SourceName gt s gt Either ParseError
  • 为什么使用 Win32_PrintJob/C# 打印 N-Up 总页数错误?

    我正在用 C 编写一个程序 用于在打印时暂停并获取总页数 这是主要代码 string wql SELECT FROM Win32 PrintJob ManagementObjectCollection mos Dictionary
  • 非托管 C++ 中的默认打印机

    我正在寻找一种使用非托管 C 查找 Windows 默认打印机名称的方法 找到了大量 NET 示例 但非托管没有成功 谢谢 以下是如何获取当前打印机和默认打印机的列表 如果有一台设置为默认打印机 另请注意 如果用户没有打印机或未将打印机名称
  • 如何在运行时更改android应用程序名称和图标?

    安装 Android 应用程序后 当您按下应用程序中的按钮时 是否可以动态更改应用程序图标和名称 在运行时 这是到目前为止的代码 getPackageManager setComponentEnabledSetting new Compon
  • 是什么导致 WPF 打印机输出被光栅化?

    我在 WPF 中遇到了许多打印问题 其中正在打印的特定项目组合会突然触发打印机输出的光栅化 导致打印机输出丑陋且庞大 并可能导致打印每页需要 30 秒 我发现在控件上设置任何级别的不透明度之类的事情通常会触发此问题 我忘记了它还有什么作用
  • OCaml 是否具有通过引用传递的能力?

    在 C 中 程序可以向函数传递引用 而不是值 void incrementInt int x x OCaml 是否提供相同的功能 不 没有严格的等价物 有refs 它们就像指向新分配的内存的指针 还有其他复合数据类型的记录 数组 对象和值
  • Haskell 中的多态函数作为参数

    我有一个带有两个构造函数的 ADT 一个包裹着一个Double和一个包裹着Integer 我想创建一个函数 它采用一元函数Numtypeclass 并返回一个函数 该函数将该一元函数应用于我的 ADT 的内容 我试过这个 data X Y
  • Python Selenium 打印另存为 PDF 等待文件名输入

    我正在尝试通过打印对话框将网站另存为 PDF 我的代码允许我另存为pdf 但要求我输入文件名 我不知道如何将文件名传递到弹出框 附上我的代码 import time from selenium import webdriver import
  • 如何将pdf页面设置设置为打印属性对话框?

    大家好 我想知道如何设置 pdf 页面设置到打印属性对话框 例如 如果我的 PDF 页面设置为横向 则布局会自动显示横向而不是纵向 如果我的 PDF 页面设置为纵向 则布局会自动显示纵向 我在这个主题上做了很多研发 但没有找到任何满意的链接
  • Java中有默认的数字类型吗

    如果我写这样的东西 System out println 18 哪种类型有 18 是吗int or byte 或者它还没有类型 它不能是 int 因为这样的东西是正确的 byte b 3 这是不正确的 int i 3 byte bb i e
  • 在一个平台上,对于所有数据类型,所有数据指针的大小是否相同? [复制]

    这个问题在这里已经有答案了 Are char int long 甚至long long 大小相同 在给定平台上 不能保证它们的大小相同 尽管在我有使用经验的平台上它们通常是相同的 C 2011 在线草稿 http www open std

随机推荐

  • .NET 4.5 中等待完成后 HttpContext.Current 为 null

    我在 NET 4 5 Web 应用程序中定义了以下简单的 WCF 服务 ServiceContract public interface IService1 OperationContract WebGet UriTemplate json
  • 将猪结果存储到本地文件

    我运行pig脚本做了一些夸张的操作 并且输出大小非常小 现在我跑 hadoop fs getmerge 分别地 有什么办法让pig脚本将结果直接转储到本地文件中吗 如果您不担心将所有内容合并到一个文件中 那么您可以在 grunt 中使用 c
  • 如何使用OpenCV提高Grabcut算法的准确性?

    我正在使用 OpenCV 的抓取算法在 android 中对图像进行背景减除 算法运行良好 但给出的结果不准确 例如 我的输入图像是 输出图像如下所示 那么我们如何提高Grabcut算法的准确性呢 P S 由于声誉低而没有上传示例图像 对此
  • 将实例添加到 MEF 容器

    如何将已创建的实例添加到 MEF 容器 目录中以在解析导入时使用 我想要 Unity 提供的功能RegisterInstance其容器上的方法 您可以使用撰写导出值 http msdn microsoft com en us library
  • 内部有 Any() 的嵌套 for 循环的 Big O 是什么?

    这个问题基本上是我的后续问题在这里回答 https stackoverflow com a 38332524 542251 我真的很想说这个算法的大O是什么 但我不确定我的说法是否完全正确 所以给定两个数组 B Hello World He
  • MSBuild 条件 IsDebug

    如何确定项目是否在 MSBuild targets 文件中以调试 或发布 模式构建 并使用此信息作为另一个属性的条件 就像是
  • 在 CSV 行末尾查找未终止的引用字段

    无论如何 我们是否可以找到 CSV 行末尾未终止的引用字段 的行号 我正在尝试在 java 中读取 CSV 文件 但出现错误很可能是因为 有一个报价已打开但未关闭 我正在使用 deeplearning4j datavec 的 CSVReco
  • AES 加密在 iOS 和 Android 中产生不同的结果

    尝试在 Android 和 iOS 中使用带有 CBC 和 PKCS7 填充的 AES128 算法来加密示例数据 但结果不同 安卓代码 private static final byte KEY 0x01 0x02 0x03 0x04 0x
  • Html Agility Pack - 按 ID 或类删除标签

    这是我的简化 HTML div div div div div div class divToRemove div div class divToRemove div div 我想删除 ID 或类名为 divToRemove 的 div 然
  • R 错误:names() 应用于非向量

    我有一段代码 仅在第一次运行时才会产生错误 奇怪的是 如果我第二次运行它 我不会得到任何错误 疯狂的定义 此外 错误并不总是出现在同一位置 我的意思是 如果我添加几行注释 错误消息将在注释之后打印 而不是在特定指令之后打印 我无法提供可重现
  • RADIUS 和 EAP 如何以及在何处结合?

    我一直在阅读一些有关身份验证方法的内容 我读过有关 RADIUS 和 EAP 的内容 我只是不明白它们之间的联系 RADIUS是一种身份验证协议 它使用共享密钥和其他方法进行安全身份验证 而EAP更多的是一种通用协议 我知道 EAP 本身不
  • 使用 Roslyn 和 .NET Core 生成 C# 代码

    有没有办法使用 Roslyn 和 NET Core 生成 C 代码 我尝试使用 Microsoft CodeAnalysis CSharp 包中的 SyntaxFactory 我目前遇到的问题是从中获取正确格式的代码作为文本 到目前为止我见
  • 如何在带有延迟加载的primeng Turbotable中使用过滤器?

    我正在使用带有延迟加载选项的 PrimeNG TurboTable 来显示数据库中的数据 这很完美 现在 我需要向发送到服务器的请求添加一些过滤器 怎么做 这是有效的代码
  • 如何在 .net 中的另一台计算机上运行进程

    假设我的网络上的多台计算机上有一个名为 MyService 的 Windows 服务和一个名为 MyEXE 的可执行文件 是否可以 从 MyService 中 在不同 同一台计算机上启动 MyEXE 的多个实例 让它执行某些任务并向 MyS
  • Angular js:动态表达式不适用于 ng-switch-when

    我有一个基于 switch 的 div 但 switch 有一个布尔变量 但该值将根据 row id 进行评估 有人可以告诉我我在这里做错了什么吗 div a href getName row a a href getName row a
  • 使用按钮或链接文本在多个 Highcharts 之间切换

    我最初想在我的网站上以并排配置方式显示大量高图表 现在 我一直尝试在网站上仅包含一个高图表 并为观众提供使用按钮在它们之间切换的选项 我在这方面完全是新手 所以我在做这件事时遇到了一些问题 我一直在尝试使用以下小提琴 http jsfidd
  • Fortran 中结果变量的用途是什么?

    在 Fortran 中 有两种从函数返回结果的标准方法 第一个是将函数的返回值分配给函数名称 function foo integer foo foo 10 end function foo Fortran 90 中标准化的第二种形式是通过
  • jquery bxslider 不适用于 ng 视图内的模板

    我在我的第一个 Angular 项目中使用 jquery bxslider 它不适用于 ng 视图内的模板 如果在没有 ng view 的情况下使用这个 则意味着它正在工作 这是我的 HTML 页面
  • 如何在 Android 中重命名现有的共享首选项文件

    我是安卓新手 我创建了 SharedPreferences 来存储播放列表名称和播放列表中的歌曲名称 现在我必须重命名播放列表 另一个是 如何删除 SharedPreferences 文件 即PlaylistName xml 当我删除播放列
  • Ocaml - 多态打印和类型丢失

    OCaml中有print int print endline Printf等一系列函数 我不能做这样的事情 let n 10 in print n And I haven t to change print in case type of