上个星期我的一个朋友提出了一个看似无害的Scala语言问题,我没有很好的答案:是否有一种简单的方法来声明属于某种常见types类的东西的集合。 当然在Scala中没有“types类”的一stream概念,所以我们必须从特征和上下文边界(即含义)的angular度来思考这个概念。 具体来说,给定表示typestypes的一些特征T[_]以及范围为T[A] , T[B]和T[C]相应含义的typesA , B和C ,我们想要声明类似List[T[a] forAll { type a }] ,我们可以将A , B和C实例逍遥法外。 这在斯卡拉当然不存在; 去年的一个问题更深入地讨论了这个问题 。 自然的后续问题是“Haskell怎么做?” 那么,GHC特别是有一个types系统扩展称为Impandicative多态性 ,在“Boxytypes”论文中描述。 简而言之,给定一个typesT可以合法地构build一个列表[forall a. T a => a] [forall a. T a => a] 。 给定这种forms的声明,编译器会做一些字典传递的魔法,让我们在运行时保留对应于列表中每个值types的types实例。 事情是,“字典传递魔法”听起来很像“vtables”。 在像Scala这样的面向对象语言中,子types比“Boxytypes”方法更简单,更自然。 如果我们的A , B和C都扩展特性T ,那么我们可以简单地声明List[T]并且感到高兴。 同样,正如Miles在下面的评论中所指出的那样,如果它们都扩展了T1 , T2和T3特征,那么我可以使用List[T1 with T2 with T3]作为Haskell的等价物[forall a. (T1 a, T2 a, T3 […]