функциональный Java: что это за вещь P1? - PullRequest
7 голосов
/ 24 апреля 2011

Я смотрю на функциональную Java и не понимаю, что такое P1 .Может ли кто-нибудь объяснить и / или привести пример?

(справочная информация: я знаю, что такое карри и замыкания)

Ответы [ 3 ]

6 голосов
/ 24 апреля 2011

Это взято прямо из проекта Google Code для Функциональная Java :

Типы соединений (кортежи) - это изделия других типов. Предлагаются произведения арностей 1-8 (ф.п.1 - ф.п.8). Они полезны, когда вы хотите вернуть более одного значения из функции, или когда вы хотите принять несколько значений при реализации метода интерфейса, который принимает только один аргумент. Они также могут использоваться для получения продуктов по другим типам данных, таким как списки (функция zip).
// Regular Java
public Integer albuquerqueToLA(Map<String, Map<String, Integer>> map) {
  Map m = map.get("Albuquerque");
  if (m != null)
     return m.get("Los Angeles"); // May return null.
}

// Functional Java with product and option types.
public Option<Integer> albuquerqueToLA(TreeMap<P2<String, String>, Integer>() map) {
  return m.get(p("Albuquerque", "Los Angeles"));
}
4 голосов
/ 25 апреля 2011

ага, нашел это сообщение :

>>> Also, P1 is potentially lazy. We use it for the implementation of
>>> Stream, for example. 

Так что вместо непосредственного возврата типа T я могу получить что-то, что возвращает P1<T>, очень похоже наGoogle Collections Supplier<T> и позволяет ему вычислять содержащееся в нем значение только при вызове P1._1().

(да, это сообщение в блоге Обработка отложенных ошибок в Java было тоже интересно .....)

4 голосов
/ 25 апреля 2011

P1 выглядит как 1-элементный, тривиальный тип продукта . В Хаскеле это будет записано как:

data P1 a = P1 a

(тип Identity в Хаскеле).

то есть это контейнер с другим типом a.

Этот тип также реализует простейшую монаду Identity, которая позволяет непрозрачно применять функции к содержимому поля.

В вычислительном отношении нет смысла использовать монаду Identity вместо гораздо более простого действия простого применения функций к своим аргументам, однако это может быть полезно при проектировании стеков преобразователей монад.

Реализация монады тождественной монады тривиальна,

return a     = P1 a
(P1 m) >>= k = k m

Как видите, это просто приложение функции.

...