?

Log in

No account? Create an account
"ты, Завалишин, как e в степени x - хоть кол на голове теши" - dz

> Свежие записи
> Архив
> Друзья
> Личная информация
> DZ Online

Апрель 14, 2009


Previous Entry Поделиться Next Entry
06:32 am - "ты, Завалишин, как e в степени x - хоть кол на голове теши"
Наконец, пришли математики с предъявой - чо я тут про ОО, а это частный случай, а они про общий, а я про это молчок.

Пацаны - а знаете анекдот? Как математик идёт мимо камерного театра, замечает вывеску, и заинтересованно заходит внутрь. Через минуту выходит разочарованный со словами "тривиальный случай - ка равно трём"...?

Я вот примерно в этом же ключе случай рассматриваю - частный, тривиальный, но ОЧЕНЬ практичный. А фп мне симпатично, но пока что это и всё. Вы за него сначала сами повоюйте, чтоб хотя бы я начал вас до конца понимать. А то, извините за самомнение, но пока даже я всего не понял, рассчитывать на широкие массы программеров - ну - как бы это сказать - преждевременно.

Ну и - предлагаю некоторое утверждение, которое и сам считаю спорным. Я его породил в процессе обдумывания предъяв фп-шников, вспомнив по дороге про Форт. Который жуть какой красивый, только это не вызывает никакого желания им пользоваться, а после первой попытки - даже очень успешной - когда ты тратишь полчаса на написание, а уже через час тебе надо два часа на прочтение - понимаешь, что на нём точно не надо ничего никогда писать. Если это хочешь иногда и читать тоже.

Мысль вот какая. Надо выбирать не самый широкий базис, не самую всеобъемлющую парадигму, а МИНИМАЛЬНО возможный базис. Идеален не тот ЯП, на котором можно написать ЛЮБУЮ программу, а тот, на котором можно написать ЛЮБУЮ НУЖНУЮ тебе программу. То есть - никому не нужны к-мерные театры. Для 3-мерных существ ВПОЛНЕ достаточно 3-мерных, и давать в этом месте гибкость - бессмысленно и ВРЕДНО.

Утверждение: Правильный, хороший ЯП, неполноценен и ИЗБЫТОЧЕН, а полноценный и неизбыточный (лисп, форт, ассемблер стековой машины) - вреден и чрезмерен.

Утверждение: программирование - это НЕ написание программы, а написание ТАКОЙ программы, процесс написания которой позволяет организовывать мышление программиста эффективным с точки зрения формализации предметной области способом. Запуск программы на исполнение - важный, но почти побочный эффект её написания. (это вообще кто-то древний сказал...)

PS: Я прощёлкал - а когда это в течении последних 75 лет присваивание признали функционально кошерным?

PPS: Мне тут ещё фразу подарили: "третий элемент кортежа похож на емейл". Пишу, чтобы не забыть. Очень хочу посмотреть на спеку для ФП-библиотеки функций, в которой говорится, что все функции принимают в качестве параметра кортежи с третьим элементом, похожим на емейл. Сплю и вижу. Сплю, вижу, и фигею, дорогая редакция. /* int [] myfunc( int [] ); third int in array supposed to be x coordinate in inches */

(94 комментария | Оставить комментарий)

Comments:


[User Picture]
From:thesz
Date:Апрель 14, 2009 06:56 am
(Link)
Вырази на объектах условие. if-then-else. Ветви "тогда" и "иначе" вычисляются лениво.

Вот на лямбдах:
true = \t e.t
false = \t e.e

if = \sel t e.sel t e
-- if true A B === A
-- if false A B === B
Нужны циклы? Будут.

Нужен перебор с откатом? Будет.

Вот, смотри:
type NonDet a = [a] -- работаем на ленивом списке.

pure :: a -> NonDet a
pure a = [a] -- список из одного элемента.

(<*>) :: NonDet (a -> b) -> NonDet a -> NonDet b
p <*> q = [f x | f <- p, x <- q]
Пжалте. Частный случай Control.Applicative. Я на этих двух штуках уже могу собирать синтаксический разбор.

Что ещё нужно? Вот то и будет.

Вот тебе минимальность базиса и возможность наращивания.

Сравни с ОО.
[User Picture]
From:alpha_cygnus
Date:Апрель 14, 2009 07:35 am

Оффтопик?

(Link)
IIRC:
x ifTrue: [ doThen ] ifFalse: [ doElse ]

Уже не помню точно синтаксис...
У SmallTalk'а базис чуть ли не меньше всех. И, кстати, он весьма читабелен как минимум из-за кусочных названий методов.
Кстати, я как-то видел, как Хаскель наравне с Перлом отнесли к классу write-only языков. Его читать сложно примерно так же, как математическую статью, для тех, кто не в теме.
[User Picture]
From:thesz
Date:Апрель 14, 2009 11:07 am

Re: Оффтопик?

(Link)
Ну, да, ну, да. ;)

Smalltalk-80, с безымянными блоками кода. Надо сказать, что они появились раньше, чем Лисп стал хоть сколько-то функциональными. ;)

Если попробовать без блоков кода, то получится интересней. Много интересней. ;)

И вдогонку. Базис Смолтока больше лямбда-исчисления, нет?
[User Picture]
From:alpha_cygnus
Date:Апрель 14, 2009 11:12 am

Re: Оффтопик?

(Link)
А вот не знаю, больше он или нет. Может и нет, но то, что языковых конструкций в SM меньше, чем почти в любом другом языке (кроме, видимо, лиспа) - это факт.
А без блоков кода я даже и не знаю, они как раз вносят ленивость, без которой, да, никуда.
[User Picture]
From:thesz
Date:Апрель 14, 2009 11:28 am

Re: Оффтопик?

(Link)
Хаскель - это лямбда-исчисление с константами, практически.

Константы нужны, чтобы не таскать в параметрах все когда-либо определённые функции. ;)

Достаточно всего определения функций и я смогу записать практически всё, что есть в Хаскеле, но по-другому. Ну, если честно, то нужны пара (,), юнит () и определение функции.

Будет иногда мешать система типов (Y комбинатор), это единственное ограничение.
[User Picture]
From:alpha_cygnus
Date:Апрель 14, 2009 11:35 am

Re: Оффтопик?

(Link)
То, что из Хаскеля можно много чего выкинуть, не потеряв в том, что с помощью этого можно выразить - тоже факт. Но в Хаскеле всё-таки конструкций больше, чем в ST, по умолчанию, даже if then else - это не функция синтаксически (это в агде её вроде можно определить, а в H она в язык встроена).
P.S. damn you, recaptcha!
(Удалённый комментарий)
(Удалённый комментарий)
[User Picture]
From:blacklion
Date:Апрель 14, 2009 08:02 am
(Link)
Тебе (вам?) Дмитрий скорее всего не ответит (почему-то — это я индукцию провожу по предыдущим постам, был бы рад ошибаться), но ответ был вот тут, как мне кажется:

http://dz.livejournal.com/500730.html?thread=9109242&style=mine#t9109242
(Удалённый комментарий)
[User Picture]
From:thesz
Date:Апрель 14, 2009 10:27 am
(Link)
Перейдём с Хаскеля на Агду:
if1_then_else_ : Bool -> Set -> Set -> Set
if1 True  then a else b = a
if1 False then a else b = b
Здесь мы имеем пример вычисления статической модели. (на Хаскеле для этого используются type families, не так прямо и не настолько единообразно)

Прошу, в свою очередь, <ahref=http://www.google.com/search?ie=utf-8&oe=utf-8&sourceid=navclient&gfns=1&q=martin+lof+type+theory>ознакомится с текущими достижениями ФП</a>. Которым, к слову, 37 лет уже, как.

Вдогонку.

ОО модель мира строится по некоторым правилам. Основное - это Liskov substitution principle. Можно сказать, что мы вычисляем ОО классификацию.

Только процесс вычисления неформальный: мы создаём некую модель практически a priori, примеряем на неё варианты использования (use cases) и Lsp, и оцениваем результат. Повторяем процесс. Выбираем лучший вариант по какому-либо из критериев.

Лямбда исчисление предлагает универсальный подход: мы одним и тем же способом работаем и с данными, и с типами. Даже синтаксис одинаковый: f x (или f X) для данных и F X (или F x) для типов.

Способность вычислять типы позволяет строить не динамические вселенные типов, нет, статические, но лучше подогнанные под задачу.

И совсем в завершение.

"Источник вдохновения" - пост, что мы комментируем, - сам перешел с ОО в общем на ЯП в частности. Вот я и продемонстрировал мощь ФП.

ООП я не критикую, я его не использую больше, чем необходимо. Нужно работать с Java, использую ООП. Чего стараюсь делать по минимуму, а то и просто создавать по описанию.
[User Picture]
From:dz
Date:Апрель 14, 2009 10:38 am
(Link)
я подставился, всё верно. :) спросонья написал про минимальный базис, что не отражало реальной мысли. минимальный базис делается из чего угодно и, по сути, я хотел сказать обратное - базис должен быть не минимальным, а ближайшим к задаче.
[User Picture]
From:blacklion
Date:Апрель 14, 2009 10:42 am
(Link)
базис должен быть не минимальным, а ближайшим к задаче.
Ну и постепенно мы приходим к DSL'ям :)
[User Picture]
From:thesz
Date:Апрель 14, 2009 10:56 am
(Link)
А если мы поменяем: "базис должен быть приводим к задаче за минимальное число действий"?

Получается отлично.

Можно сравнивать ЯП по количеству действий, необходимых для приведения к задаче.
(Удалённый комментарий)
[User Picture]
From:thesz
Date:Апрель 14, 2009 11:22 am
(Link)
Понимаю ли я ООП, удалось ли мне продемонстрировать мощь ФП/ЯП - это всё в глазах наблюдателя.

Вы давайте критику. Что мне не удалось продемонстрировать конкретно, как это надо было демонстрировать, чтобы как минимум вам было понятно. Что я не понимаю в ООП, как это надо понимать с вашей точки зрения. И тп и тд.

Давайте сравним наше понимание. Я, например, понимаю так, что ООЯ обязательно императивны - у объектов есть идентичность (identity), которая позволяет различать объекты, одинаковые по всем своим свойствам. Грубо говоря, к любому значению a приписывается некий id, и они всюду ходят парой: (id,a), (id,b), (id,(a,b,c)). (id256,x) = (id1,1) + (id2,2) и (id1024,x) = (id1,1) + (id2,2).

Проектирование вычислений обязательно должно учитывать наличие этого id.

По-моему, это уже достаточное основание различать способы поиска процесса вычислений в ФП и ООП.
(Удалённый комментарий)
(Удалённый комментарий)
(Удалённый комментарий)
(Удалённый комментарий)
(Удалённый комментарий)
(Удалённый комментарий)
(Удалённый комментарий)
(Удалённый комментарий)
(Удалённый комментарий)
(Удалённый комментарий)
(Удалённый комментарий)
[User Picture]
From:dz
Date:Апрель 14, 2009 10:21 am
(Link)
неправильно я выразился. не минимальный базис. чёрт. спать по ночам надо. ладно. в другой раз.

> Go to Top
LiveJournal.com