在Scala中键入别名

时间:2014-01-28 04:07:29

标签: scala

阅读Functional Programming 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在函数级别指定。

2 个答案:

答案 0 :(得分:2)

我不确定为什么会引入这种类型的别名 - 这是回到那本书的好理由! :)

然而,意思很简单。 Const具有两个类型参数,其中第二个类型参数无关紧要。我希望它可以在期望具有两个类型参数的类型构造函数的某个地方使用,但实际情况并非如此。

表达式({ type f[x] = Const[M, x] })#f被称为类型lambda ,它在这里(在大多数地方,事实上)用于转换带有两个类型参数的东西, Const,包含一个类型参数的内容!

现在,有趣的是,由于它在Const中的位置,而且MmonoidApplicative的类型参数,因此会忽略所接收的类型参数。定义,使用。

请注意,Applicative需要带有类型参数的内容,此处我们正在使用M,其中Monoid[M]存在。此类M的两个示例是IntString,两者都没有类型参数。

所以,从某种意义上说,我们通过一个技巧来欺骗Applicative,其中忽略了type参数,最终的类型被你想要的任何东西取代,所以你可以拥有Applicative[Int],所以尽管Int没有类型参数。

答案 1 :(得分:0)

Const[M, x]没有任何特殊含义,您可以等效地内联其定义并编写{ type f[x] = M }({ type f[x] = Const[M, x] })#f定义了一个类型级函数。