【发布时间】:2018-12-10 11:31:21
【问题描述】:
Haskell 编程语言有一个newtypes 的概念:如果我写newtype Foo = Foo (Bar),那么就会创建一个与Bar 同构的新类型Foo,即两者之间存在双射转换。此构造的属性是:
- 这两种类型是完全独立的(即编译器不允许您在不使用显式转换的情况下使用其中一种类型)。
- 它们共享相同的表示。特别是,转换函数的运行时成本为零,并在堆上返回“相同的对象”。
- 只能在此类类型之间进行转换,不能误用,即保留类型安全性。
还有哪些其他编程语言提供此功能?
当仅与记录访问器/构造器一起使用时,一个示例似乎是 C 中的单值结构。当与强制转换一起使用时,无效的候选对象将是 C 中的单值结构,因为编译器不会检查强制转换,或者在 Java 中具有单个成员的对象,因为它们不会共享相同的表示。
相关问题:Does F# have 'newtype' of Haskell?(否)和Does D have 'newtype'?(不再)。
【问题讨论】:
-
我不太明白你关于为什么单值 C 结构不符合条件的论点。显然,如果您使用强制转换,您会失去类型安全性,但如果您只使用记录访问器和构造函数(就像您在 Haskell 中所做的那样),则不会。任何体面的编译器都会将它们内联到相当于强制转换的东西,就像 GHC 对
newtype所做的那样。 -
leftroundabout:你说得有道理;修改了我的问题。
-
@leftaroundabout 你的表述“任何体面的编译器”让我假设 C 编译器不需要这样做?
标签: haskell functional-programming programming-languages newtype