6

取自typelevel/kind-projector,有什么区别:

// partially-applied type named "IntOrA"
type IntOrA[A] = Either[Int, A]

// type projection implementing the same type anonymously (without a name).
({type L[A] = Either[Int, A]})#L

?

它们是等价的吗?

4

1 回答 1

4

正如评论中所说,它们几乎是等价的。

假设您有一个 class trait Super[F[_]] {},并且您想在F[x] = Either[Int, x] 可以编写的地方实现它:

type IntOrA[A] = Either[Int, A]
class B extends Super[IntOrA] {}

但如果你想要一个班轮,你可以写:

class B extends Super[({type L[A] = Either[Int, A]})#L] {}

或者使用 kind-projector 你可以这样写:

class B extends Super[λ(A => Either[Int, A])] {}

甚至:

class B extends Super[Either[Int, ?]] {}

除了将其设为单行并使这种类型匿名之外,没有其他区别。

于 2016-03-03T22:59:05.930 回答