[英]Type Aliases in Scala
type Const[M, B] = M
implicit def monoidApplicative[M](M: Monoid[M]) =
new Applicative[({ type f[x] = Const[M, x] })#f] {
def unit[A](a: => A): M = M.zero
def map2[A,B,C](m1: M, m2: M)(f: (A,B) => C): M = M.op(m1,m2)
}
这里作为类型别名的Const[M, x]
是什么意思? 我的理解是,对于正在创建的新Applicative
,它具有[M, B]
类型,其中B
在功能级别指定。
我不确定为什么会引入这种类型的别名 - 这是回到那本书的好理由! :)
但是,意思很简单。 Const
具有两个类型参数,其中第二个类型参数无关紧要。 我希望它可以在某个需要带有两个类型参数的类型构造函数的地方使用,但实际情况并非如此。
表达式({ type f[x] = Const[M, x] })#f
被称为类型lambda ,它在这里(在大多数地方,事实上)用于转换需要两个的东西类型参数, Const
,取一个 Const
一个类型参数的东西!
现在,有趣的是,由于它在Const
位置,被忽略的类型参数被忽略,而是使用M
,它是monoidApplicative
定义的类型参数。
需要注意的是Applicative
预期的东西,需要一个类型参数,在这里我们用一个工作M
,其中Monoid[M]
存在。 这种M
两个例子是Int
和String
,它们都没有类型参数。
因此,从某种意义上说,我们通过一个技巧来欺骗Applicative
,其中类型参数被忽略,最终类型被你想要的任何东西取代,所以你可以有一个Applicative[Int]
,尽管Int
没有类型参数。
Const[M, x]
没有任何特殊含义,你可以等效地内联它的定义并写{ type f[x] = M }
。 ({ type f[x] = Const[M, x] })#f
定义了一个类型级函数。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.