Я пытаюсь изучить функциональное программирование с помощью Haskell, но я изо всех сил пытаюсь понять некоторые концепции. Я подумал, что было бы неплохо перевести некоторые из этих концепций на Java, так как это язык, с которым я чувствую себя наиболее комфортно.
У меня есть следующий интерфейс Applicative<A>
:
public interface Applicative<A>
{
public <B> Applicative<B> pure (B value);
public <B> Applicative<B> apply (Applicative<Function<A, B>> applicative);
public <B, C> Function<Applicative<B>, Applicative<C>> liftA2 (
Function<A, Function<B, C>> function);
}
Допустим, у меня есть реализация интерфейса ListApplicative<A>
. Он расширяет ArrayList<A>
и реализует Applicative<A>
.
Вопрос: как мне превратить все Applicative<?>
в ListApplicative<?>
? Это вообще возможно? Есть ли какие-нибудь хаки, чтобы сделать это?
public class ListApplicative<A> extends ArrayList<A> implements Applicative<A>
{
@Override
public <B> ListApplicative<B> pure (B value)
{
// Implementation
}
@Override
public <B> ListApplicative<B> apply (
ListApplicative<Function<A, B>> applicative)
{
// Implementation
}
@Override
public <B, C> Function<ListApplicative<B>, ListApplicative<C>> liftA2 (
Function<A, Function<B, C>> function)
{
// Implementation
}
}
Я немного читал о типах с F-привязкой, но я не уверен, что делать. Я не могу использовать B
или C
в качестве параметризованных типов, поскольку их типы неизвестны, пока вы не запустите функцию.
Я просмотрел другие подобные вопросы, такие как это о функторах, этот о дженериках дженериков и этот вопрос об интерфейсах, но я не нашел ответа, который искал.
Большое спасибо!
Applicative<?>
вListApplicative<?>
? Ваш интерфейс предназначен для работы сApplicative<?>
, поэтому вы должны гарантировать, что весь ваш класс, реализующийApplicative<?>
, может работать сApplicative<?>
, а не только сListApplicative<?>
. Если вы действительно хотите это сделать, вам не следует использовать интерфейс, просто напишите эти методы в своем классеListApplicative<?>
. - person zhh   schedule 27.12.2017interface
. Вы можете использоватьinstanceof
, чтобы проверить, является лиApplicative<?>
ListApplicative<?>
, и вы также можете вернутьListApplicative<?>
какApplicative<?>
, но при таком подходе вы не получите преимущества статических проверок компиляции. - person zhh   schedule 27.12.2017