Scala 幺半群类型注释

Scala 幺半群类型注释,scala,monoids,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是以自身为类型参数的幺半群类型?如何理解它?这里:A:Monoid[A]它只是一个变量名,也可以

在《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是以自身为类型参数的幺半群类型?如何理解它?

这里:
A:Monoid[A]
它只是一个变量名,也可以写成
A:Monoid[A]
param1:Monoid[A]
。给出这样的变量名是一种惯例,例如,在大多数情况下,函子的变量名是F-
F:Function[a]
,而单子的变量名是M-
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 PRODUCTMONID[A,B](参数…),因此在此变体中:

def productMonoid[A: Monoid,B](params...)
Monoid[A]
A
类型的类型类,它被分解为:

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

这意味着
Monoid
是一种类型构造函数,它采用类型
a
并为
$ev

构造类型
Monoid[a]
,对我来说,使用小写的“m.point[TC]”或更好的“monad.point[TC]”更可读。我理解被用于数学符号,但它有损于一般的可访问性。我可能同意
monad.point[TC]
变量,标准变量命名约定,但
m
可能是可读的,但不像
x
d
o
等所有一个字母小写名称那样清晰,如果你有成千上万的代码,它不是完全unreadable@Alexlv你说A:Monoid[A]不是类型注释。我读了这里的描述,仍然不明白为什么不是。你能解释一下吗?@rarry这是类型的scala符号
value:Type
类似于Java/C++/C#中的
Type-value
。在您的示例中,只是说值
A
是类型
Monoid[A]
,只是在scala中,类型在变量之后name@Alexlv他们说,
value:Type
是类型注释,就像
A:Monoid[A]
。或者我完全错过了什么。你在哪里看到的签名?在这本书的第190页,我看到了特征幺半群[A]{def op(a1:A,a2:A):A def zero:A}