5 ms·
Really ? How would you even encode Maybe or Option in Java, if you can't use null anywhere ? The problem is that Maybe doesn't work without Algebraic Data Type
by waps 13y ago
Really ? How would you even encode Maybe or Option in Java, if you can't use null anywhere ?
The problem is that Maybe doesn't work without Algebraic Data Types.
- anon4 13y agoOh come on, that's trivial public interface Maybe<T> { boolean hasValue(); } public final class Just<T> implements Maybe<T> { public final T value; public Just(T value) { this.value = value; } public boolean hasValue() { return true; } } public final class Nothing<T> implements Maybe<T> { public boolean hasValue() { return false; } } You can even get rid of hasValue (but then you need to pay for instanceof each time); or of the Nothing class and make Maybe a class. You may ask what the value of Just.value is before the constructor runs - the value is a machine null and if you somehow manage to access it before the ctor runs, that's a NullPointerException; or what writing "Type varname;" in a function would do - that would be perfectly legal, but you won't be allowed to use it if the compiler can't prove you've initialised it first (which it does right now).
- waps 13y agoProblems : 1) How do you get at the value itself ? (Casting ? That's bad) 2) How do you prevent in Maybe<Integer> x; x == null ? 3) How do you prevent someone from extending Maybe<T> ? e.g. public final class LetsHaveFun<T> implements Maybe<T> { public boolean hasValue() { throw Exception("Can't touch this"); } 4) (you need a null check in the constructor) 5) (I dislike the autoboxing this uses)
- anon4 13y ago1) Yes, casting. You need to do casting in Haskell too, it's just hidden for you by pattern-matching 2) It's for a hypothetical Java implementation that doesn't have null 3) If you really want to, make it an abstract class and do a check in the constructor that this.getClass() == Nothing.class or Just.class. 4) see 2) 5) well if you're using primitive types they are non-nullable already Edit: to clarify, I don't expect someone to use it for Java today, it's what I would put in the standard library if Java didn't have a null in the first place.
- twic 13y ago> 1) How do you get at the value itself ? (Casting ? That's bad) You could add the usual map method to the Maybe type - a Maybe<T> can take a Function<T, U>, and returns a Maybe<U>. If it's None, it doesn't call the function, and just returns None; if it's Some, it calls it with the value, and wraps the result in a new Some. If you want to do side-effects conditionally on whether the value is there, you just do them in the Function and return some placeholder value. You could write a trivial adaptor to take an Effect<T> and convert to to a Function<T, Void>, etc. > 2) How do you prevent in Maybe<Integer> x; x == null ? You're right that using a Maybe does not exclude the ability to use nulls. Nobody can deny that. The point i was making is that there is nothing useful that you can do with nulls that you cannot do with a Maybe instead. > 3) How do you prevent someone from extending Maybe<T> ? e.g. You can trivially control extension by making Maybe an abstract class, giving it a private constructor, and making Some and None static inner classes of it. It's a kludge, but it works!