some lambda in plain java
Mar. 6th, 2008 06:04 pm![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
See what people, I mean,
dtm, can do with our Java::
![[livejournal.com profile]](https://www.dreamwidth.org/img/external/lj-userinfo.gif)
// Look, it's an anonymous recursive function!
public void testY() {
assertEquals(720,
new Function<Function<Fii, Fii>, Fii>() {
public Fii apply(final Function<Fii, Fii> f) {
return new Branch() {
public Fii apply(final Branch x) {
return f.apply(new Fii() {
public Integer apply(Integer y) {
return x.apply(x).apply(y);
}
});
}
}.apply(new Branch() {
public Fii apply(final Branch x) {
return f.apply(new Fii() {
public Integer apply(Integer y) {
return x.apply(x).apply(y);
}
});
}
});
}
}.apply(new Function<Fii, Fii>() {
public Fii apply(final Fii f) {
return new Fii() {
public Integer apply(Integer i) {
return (i <= 0) ? 1 : i * f.apply(i - 1);
}
};
}
}).apply(6).intValue());
}
}
no subject
Date: 2008-03-07 02:19 am (UTC)no subject
Date: 2008-03-07 05:42 am (UTC)2. How do you know.
3. What kind of bastard interviewed you at Google?
4. Do you think lowly code monkeys like me can ever be entitled to be hired by your company?
no subject
Date: 2008-03-07 06:05 am (UTC)2. Kim Bruce (http://ygam.livejournal.com/128302.html)?
3. A namesake of a former governor of California.
4. We have coding monkeys aplenty.
no subject
Date: 2008-03-07 06:35 am (UTC)no subject
Date: 2008-03-08 05:48 am (UTC)no subject
Date: 2008-03-07 10:53 am (UTC)Понятно :)
no subject
Date: 2008-03-07 04:25 pm (UTC)no subject
Date: 2008-03-07 11:46 am (UTC)Переписал (http://fj.technocore.ru/freestuff/TestYCombinator.cs) её на шарпе, чтобы разобраться. Правда, ввиду отсутствия анонимных классов пришлось юзать обычные, кушающие конструктором (анонимный) делегат -- что забавно, на мой вкус получилось красивее.
Вечером, может, попробую ещё поэкспериментировать, в шарпе достаточно забавные правила вывода типов для анонимных делегатов, может, классы там и не нужны вообще.
Правильно ли я понимаю, что словосочетание F-bounded polymorphism здесь означает просто то, что мы можем написать класс, у которого есть метод, берущий в качестве параметра экземпляр этого же класса? При том, что полиморфизма тут как такового нет вообще, я могу разъединить иерархию классов (проверил -- могу), полностью избавиться от генериков (влом проверять, но, кажется, могу) и всё продолжит работать?
no subject
Date: 2008-03-07 05:12 pm (UTC)Branch
{
public abstract Fii Apply(Branch b);
}
произвольную имплементацию (в которой в Апплае как-то отражалась бы структура соответствующей лямбды.
Переписал (http://fj.technocore.ru/freestuff/TestYCombinator2.cs), кстати, на чистые делегаты, без классов. Если вдруг интересно.
Ключевая строчка, позволяющая устроить всё это безобразие:
public delegate Fii Branch(Branch p);
Дальше всё довольно тривиально, правда, типовыводитель, конечно, не всеведущ, поэтому приходится ему в двух местах с самого начала указать тип делегата в явном виде, а дальше он уже сам.
Получилось совсем ясно и чисто.
Удивляюсь, как вам удаётся прогать на жаве. Очень ведь должно было бы быть неприятное ощущение, что язык slightly inferior по сравнению с точно таким же, но другим, как бы ничего серьёзного, но каких-то мелочей не хватает, причём нет ни малейшей надежды, что разработчики смирят гордыню и их добавят.
no subject
Date: 2008-03-07 05:35 pm (UTC)Насчё же джавы - да, достаёт. Да, legacy language. Да, предпочитаю джаваскрипт. Да, перестал на джаве даже пробовать писать функционально.
И дело не в разработчиках, дело в дикой толпе посредственностей-программистов, которые выражают своё тупое мнение очень громко. Джава - это Новый Бейсик.
no subject
Date: 2008-03-07 05:53 pm (UTC)Не стоит зря говорить именно на язык
no subject
Date: 2008-03-07 12:48 pm (UTC)Who said that Java isn't declarative language?
no subject
Date: 2008-03-07 04:26 pm (UTC)no subject
Date: 2008-03-07 05:26 pm (UTC)Than we use
Also C-strXXX like style for setting arbitrary number of attributes:
no subject
Date: 2008-03-07 05:41 pm (UTC)Я вот думаю такой стиль для манипуляции с коллекциями использовать. Типа, select( new Predicate() {...}).orderedBy(new Predicate() {...}).groupedBy(...). А то
no subject
Date: 2008-03-07 05:58 pm (UTC)не будет оптимизации запроса.
В идеале - так строить запрос - а потом его прозрачно выполнять.
Вроде
select( new Predicate() {...}).orderedBy(new Predicate() {...}).groupedBy(...).go();
Есть пакет работы с матрицами с похожим подходом.
no subject
Date: 2008-03-07 06:14 pm (UTC)Да и никакой оптимизации запросов я, если честно, не планировал. Просто хочется заменить все эти дурацкие циклы, имплементирующие подобную бизнес-логику (e.g. retrieve all purchased items along with their expiration date and group them by bundle id) на коллекциях, возвращаемых всякими веб-сервисами и прочими API, на что-то б.-м. читабельное. Ну и чтоб лепить эту логику быстрее.
Но, может, Вы и правы.
no subject
Date: 2008-03-07 06:00 pm (UTC)no subject
Date: 2008-03-07 06:15 pm (UTC)no subject
Date: 2008-03-07 05:11 pm (UTC)no subject
Date: 2008-03-07 05:13 pm (UTC)no subject
Date: 2008-03-07 05:50 pm (UTC)no subject
Date: 2008-03-07 05:58 pm (UTC)no subject
Date: 2008-03-07 07:57 pm (UTC)But this is rather straightforward; an ORM would present a better case.