2

在 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 类型,它把自己作为类型参数?这怎么理解?

4

1 回答 1

3

这里: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是一个类型构造函数,它接受一个类型AMonoid[A]$ev.

于 2013-10-03T08:14:46.913 回答