在 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 类型,它把自己作为类型参数?这怎么理解?
这里:A: Monoid[A]
the 只是一个变量名,也可以写成a: Monoid[A]
or 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]
where M is an instance of a 的内容,则更具可读性和清晰性Monad
。
添加
而且A: Monoid[A]
根本不是类型注释。类型参数写在方括号中:
def productMonoid [A,B] (params...),所以在这个变体中:
def productMonoid[A: Monoid,B](params...)
YesMonoid[A]
是类型的类型类A
,它被分解为:
def productMonoid[A,B](params...)(implicit val $ev: Monoid[A])
这意味着 thatMonoid
是一个类型构造函数,它接受一个类型A
并Monoid[A]
为$ev
.