如何抽象类型?

时间:2017-09-01 19:06:46

标签: scala types

我实施了可以收集任何类型TList的{​​{1}}。但我发现它不能包含更高阶的类型H。所以我对整个事情进行了复制,并将H[_]添加到了受尊重的地方。

虽然我想到了。如果我需要存储[_]H[_[_]]甚至H[_[_,_]]该怎么办?我应该随时复制代码吗?有没有办法抽象出类型的善意?

1 个答案:

答案 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/