为啥物化泛型很难与更高种类的类型结合?
Posted
技术标签:
【中文标题】为啥物化泛型很难与更高种类的类型结合?【英文标题】:Why are reified generics hard to combine with higher-kinded types?为什么物化泛型很难与更高种类的类型结合? 【发布时间】:2011-08-05 09:07:16 【问题描述】:有一种观点认为,将具体泛型与更高种类的类型结合起来是一个难题。
现有的语言是否已经成功地结合了这两种类型系统的特性,或者说一般情况下是不可能的?
是否有任何进一步的信息可用于了解该领域迄今为止所做的工作?
【问题讨论】:
c++ 模板算不算? C++ 实际上并没有那么多的运行时反射系统......这个问题更针对现代语言,但我没有反对 C++ 透视的答案。 现代语言 != 动态的,而 c++ 确实有 RTTI(不是反射)。我对这个问题的回答是:看看 c++ 模板有多么混乱 :) 只是好奇。将它们结合起来有什么问题?欢迎提供解释或链接。 @n.m:我试着想出一个好的链接,但我找不到任何实质性的东西,这就是为什么我在这里把它描述为“一个概念”...... 【参考方案1】:对于问题的第二部分:看看Scala programming language,它成功地将来自底层 JVM 的具体泛型与更高种类的类型结合起来。完成这项工作的关键概念是implicit parameters 和Manifests。清单用于将一些已擦除的类型信息移植到运行时,而隐式用于以类似类型类的方式注入清单。博文Manifests: Reified Types 有更多详细信息。
【讨论】:
不,Scala 不支持具体化的泛型。清单只是您需要明确使用的部分解决方法。 我想知道关于 Scala.NET - 什么时候该平台将支持 .NET 泛型(它们还没有 - scala-lang.org/node/10299),也许 Scala 将具有具体化的泛型(至少部分) .不过这还不清楚——.NET 是否支持更高种类的泛型? .NET 代码至少可以使用一阶 Scala 泛型吗? @Cedric,您为什么称其为部分解决方法?你有什么限制?语法开销最小:要将参数A
实现为函数def f[A]
,只需使用上下文绑定:def f[A : Manifest]
。由于A
是一个类型参数,它被具体化为Manifest[A]
类型的运行时值,我将其称为“具体化泛型”。确实没有 JVM 级别的支持,并且原语的专门化不会自动发生——这就是你的意思吗?以上是关于为啥物化泛型很难与更高种类的类型结合?的主要内容,如果未能解决你的问题,请参考以下文章
Kotlin泛型总结 ★ ( 泛型类 | 泛型参数 | 泛型函数 | 多泛型参数 | 泛型类型约束 | 可变参数结合泛型 | out 协变 | in 逆变 | reified 检查泛型参数类型 )