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 - 多态打印和类型丢失 的相关文章

  • OCaml 文字负数?

    我在学 这是我觉得奇怪的事情 let test treeways x match x with when x lt 0 gt 1 when x gt 0 gt 1 gt 0 如果我这样称呼它 test threeways 10 我会得到类型
  • Java 泛型 - 重写抽象方法并具有子类的返回类型

    我正在尝试创建一个设置 其中一组子类覆盖超类 这个超类包含一个抽象方法 理想情况下 其返回类型是调用该方法的对象的返回类型 这样它的有效行为如下 public abstract class SuperClass public abstrac
  • 在 C 中如何将一种类型的变量更改为另一种类型?

    我要做 int main bla bla bla void onetype switch USER INPUT TYPE CASE CONVERT TO CHAR convert onetype VOID TO CHAR gt gt gt
  • 什么时候应该使用双精度而不是十进制?

    我可以说出使用的三个优点double or float 代替decimal 使用更少的内存 速度更快 因为处理器本身支持浮点数学运算 可以表示更大范围的数字 但这些优点似乎只适用于计算密集型操作 例如建模软件中的操作 当然 当需要精度时 例
  • 为什么这些类型参数不符合类型细化?

    为什么此 Scala 代码无法进行类型检查 trait T type A trait GenFoo A0 S lt T type A A0 trait Foo S lt T extends GenFoo S A S 我不明白为什么 类型参数
  • 将 Array Obj-c 的内容转储到控制台

    我寻找了如何转储和数组到我主要找到的控制台 for id name in arrayStuff NSLog Array contents d name 我尝试了不同的格式化程序 d g 等 它们确实打印了不同的内容 但不是我 99 确信被输
  • 我可以从命令行打印 html 文件(带有图像、css)吗?

    我想从脚本中打印带有图像的样式化 html 页面 谁能建议一个开源解决方案 我使用的是 Linux Ubuntu 8 04 但也对其他操作系统的解决方案感兴趣 你可以给html2ps http user it uu se jan html2
  • 如何处理最终字符串?

    制作有什么好处吗String as final或者我们可以做String as final 我的理解是 由于 String 是不可变的 因此没有必要将其设为最终的 这是正确的还是人们想要的情况String as Final Code pri
  • 使用fold_left/right反转OCaml中的列表

    更新 解决方案 感谢 jacobm 的帮助 我想出了一个解决方案 Folding Recursion let reverse list 3 theList List fold left fun element recursive call
  • 是否有一种类型安全的方法可以将较大的对象减少()为打字稿中的新类型?

    我有一个表示数据库查询结果的数据结构 它是一个具有许多属性的对象 所有属性都是标量 在我的例子中 都是字符串或数字 我想提取这些属性的一部分并填充一个具有已定义形状的新对象 const input Record
  • python numpy:更改 numpy 矩阵的列类型

    我有一个 numpy 矩阵 X 我尝试使用以下代码更改第 1 列的数据类型 X 1 astype str print type X 0 1 但我得到了以下结果
  • 将 C# 数据类型参数传递给用 C++ 编写的 dll?

    仍在解决从这里开始的问题从 C 调用 C dll 函数 结构体 字符串和 wchar t 数组 https stackoverflow com questions 680066 calling c dll function from c o
  • 具有通用返回类型的可选函数参数

    您将如何实现通过正则表达式解析某些输入并将创建的字符串转换为其他类型的类 我的做法是 class ARegex T regex Regex reform Option String gt T def findFirst input Stri
  • VB.NET 中的类型比较

    如何比较 VB NET 中的类型数据类型 我的代码 Private Function Equal ByVal parameter As String ByVal paramenterName As String ByVal dataType
  • 如何强制 OCaml 推断出更通用的类型?

    我想定义一个接受可选参数的函数 该参数是一个函数 a gt b 默认值应该是identity 实际上就是 a gt a 但我认为没有理由它不应该与更通用的兼容 a gt b 当我尝试时 let optional apply f i matc
  • 引用Scala中内部类的类型

    下面的代码尝试模仿DSL 的多态嵌入 http www daimi au dk ko papers gpce50 hofer pdf 而不是给出行为Inner 它被编码在useInner其封闭类的方法 我添加了enclosing方法 以便用
  • Agda 中的类型层次结构

    我试图弄清楚类型层次结构在 Agda 中是如何工作的 假设我定义了一个集合类型X X Set 然后继续构建归纳类型 data Y X gt Set where 是什么类型的X gt Set 是设置还是类型 谢谢你 那么 为什么不问问 Agd
  • 使用 PDFSharp 打印 PDF

    我有以下代码 using System using System Diagnostics using System IO using PdfSharp Pdf Printing namespace PrintPdfFile class Pr
  • C++dynamic_cast vs 在静态枚举中存储对象类型?

    我正在为一个框架开发一个大的类层次结构 完成后将需要大量的类型转换 我的问题是 放入一个使用枚举来存储层次结构中所有对象类型的静态成员是多么愚蠢的想法 让每个类的成员都是静态的不会增加实例化对象的大小 并且会提供一种 可能 比dynamic
  • Maven:无法在 OS X 上找到 java.lang 问题

    当我尝试时遇到以下问题mvn clean install显然它无法找到运行时 jar 但我需要做什么 错误日志 ERROR COMPILATION ERROR INFO ERROR Failure executing javac but c

随机推荐

  • .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