2015-05-13 2 views
1

Что такое практическое использование случай этой функции:Что такое практическое использование для этой функции?

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]

ответ

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 

Является ли это лучше? Не обязательно, но это более общий, и если вы добавите еще несколько требований, которые могут стать ценными.

Смежные вопросы