这个函数的实际用例是什么?

时间:2015-05-13 22:00:01

标签: scala

此功能的实际用例是什么:

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]

1 个答案:

答案 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)

或者我们可以使用functionMonoidMonoid[Request => List[Item]]放入范围,然后写下:

val allItems = List(userItems _, postItems _, adItems _).suml

这样更好吗?不一定,但它更通用,如果你添加一些可能有价值的要求。