有人可以解释嵌套在泛型中的奇怪的结构类型构造:
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]]
答案 0 :(得分:7)
Functor
类型构造函数的签名显示它是使用另一个一元类型构造函数F
进行参数化的:
trait Functor[F[_]] extends InvariantFunctor[F]
R => A
和Function1[R,A]
都不是类型构造函数;他们没有参数。
然而在:
type λ[α] = (R) => α
λ
是一个带有一个参数α
的类型构造函数。 (R
已在此上下文中定义。)
语法({type λ[α]=(R) => α})#λ
称为类型lambda。这是一种语法技巧,允许类型别名内联创建并通过投影引用,因此整个表达式可用于需要类型的地方。