На информационном ресурсе применяются рекомендательные технологии (информационные технологии предоставления информации на основе сбора, систематизации и анализа сведений, относящихся к предпочтениям пользователей сети "Интернет", находящихся на территории Российской Федерации)

Практически Groovy : Функциональное программирование с помощью использованием замыканий и карринга. Часть 4

Пятизвездочные вычисления

Давайте теперь рассмотрим некоторые приправы к замыканиям. Мы начнем с механизма, с помощью которого можно выразить замыкания, реализующие шаблон вычислений - понятие из области функционального программирования. Примером шаблона вычислений может служить ситуация, в которой вам необходимо преобразовать каждый элемент List одинаковым образом. Поскольку такие шаблоны встречаются очень часто, мы разработали класс, названный Functor, который будет инкапсулировать их как static Closure. В листинге 6 показаны фрагменты кода.


Листинг 6. Функциональный элемент, инкапсулирующий шаблон вычислений

package fp

abstract class Functor {
// arithmetic (binary, left commute and right commute)
public static Closure bMultiply = { x, y -> return x * y }
public static Closure rMultiply = { y, x -> return x * y }
public static Closure lMultiply = { x, y -> return x * y }

// ...
// композиция
public static Closure composition = { f, g, x -> return f(g(x)) }

// списки
public static Closure map =
{ action, list -> return list.collect(action) }

public static Closure apply = { action, list -> list.each(action) }

public static Closure forAll = { predicate, list ->
for(element in list) {
if(predicate(element) == false) {
return false
}
}
return true
}
// ...
}

 

Здесь вы можете увидеть замыкание под названием map, которое не следует путать с интерфейсом Map. У замыкания map есть параметр f, который представляет замыкание, и параметр list, который представляет, как ни удивительно, List. Он возвращает новый List, в котором f накладывается на каждый элемент list. Конечно же, в Groovy уже есть метод collect() для Lists, поэтому мы будем использовать его в нашей программе.

В листинге 7 мы пойдем еще дальше, применив карринг к замыканию map, что даст нам блок, который будет умножать все элементы заданного списка на 12.


Листинг 7. Добавим немного карри и умножим на 12

import fp.*

def twelveTimes = { x -> return 12 * x }
def twelveTimesAll = Functor.map.curry(twelveTimes)
def table = twelveTimesAll([1, 2, 3, 4])
println "table: ${table}"
// table: [12, 24, 36, 48]

 

Это именно то, что мы называем пятизвездочными вычислениями!

наверх