Ни.
Техника, которую вы ищете, называется без присмотра . Мы знаем, что функция представляет логическое следствие:
∀ a b. a -> b
Мы также знаем, что если A и B подразумевают C, то A подразумевает, что B подразумевает C:
∀ a b c. ((a, b) => c) <=> (a => b => c)
Вот доказательство. Посмотрите на таблицу истинности для логического следствия, и вы увидите, что они эквивалентны. Итак, как вы представляете A and B
на уровне типа? Вы используете тип продукта. Произведение двух типов представляет собой пару, то есть тип, значения которого имеют оба типа:
interface P2<A, B> { public A _1(); public B _2(); }
Вы можете сделать то же самое с тройками или кортежами любой арности. Однако будьте осторожны, так как эта линия рассуждений приводит вас к гетерогенным спискам, которые не очень красивы в Java .
Кроме того, ваше представление Map
подходит только для частичных функций . Более того, интерфейс JDK Map
разработан так, чтобы быть изменяемым , и кто бы ни слышал об изменяемой функции? Вот лучшее представление:
interface F<A, B> { public B apply(A a); }