gpt4 book ai didi

java - Java 中的仿函数

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:43:19 27 4
gpt4 key购买 nike

我正在尝试在 Java 中定义类似于 Haskell 的仿函数的类。特此,仿函数定义为:

/**
* 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);

}

如果我想实现一个 Identity Functor over types仿函数,我必须写类似的东西

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));
}
}

此代码的问题在于 Id<X>与类型 EndoFunctor<X> 不匹配.我如何确定 fmapEndoFunctor接口(interface)使得如果有任何类型 K<T>工具 EndoFunctor<T>和 map 功能 T->U给出,则K<U>作为一个值返回,没有任何类型转换(也就是说,因为我知道我的对象是一个 Id<T> ,那么 fmap 的结果“必须是”一个 Id<U> ,因此我向下转换类型的结果EndoFunctor<U> 到这种类型)?

最佳答案

你可以使用 CRTP :

interface EndoFunctor<X extends Type, T extends EndoFunctor<X, T>> extends Type {
<Y extends Type> EndoFunctor<Y, ?> fmap(Function<X,Y> map, T fx);
}

class Id<X extends Type> implements EndoFunctor<X, Id<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));
}
}

关于java - Java 中的仿函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37630864/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com