Scala 幺半群类型注释
在《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]它只是一个变量名,也可以
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}