Monoid类型注释

时间:2013-10-03 08:02:23

标签: scala monoids

在Scala中的函数式编程一书中,我看到以下签名:

def productMonoid[A,B](A: Monoid[A], B: Monoid[B]): Monoid[(A,B)]

描述说:

if types A and B are monoids, then the tuple type (A, B) is also a monoid

我很难理解以下部分:

A: Monoid[A]

A是Monoid类型,它将自身作为类型参数?怎么理解?

1 个答案:

答案 0 :(得分:3)

此处:A: Monoid[A]这只是一个变量名称,也可以写为a: Monoid[A]param1: Monoid[A]。给出这样的变量名称有点常规,例如在大多数情况下,仿函数的变量名是F - F: Function[A]而M是Monad - M: Monad[A]

abstract class SomeClass[TC[_], A](param: TC[A]) {
  implicit val M: Monad[TC]
  ... // other code
}

如果您看到类似M.point[TC]的内容,其中M是Monad的实例,则更具可读性和清晰度。

<强>加

A: Monoid[A]根本不是类型注释。类型参数写在方括号中:

def productMonoid [A,B] (params ...),所以在此变体中:

def productMonoid[A: Monoid,B](params...)

Monoid[A]A类型的类型类,它已被删除:

def productMonoid[A,B](params...)(implicit val $ev: Monoid[A])

这意味着Monoid是一个类型构造函数,它使用A类型并为Monoid[A]构建类型$ev