泛型中奇怪的嵌套结构类型

时间:2011-11-23 14:18:13

标签: scala scalaz structural-typing

有人可以解释嵌套在泛型中的奇怪的结构类型构造:

implicit def Function1Functor[R]: Functor[({type λ[α]=(R) => α})#λ] = 
  new Functor[({type λ[α]=(R) => α})#λ] ....

此示例来自Scalaz库:Functor.scala

为什么需要这种结构?写起来并不简单:

 implicit def Function1Functor[R,A]: Functor[R =>A]

 implicit def Function1Functor[R,A]: Functor[Function1[R,A]]

1 个答案:

答案 0 :(得分:7)

Functor类型构造函数的签名显示它是使用另一个一元类型构造函数F进行参数化的:

trait Functor[F[_]] extends InvariantFunctor[F]

R => AFunction1[R,A]都不是类型构造函数;他们没有参数。

然而在:

type λ[α] = (R) => α

λ是一个带有一个参数α的类型构造函数。 (R已在此上下文中定义。)

语法({type λ[α]=(R) => α})#λ称为类型lambda。这是一种语法技巧,允许类型别名内联创建并通过投影引用,因此整个表达式可用于需要类型的地方。