[java] А почему в Java нет полиморфных пар?
От: thesz Россия http://thesz.livejournal.com
Дата: 12.02.09 14:54
Оценка:
Ась?

Это я пытался пройтись по Джавовскому TreeMap.

Я не могу понять, как Хаскель, тикль, питон, c++ и даже PHP умудрились сделать такие итерации правильно, а в Java не справились. Не хватает именно полиморфных пар.

Поскольку там не дураки сидят, должна быть какая-то причина.

В интернете найти ничего толкового не смог.
Yours truly, Serguey Zefirov (thesz NA mail TOCHKA ru)
Re: [java] А почему в Java нет полиморфных пар?
От: Курилка Россия http://kirya.narod.ru/
Дата: 12.02.09 15:00
Оценка:
Здравствуйте, thesz, Вы писали:

T>Ась?


T>Это я пытался пройтись по Джавовскому TreeMap.


T>Я не могу понять, как Хаскель, тикль, питон, c++ и даже PHP умудрились сделать такие итерации правильно, а в Java не справились. Не хватает именно полиморфных пар.


Map.Entry<K,V>?
Re[2]: [java] А почему в Java нет полиморфных пар?
От: thesz Россия http://thesz.livejournal.com
Дата: 12.02.09 15:03
Оценка:
T>>Это я пытался пройтись по Джавовскому TreeMap.
T>>Я не могу понять, как Хаскель, тикль, питон, c++ и даже PHP умудрились сделать такие итерации правильно, а в Java не справились. Не хватает именно полиморфных пар.

К>Map.Entry<K,V>?


Yep, that is it.

Прямо вот только-только отыскал.

Но почему нет отдельных пар?
Yours truly, Serguey Zefirov (thesz NA mail TOCHKA ru)
Re[3]: [java] А почему в Java нет полиморфных пар?
От: Курилка Россия http://kirya.narod.ru/
Дата: 12.02.09 15:10
Оценка:
Здравствуйте, thesz, Вы писали:

T>Но почему нет отдельных пар?


Ну я не Гослинг и Ко, но думаю, что просто кортежи не входят в разряд широкоупотребительных абстракций на Яве.
Сам в своё время тоже искал что-то типа пар, в итоге какой-то велосипед использовал (благо там функционала не с фиг).
Re[4]: [java] А почему в Java нет полиморфных пар?
От: thesz Россия http://thesz.livejournal.com
Дата: 12.02.09 15:29
Оценка:
T>>Но почему нет отдельных пар?
К>Ну я не Гослинг и Ко, но думаю, что просто кортежи не входят в разряд широкоупотребительных абстракций на Яве.

А ещё на Java не получается сделать Either<Left,Right>.

ИДИОТИЗМ!!!

К>Сам в своё время тоже искал что-то типа пар, в итоге какой-то велосипед использовал (благо там функционала не с фиг).


Велосипеды на Java круче, чем машины.

Я, например, выкинул PriorityQueue, поскольку она постоянно проверяет типы данных.
Yours truly, Serguey Zefirov (thesz NA mail TOCHKA ru)
Re[5]: [java] А почему в Java нет полиморфных пар?
От: lomeo Россия http://lomeo.livejournal.com/
Дата: 12.02.09 21:26
Оценка:
Здравствуйте, thesz, Вы писали:

T>А ещё на Java не получается сделать Either<Left,Right>.


Почему это?
Re[6]: [java] А почему в Java нет полиморфных пар?
От: thesz Россия http://thesz.livejournal.com
Дата: 12.02.09 22:54
Оценка:
T>>А ещё на Java не получается сделать Either<Left,Right>.

L>Почему это?


public class Either<Left,Right> {
    Left left = null;
    Right right = null;

    // Ругается на перекрытие.
    Either(Left left) { this.left = left; }
    Either(Right right) { this.right = right; }

    // ругается на невозможность параметризации не статическим типом статической функции
    public static final Either<Left,Right> mkLeft (Left left) { ... }
}
Yours truly, Serguey Zefirov (thesz NA mail TOCHKA ru)
Re[7]: [java] А почему в Java нет полиморфных пар?
От: Cyberax Марс  
Дата: 12.02.09 23:03
Оценка:
Здравствуйте, thesz, Вы писали:

T>
T>public class Either<Left,Right> {
T>    Left left = null;
T>    Right right = null;

T>    // Ругается на перекрытие.
T>    Either(Left left) { this.left = left; }
T>    Either(Right right) { this.right = right; }

T>    // ругается на невозможность параметризации не статическим типом статической функции
T>    public static final Either<Left,Right> mkLeft (Left left) { ... }
T>}
T>

Ага, type erasure чтоб его...
Sapienti sat!
Re[7]: [java] А почему в Java нет полиморфных пар?
От: lomeo Россия http://lomeo.livejournal.com/
Дата: 12.02.09 23:38
Оценка: 12 (3)
Здравствуйте, thesz, Вы писали:

T>>>А ещё на Java не получается сделать Either<Left,Right>.


L>>Почему это?


T>
T>public class Either<Left,Right> {
T>    Left left = null;
T>    Right right = null;

T>    // Ругается на перекрытие.
T>    Either(Left left) { this.left = left; }
T>    Either(Right right) { this.right = right; }

T>    // ругается на невозможность параметризации не статическим типом статической функции
T>    public static final Either<Left,Right> mkLeft (Left left) { ... }
T>}
T>


Во-первых, public static final <Left,Right> Either<Left,Right> mkLeft (Left left) { ... }
Во-вторых, как то ты неправильно это делаешь

public class IllegalConstructorException extends Exception {}

public abstract class Either<L, R>
{
    private Either() {}

    // match constructors
    public static boolean isLeft(Either e)  { return e instanceof Left; }
    public static boolean isRight(Either e) { return e instanceof Right; }

    // fields
    public abstract L getLeftVal()  throws IllegalConstructorException;
    public abstract R getRightVal() throws IllegalConstructorException;

    // constructors
    public static <L,R> Either<L,R> left(L left)   { return new Left<L,R>(left); }
    public static <L,R> Either<L,R> right(R right) { return new Right<L,R>(right); }

    private static class Left<L,R> extends Either<L,R>
    {
        private L val;

        private Left(L val) { this.val = val; }

        public L getLeftVal()  throws IllegalConstructorException { return val; }
        public R getRightVal() throws IllegalConstructorException { throw new IllegalConstructorException(); }
    }

    private static class Right<L,R> extends Either<L,R>
    {
        private R val;

        private Right(R val) { this.val = val; }

        public L getLeftVal()  throws IllegalConstructorException { throw new IllegalConstructorException(); }
        public R getRightVal() throws IllegalConstructorException { return val; }
    }
}


Тогда, если у нас есть

public interface Function<T,R>
{
    R call(T obj);
}


то мы можем определить

    public static <L,R,T> T either(Function<L,T> lfun, Function<R,T> rfun, Either<L,R> e)
        throws IllegalConstructorException
    {
        if (isLeft(e)) {
            return lfun.call(e.getLeftVal());
        }

        if (isRight(e)) {
            return rfun.call(e.getRightVal());
        }

        throw new IllegalConstructorException();
    }


и использовать как то так

        Either<String,Integer> l = left("test");
        Either<String,Integer> r = right(5);

        Function<String, String> lfun = new Function<String, String>() {
            public String call(String val) { return "string: " + val; }
        };

        Function<Integer, String> rfun = new Function<Integer, String>() {
            public String call(Integer val) { return "int: " + val; }
        };

        System.out.println(either(lfun, rfun, l));
        System.out.println(either(lfun, rfun, r));
Re[8]: [java] А почему в Java нет полиморфных пар?
От: thesz Россия http://thesz.livejournal.com
Дата: 13.02.09 09:34
Оценка:
T>>>>А ещё на Java не получается сделать Either<Left,Right>.
L>>>Почему это?
T>>
T>>public class Either<Left,Right> {
T>>    Left left = null;
T>>    Right right = null;

T>>    // Ругается на перекрытие.
T>>    Either(Left left) { this.left = left; }
T>>    Either(Right right) { this.right = right; }

T>>    // ругается на невозможность параметризации не статическим типом статической функции
T>>    public static final Either<Left,Right> mkLeft (Left left) { ... }
T>>}
T>>


L>Во-первых, public static final <Left,Right> Either<Left,Right> mkLeft (Left left) { ... }

L>Во-вторых, как то ты неправильно это делаешь

Неидиоматично, да.

L>
L>public class IllegalConstructorException extends Exception {}
L>....
L>


Все, все без исключения Java программисты умнее меня в три, четыре раза, а то и на порядок.

Я до такого додуматься просто не могу в принципе.

Но буду знать, за что большое спасибо.
Yours truly, Serguey Zefirov (thesz NA mail TOCHKA ru)
Re[9]: [java] А почему в Java нет полиморфных пар?
От: lomeo Россия http://lomeo.livejournal.com/
Дата: 13.02.09 09:58
Оценка:
Здравствуйте, thesz, Вы писали:

T>Все, все без исключения Java программисты умнее меня в три, четыре раза, а то и на порядок.

T>Я до такого додуматься просто не могу в принципе.

Вообще то, эту идею я впервые услышал именно от тебя.
Re[10]: [java] А почему в Java нет полиморфных пар?
От: thesz Россия http://thesz.livejournal.com
Дата: 13.02.09 11:49
Оценка:
T>>Все, все без исключения Java программисты умнее меня в три, четыре раза, а то и на порядок.
T>>Я до такого додуматься просто не могу в принципе.
L>Вообще то, эту идею я впервые услышал именно от тебя.

"Змея, кусающая себя за хвост."

У меня всё было точно не настолько подробно, если было. Так, намётки. Здесь же полноценный Java код, придраться не к чему.
Yours truly, Serguey Zefirov (thesz NA mail TOCHKA ru)
Re: [java] А почему в Java нет полиморфных пар?
От: gyraboo  
Дата: 18.02.09 13:19
Оценка:
Здравствуйте, thesz, Вы писали:

T>Это я пытался пройтись по Джавовскому TreeMap.

T>Не хватает именно полиморфных пар.

А что это?
Re[2]: [java] А почему в Java нет полиморфных пар?
От: thesz Россия http://thesz.livejournal.com
Дата: 18.02.09 14:42
Оценка:
T>>Это я пытался пройтись по Джавовскому TreeMap.
T>>Не хватает именно полиморфных пар.
G>А что это?

Prelude> :t (,)
(,) :: a -> b -> (a, b)
Yours truly, Serguey Zefirov (thesz NA mail TOCHKA ru)
Re[3]: [java] А почему в Java нет полиморфных пар?
От: lomeo Россия http://lomeo.livejournal.com/
Дата: 18.02.09 16:27
Оценка:
Здравствуйте, thesz, Вы писали:

T>
T>Prelude> :t (,)
T>(,) :: a -> b -> (a, b)
T>


Да написать-то их можно, вот разбирать всё равно надо будет Java-way.
Паттерн матчинга то нет
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.