Hacker Newsnew | past | comments | ask | show | jobs | submitlogin

Then why did you tell me to update my knowledge of C#? It wasn't wrong for the discussion at hand.

Also, you failed to mention that the generics ADT in Java is still abysmal (it's relevant, because the topic started as boosting productivity in Java with ADT, I don't find ClassCastException as really boosting anything outside my blood pressure):

    sealed interface Result<T, E> permits Ok, Error { }
    
    record Error<E>(E error) implements Result<Object, E> {}
    record Ok<T>(T value) implements Result<T, Object>  {}

    //public <T, E> Object eval(Result<T, E> exp) {
    //    return switch (exp) {
    //        case Error<E> error -> error.error;
    //        case Ok<T> ok -> ok.value;
    //    };
    //}

    public <T, E> Object eval(Result<T, E> exp) {
        return switch (exp) {
            case Error error -> (E) error.error;
            case Ok ok -> (T) ok.value;
        };
    }
Guess I'll wait for Java 133 to get reified generics.


Yeah, Java's generics still kind of suck. There's a rumor after project Valhalla, Java language maintainers might add reified generics in the future. However, I think the current state of Java ADT & generic isn't that bad for most purposes.

Though due to its nullable-by-default type system and backward compatibility, there's a decent amount of footguns if you're trying to mix Java's FP & ADT with code that utilizes nulls.

About your code example, you could just do something like this to avoid explicit casting

  sealed interface Result<T,E> {
      record Ok<T,E>(T value) implements Result<T,E> {}
      record Error<T,E>(E error) implements Result<T,E> {}
      public static <T,E> Object eval(Result<T,E> res) {
          if (res instanceof Error<T,E>(E e)) // Rust's if let
              System.out.println(e);
          return switch (res) {
              case Ok(T v) -> v;
              case Error(E e) -> e;
          };
      }
  }
The new "pattern matching" feature of `instanceof` is certainly handy to avoid stupid ClassCastException.


Because your English reading comprehension missed the fact I was talking about the nullability improvements.

Given the expert level, you are certainly aware that most ML languages don't have reified polymorphism on their implementations, right?


> Because your English reading comprehension missed the fact I was talking about the nullability improvements.

Tank you :P Never claimed to be native English speaker.

Were there any meaningful changes in nullability semantics between C# 8.0 and C# 14.0? The issue I encountered was related to a complex game engine doing some runtime reflection, dependency injection, code gen and so forth.

I also never claimed to be ML expert. But them being reified or not, doesn't change my point that ADT in Java much like generics look like a design afterthought.




Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: