java

Ben Sless 2024-06-03T06:57:18.541599Z

Trying to implement category theory things in Java (why not), I get tripped up on java syntax and generics Thought I'd start with interfaces for Functor, Applicative and Monad, then go from there Starting off, Functor:

public interface Functor<A> {
    // which is the correct signature for map?
    <B extends Functor<B>> Functor<B>map(Function<A,B> f);
    <B> Functor<B>map(Function<A,B> f);
}
The comment says it. In theory, we can map over every functor, but do I need to express somehow that the receiver and return value can be anything that extends Functor? It gets more complicated when Applicative provides a default implementation for functor:
@Override
    default <B> Functor<B> map(Function<A, B> f) {
        return this.apply(pure(f));
    }
Is this right? Does map over Applicative return Functor? Can I express somehow that it returns anything which extends Functor<B>? I have the same problem with Monad but figuring out the syntax / correct typing for applicative will probably carry over

Ben Sless 2024-06-03T07:01:13.483479Z

Do I need to change the implementation in Applicative to return an Applicative?

littleli 2024-06-03T13:11:14.161569Z

I'm not really good at this. But take a look at https://typelevel.org/cats/typeclasses/applicative.html it may cast some light on what is happening there with map and why you need ap (or product as an alternative reasoning) as a supportive construct https://typelevel.org/cats/typeclasses/applicative.html#what-is-ap So the way I see it is that Applicative is a Functor where you teach your map an additional superpower to be able to handle things like Optional types. I'm not sure if Java type system is capable to express this.