我想用Java定义Functor类。这有效:
//a Function
public interface F {
public R apply(A a);
}
public interface Functor {
public Functor fmap(F f);
}
但是,fmap的返回值应该不是Functor,而是适当的子类。通常,可以使用CRTP对此进行编码,但是由于附加参数,在这里我似乎遇到了麻烦A。例如,以下和类似的编码不起作用(“类型参数FInst不在其范围内”):
public interface Functor> {
public > I fmap(F f);
}
[说明]
对于“适当的子类”,我指的是被称为自身的类的类型。例如,列表是函子,所以我想写一些类似的东西
public class ListFunctor implements ??? {
final private List list;
public ListFunctor(List list) {
this.list = list;
}
@Override
ListFunctor fmap(F f) {
List result = new ArrayList();
for(A a: list) result.add(f.apply(a));
return new ListFunctor(result);
}
}
我知道即使使用给出的第一个定义,我也可以编写此代码(因为允许使用协变量返回类型),但是我希望返回类型“ ListFunctor” 由类型系统
强制执行 (因此,我无法返回FooFunctor),这意味着Functor接口需要返回“自我类型”(至少在其他语言中如此)。
[结果]
所以看来我想要的是不可能的。这是一个相关的博客文章:http : //blog.tmorris.net/higher-order-
polymorphism-for-pseudo-java/
[后果]
我偶然发现了我这个古老的问题,意识到这是我的图书馆highJ令人惊叹的旅程的起点,该图书馆包含的内容远不止一个简单的Functor。我永远也不会想象人们会用这种疯狂的东西来处理任何严重的事情,但是事情发生了,这让我感到非常高兴。