此功能的实际用例是什么:
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]
这是一个更接近“实际用例”的示例。假设我们有某种请求类型:
case class Request(...)
我们还提供了某种Item
可以显示在网页或其他UI上的信息:
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
这是否更好?不一定,但这是更通用的,如果您添加更多可能变得有价值的需求。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句