Próbuję zdefiniować klasy w Javie, które są podobne do funktorów Haskella. Niniejszym, funktorem jest zdefiniowany jako:Funktory w Javie
/**
* Programming languages allow only (just simply enough) endofunctor, that are functors from and to the same category.
* In this case, the category is the one of the datatypes (in here Type, in order to make it more clear)
*/
public interface EndoFunctor<X extends Type> extends Type {
/**
* The basic implementation for any element fx
* @param map Transformation function for the type parameter
* @param fx Element of the current class
* @param <Y> Target type
* @return transformed element through map
*/
<Y extends Type> EndoFunctor<Y> fmap(Function<X,Y> map, EndoFunctor<X> fx);
}
Jeśli chcę wdrożyć funktor, muszę napisać coś podobnego
public class Id<X extends Type> implements EndoFunctor<X> {
protected X witness;
Id(X witness) { this.witness = witness; }
@Override
public <Y extends Type> Id<Y> fmap(Function<X, Y> map, Id<X> fx) {
return new Id<>(map.apply(fx.witness));
}
}
problem z tym kodem jest, że Id<X>
nie pasuje do typu EndoFunctor<X>
. Jak mogę określić fmap
w EndoFunctor
interfejs taki, że jeśli każdy rodzaj K<T>
realizuje EndoFunctor<T>
i funkcją map T->U
jest podana, wtedy K<U>
jest zwracany jako wartość, bez rzutowania (to jest, ponieważ wiem, że moim celem jest Id<T>
, następnie wynik fmap
"musi być" Id<U>
, a zatem I downcast wynik typu EndoFunctor<U>
do tego typu)?
Czy istnieje powód, dla którego nie użyłeś zamiast tego 'EndoFunctor fmap (funkcja mapa)? W ten sposób każda instancja użyje swoich zmiennych instancji. Na przykład 'return new Id <> (map.apply (this.witness))'. –
afsantos
Cóż, nie sądzę, aby ta obserwacja mogła odpowiedzieć na moje pytanie. Twoja mapa ('fmap2 (x)') jest definiowalna jako 'fmap (x, this)', więc to naprawdę nie rozwiązuje problemu typu. – jackb
Nawiasem mówiąc, zdefiniowałem funkcję w ten sposób, aby przypominała bardziej definicję funktora, czyli [F: (a-> b) -> (Fa -> Fb)] (http: // latex.codecogs.com/gif.download?F%5Ccolon%20%28a%5Cto%20b%29%5Cto%20%28Fa%5Cto%20Fb%29), gdzie F w tym przypadku to EndoFunctor. – jackb