Ich versuche Klassen in Java zu definieren, die Haskell Funktoren ähnlich sind. Hierdurch wird ein Funktor ist definiert als:Funktoren in Java
/**
* 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);
}
Wenn ich einen Funktors implementieren wollen, ich habe
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));
}
}
Das Problem mit diesem Code zu schreiben ist, dass Id<X>
nicht den Typ überein EndoFunctor<X>
. Wie kann ich fmap
in der EndoFunctor
Schnittstelle so bestimmen, dass, wenn jede Art K<T>
implementiert EndoFunctor<T>
und eine Kartenfunktion T->U
gegeben ist, dann K<U>
als Wert zurückgegeben wird, ohne eine Schublade gesteckt (das heißt, da ich weiß, dass mein Objekt ein Id<T>
ist, dann das Ergebnis von fmap
"muss" ein Id<U>
sein, und daher habe ich das Ergebnis vom Typ EndoFunctor<U>
auf diesen Typ gesenkt?
Gibt es einen Grund, warum Sie 'EndoFunctor fmap (Funktion map)' nicht stattdessen verwendet haben? Auf diese Weise würde jede Instanz ihre Instanzvariablen verwenden. Ie, 'return new Id <> (map.apply (this.witness))'. –
afsantos
Nun, ich denke nicht, dass diese Beobachtung meine Frage beantworten könnte. Ihre Map ('fmap2 (x)') kann als 'fmap (x, this)' definiert werden, was das Typproblem nicht wirklich löst. – jackb
Übrigens habe ich die Funktion auf diese Weise definiert, um sie der Definition eines Funktors ähnlicher zu machen, nämlich [F: (a-> b) -> (Fa -> Fb)] (http: // latex.codecogs.com/gif.download?F%5Ccolon%20%28a%5Cto%20b%29%5Cto%20%28Fa%5Cto%20Fb%29), wobei F in diesem Fall der EndoFunctor ist. – jackb