此功能的实际用例是什么:
def functionMonoid[A,B](B : Monoid[B]) : Monoid[A => B] =
new Monoid[A => B] {
def op(f : A => B, g : A => B) = a => B.op(f(a) , g(a))
val zero: A => B = a => B.zero
}
这取自书" Scala中的功能编程"
所以
val intAddition = new Monoid[Int] {
def op(a1 : Int, a2 : Int) = a1 + a2
val zero = 0
}
functionMonoid(intAddition)
生成类型:Monoid[A => Int]
答案 0 :(得分:3)
这是一个更接近“实际用例”的例子。假设我们有某种请求类型:
case class Request(...)
我们还有一些可以在网页或其他用户界面上显示的Item
:
case class Item(...)
我们有一些方法可以根据请求生成项目:
def userItems(req: Request): List[Item] = ???
def postItems(req: Request): List[Item] = ???
def adItems(req: Request): List[Item] = ???
我们希望通过这些方法运行请求并汇总这些结果。我们可以这样写:
def allItems(req: Request) = userItems(req) ++ postItems(req) ++ adItems(req)
或者我们可以使用functionMonoid
将Monoid[Request => List[Item]]
放入范围,然后写下:
val allItems = List(userItems _, postItems _, adItems _).suml
这样更好吗?不一定,但它更通用,如果你添加一些可能有价值的要求。