我实施了可以收集任何类型TList
的{{1}}。但我发现它不能包含更高阶的类型H
。所以我对整个事情进行了复制,并将H[_]
添加到了受尊重的地方。
虽然我想到了。如果我需要存储[_]
,H[_[_]]
甚至H[_[_,_]]
该怎么办?我应该随时复制代码吗?有没有办法抽象出类型的善意?
答案 0 :(得分:1)
在Scala中没有rank-2多态性。这意味着方法(以及甚至根本不具有多态性的函数)除了具有通用量词的参数之外不能(所有通用量化都应该在方法级别上完成)。所以我们可以使用像
这样的方法def f[A, B[_], C[_[_]]](x: A, y: B[A], z: C[B]) = ???
但不喜欢(伪代码)
def f(x: [A] A, y: [A1, B[_]] B[A1], z: [B1[_], C[_[_]]] C[B1]) = ???
这也意味着我们不能将类型构造函数替换为期望特定类型的位置(实际上,类型构造函数B[_]
可以被视为[A] B[A]
,C[_[_]]]
为{ {1}}或[B[_]] C[B]
)。
但是为了使类型和类型构造函数更加统一,您可以使用特征类型包装类型构造函数。例如,您可以查看以下编码(它肯定是罗嗦的,您必须始终包装 - 解包类型):
[[A] B[A]] C[B]
一些链接:
https://wiki.haskell.org/Rank-N_types
https://en.wikibooks.org/wiki/Haskell/Polymorphism#Higher_rank_types
https://apocalisp.wordpress.com/2010/07/02/higher-rank-polymorphism-in-scala/