在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类型,它将自身作为类型参数?怎么理解?
答案 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
。