gpt4 book ai didi

types - 在 Ocaml 中重用和扩展定义的类型

转载 作者:行者123 更新时间:2023-12-04 01:37:07 25 4
gpt4 key购买 nike

在 Ocaml 中,是否有一个简单的构造/样式来扩展定义的类型?

说,如果我们有 bool 类型

bool2 = True | False 

现在我们想将它扩展为 3 值逻辑。在 Ocaml 中,是否有比像这样重新定义 bool2 更优雅的方法:
bool3 = True | False | ThirdOne

最佳答案

我建议不要过度使用多态变体。它们在纸上看起来不错,但更灵活的推理和子类型随时都会让你反感。当我使用多态变体时,我会尝试确保每次使用都使用精确的约束类型表达式进行注释。

我建议返回并修改您的旧代码,这似乎很自然。如果您在编写代码时考虑了可扩展性,并且特别避免了 _ -图案上 bool2类型,那么编译器会警告您任何假设只有两个构造函数的地方。编译器对类型修改的反馈非常有用,因为它是使您的程序正确的机械帮助。

这种做事方式当然有一些缺点。其中之一是修改类型定义,然后修改每个用例可能不适用于您通常的编译测试实践:如果您在大型代码库上这样做,那么在您的项目编译之前,您将有很多重要的事情要做再次干净(因此可以进行测试)。你可以将你的修改分成几个补丁到你的版本控制系统,但这意味着一些中间提交状态不会编译,这不是很令人满意。另一种可能性是仅更改这些位置以添加运行时故障 ( | Third_one -> assert false ),然后您就有了可编译的代码,您可以在应用程序测试期间在运行时纠正这些故障。但是我还是觉得静态编译器反馈对代码维护有很好的帮助。

还可以选择将代数数据类型包装在“扩展代数数据类型”中 type bool3 = New | Old of bool2 ,这在您作为 Martin 回答的评论给出的链接中进行了讨论。这可能是在不破坏编译的情况下从一种数据类型转换到另一种数据类型的好方法,但从长远来看,这是痛苦的,尤其是如果您将更多这些扩展堆叠在一起时。

当然,在某些情况下真正需要的是一种通过代码添加而不是代码修改来扩展数据类型的方法,这种方式既静态安全,更易于编译、运行和测试,并且运行效率高——时间。这是 Expression Problem 的一个实例,它们是各种解决方案,多态变体就是其中之一。但是在常见情况下,您不需要仅进行代码添加的额外灵活性,并且不值得相关语言功能的额外复杂性,因此我建议坚持使用普通的旧变体类型,除非它明显是一个巨大的做不同的事情。

PS:关于多态变体及其与表达问题的关系,必填论文是Code reuse through polymorphic variants通过雅克·加里格。

关于types - 在 Ocaml 中重用和扩展定义的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6881652/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com