gpt4 book ai didi

F#:不能在签名中隐藏类型缩写?为什么不?

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

在 F# 中,我希望拥有我认为相当标准的抽象数据类型:

// in ADT.fsi
module ADT
type my_Type

// in ADT.fs
module ADT
type my_Type = int

换句话说,模块内部的代码知道 my_Type 是一个 int,但外部的代码不知道。但是,F# 似乎有一个限制,即类型缩写不能被签名隐藏。此代码给出编译器错误,限制描述为 here .

如果 my_Type 是一个可区分的联合,则没有编译器错误。我的问题是,为什么要限制?我似乎记得能够在 SML 和 Ocaml 中做到这一点,此外,在创建抽象数据类型时,这不是很标准的事情吗?

谢谢

最佳答案

正如 Ganesh 所指出的,这是 F# 编译器(和 .NET 运行时)的技术限制,因为在编译期间类型缩写会简单地替换为实际类型。结果,如果你写一个函数:

let foo (a:MyType) : MyType = a + 1

编译器会将其编译为具有以下签名的 .NET 方法:
int foo(int a);

如果缩写的实际类型对图书馆的用户隐藏,那么他们将无法识别 foo函数实际上正在使用 MyType (此信息可能存储在某些特定于 F# 的元数据中,但其他 .NET 语言无法访问...)。

也许这种限制的最佳解决方法是将类型定义为单例区分联合:
type MyType = MT of int
let foo (MT a) = MT(a + 1)

使用这种类型非常方便。它增加了一些开销(在构造类型的值时创建了新对象),但这在大多数情况下应该不是一个大问题。

关于F#:不能在签名中隐藏类型缩写?为什么不?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2855735/

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