Re[7]: Expression Tree для описания алгоритмов
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 16.05.10 17:18
Оценка: -1 :)
Здравствуйте, barn_czn, Вы писали:

_>>>Ну это для вас проще. То что вы написали на хаскеле и прологе для меня филькина грамота, и желания вникнуть особого нет в этот читабельный по вашему мнению синтаксис.

G>>Выделенное — это твои трудности. По факту алгоритм на хаскеле или другом ФЯ оказывается гораздо читаемее.
_>Да, это мои трудности, и еще трудности нескольких миллионов, и их к сожалению большинство.
Это заявление в духе "миллионы леммингов не могут ошибаться" ? Практика показала что могут.


_>>>Это не в укор этим языкам, просто так исторически сложилось, что большинству людей все таки ближе си-подобные языке.

G>>И что? Давайте теперь всю математику на С перепишем
_>Если вы не заметили это уже давно делается.
5 лет отучился на математическом факультете и не заметил.


_>Sum(list) тоже не плохо, и что?

Ну так в том и вопрос как тот самый Sum написать

_>Краткость != читабельность..

Почти всюду краткость == читабельность.

G>>Еще раз, проблема в твоем незнании языков и все.


_>Ок, я действительно не изучал до сих пор ни одного ФЯ, немного правда читал про F#. Но, может я здесь ошибаюсь, тот же C# сейчас позволяет писать код в функциональном стиле: есть анонимные делегаты, лямбды. Я сейчас, возможно наивно, полагаю что ФЯ дает просто краткий синтаксис использования всего этого. Никаких принципиально новых выражений в ФЯ нет.


let sum = fold (+) 0

Даже в таком простом коде на F# используется несколько концепций, которых нету в C#.

_>Ведь F# — функциональный язык, а так как он для .net то любой код написаный на нем легко дизассемблировать на C#.

Только понять потом что написано — нереально.

_>Что мне даст изучение какого либо ФЯ?

Оно сделает тебя более профессиональным программистом.
Re[5]: Expression Tree для описания алгоритмов
От: Тролль зеленый и толстый  
Дата: 16.05.10 19:34
Оценка: +1 -1
Занятное заблуждение. Странно, мне этот вопрос казался очевидным.

Сборка мусора обладает особым свойством: она может обрабатывать недетерминированное удаление объектов, когда множество объектов ссылается на один и тот же объект, и порядок удаления объектов невозможно определить на момент компиляции.

Если бы мне было не лень, я бы вам привел пример кода на языке со сборкой мусора, для перевода которого на язык с ручным управлением памятью понадобилось бы как минимум ввести подсчет ссылок. Но подсчет ссылок не может обработать все случаи, которые может обработать сборка мусора.

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

_>В том то и дело что надо не free() заменить на =null, а вообще убрать free(), и пусть транслятор сам думает где надо вызывать этот free().Чтоб это стало возможным нужна семантика языка позволяющая делать это безошибочно.


Решение, заключающееся в убирании всех free() обладает только одним недостатком: в каких-то случаях оно может быть менее эффективным, так как ссылка на объект может сохраняться, хотя она уже не нужна. Думаю, эта проблема может быть полностью решена путем статического анализа исходного кода.
Re[4]: Expression Tree для описания алгоритмов
От: Тролль зеленый и толстый  
Дата: 16.05.10 19:50
Оценка: -1 :)
FR>
FR>qsort []     = []
FR>qsort (x:xs) = qsort (filter (< x) xs) ++ [x] ++ qsort (filter (>= x) xs)
FR>


FR>Ни чем ни хуже чем псевдокод по понятности.


Лол. +100. Это ты знатно отмочил.
Re[6]: Expression Tree для описания алгоритмов
От: Тролль зеленый и толстый  
Дата: 16.05.10 20:08
Оценка: -1
Я так понял, ты по работе занимаешься дотнетом. Программируешь, видимо, на C#. Видимо, для общего развития ты изучил функциональные языки.

Я не спрашиваю тебя, зачем тебе понадобилось изучать функциональные языки, когда они тебе по работе не нужны. Мало ли чем люди в свободное время занимаются.

Как ты думаешь, много ли программистов, как ты, изучают в свободное время функциональные языки? Почему ты пытаешься стыдить человека тем, что он не знает функциональных языков?

С таким же успехом можно упрекать людей в том, что они не знают brainfuck. Кстати, код быстрой сортировки на Хаскеле по "понятности" приближается к brainfuck'у.

G>
G>fold (+) list
G>

Здесь написано: свернуть (+) список.

Не знаю, мне не очень понятно.

Понятно было бы так, например:

x = sum of all items in list
Re[7]: Expression Tree для описания алгоритмов
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 16.05.10 20:43
Оценка: +1
Здравствуйте, Тролль зеленый и толстый, Вы писали:

ТЗИ>Я так понял, ты по работе занимаешься дотнетом. Программируешь, видимо, на C#. Видимо, для общего развития ты изучил функциональные языки.

ТЗИ>Я не спрашиваю тебя, зачем тебе понадобилось изучать функциональные языки, когда они тебе по работе не нужны. Мало ли чем люди в свободное время занимаются.
ТЗИ>Как ты думаешь, много ли программистов, как ты, изучают в свободное время функциональные языки? Почему ты пытаешься стыдить человека тем, что он не знает функциональных языков?
Я не пытаюсь стыдить человека за то что он чего-то не знает. Бравирование своим незнанием достойно порицания, а не само незнание.


ТЗИ>С таким же успехом можно упрекать людей в том, что они не знают brainfuck.

Если бы brainfuck подходил для какой-либо задачи лучше другого языка, то вполне можно было упрекать человека в том что он использует другой язык вместо brainfuck.

ТЗИ>Кстати, код быстрой сортировки на Хаскеле по "понятности" приближается к brainfuck'у.

Может приведешь быструю сортировку на brainfuck для сравнения?


G>>
G>>fold (+) list
G>>

ТЗИ>Здесь написано: свернуть (+) список.
Так и написано.

ТЗИ>Не знаю, мне не очень понятно.

От понимания семантики тебя ничего не избавит.

ТЗИ>Понятно было бы так, например:


ТЗИ>
ТЗИ>x = sum of all items in list
ТЗИ>

Это уже другой уровень абстракции, аналогичный Sum(list) или list.Sum() или sum list. Последнее кстати на haskell и повторяет "код" выше при выкидывании ненужных слов. Ведь при понимании семантики суммирования элементов списка тебе совершенно необязательно писать "of all items in".

Кроме того как будет работать intellisense для такого синтаксиса?
Re[2]: Expression Tree для описания алгоритмов
От: barn_czn  
Дата: 17.05.10 03:53
Оценка:
DM>Вообще, очень похожие на Ваши идеи высказывает Степанов (автор STL):
DM>http://video.yandex.ru/users/ya-events/view/129/
DM>http://video.yandex.ru/users/ya-events/view/128/

Большой сенкс за ссылки, дядька просто супер )). Но по моему со сслками вы немного ошиблись. Про обобщенное программирование и идею библиотеки алгоритмов он расказывает здесь.

Правда плохое качество звука и не видно что там у него на слайдах ((. Надо почитать то о чем он рассказывает.
Re[5]: Expression Tree для описания алгоритмов
От: FR  
Дата: 17.05.10 04:06
Оценка:
Здравствуйте, Тролль зеленый и толстый, Вы писали:


ТЗИ> Лол. +100. Это ты знатно отмочил.


Это ты отмачиваешь, меня злобные функциональщики примерно на таком коде и подловили, никаких
проблем с пониманием не было.
Хотя сейчас трава не зеленая уже, и я замечаю что у многих нет фона в виде давно изученного и
пусть даже уже успешно позабытого форта, лиспа и пролога
Re[7]: Expression Tree для описания алгоритмов
От: FR  
Дата: 17.05.10 04:08
Оценка: +1
Здравствуйте, Тролль зеленый и толстый, Вы писали:

ТЗИ>Как ты думаешь, много ли программистов, как ты, изучают в свободное время функциональные языки? Почему ты пытаешься стыдить человека тем, что он не знает функциональных языков?


Еще 10 лет назад было полно народу которые бравировали тем что не знают ООП и он им совершенно не нужен, сейчас это почему-то редкие птицы, странно да?
Re[8]: Expression Tree для описания алгоритмов
От: D. Mon Великобритания http://thedeemon.livejournal.com
Дата: 17.05.10 05:44
Оценка: :))) :)
Здравствуйте, FR, Вы писали:

FR>Еще 10 лет назад было полно народу которые бравировали тем что не знают ООП и он им совершенно не нужен


А сейчас люди изучают ФП и понимают, что ООП действительно не нужен.
Re[6]: Expression Tree для описания алгоритмов
От: Тролль зеленый и толстый  
Дата: 17.05.10 11:28
Оценка: -3
Только не надо совсем в бред впадать. Для человека, не знающего Хаскель, этот кусочек кода представляет собой абракадабру. Только человек с совсем уж искаженным программированием мышлением может заявить, что он по понятности такой же, как псевдокод.

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

Как можно взять нормальный кусок английского текста и сказать, что он по понятности ровно такой же, как что-то вроде
lidfulj3*)(##*&kd*97
(это валидный код на моем собственном языке программирования FuckTheMotherFuckers++, который я придумал пять минут назад, и я этот кусок кода, заметьте, прекрасно понимаю, но никогда не скажу, что он по понятности ничем не уступает английскому тексту, поскольку у меня еще не настолько искаженное программированием сознание).

На этот пост можно не отвечать, так как дальше обсуждать такой очевидный вопрос не вижу смысла.
Re[7]: Expression Tree для описания алгоритмов
От: FR  
Дата: 17.05.10 11:37
Оценка: -2 :)
Здравствуйте, Тролль зеленый и толстый, Вы писали:

ТЗИ>Только не надо совсем в бред впадать. Для человека, не знающего Хаскель, этот кусочек кода представляет собой абракадабру. Только человек с совсем уж искаженным программированием мышлением может заявить, что он по понятности такой же, как псевдокод.


Для человека с неискаженным программированием мышлением любой псевдокод представляет тоже представляет собой абракадабру.
Но если этот человек хоть немного изучал математику хаскельный псевдокод ему будет понятней чем сишный.

ТЗИ>Не люблю, когда люди начинают совсем уж чушь пороть. Бывают разные точки зрения, а бывает просто бред.


Ты сам бредишь, у тебя мозги зомбированы императивщиной.
Re[5]: Expression Tree для описания алгоритмов
От: nikov США http://www.linkedin.com/in/nikov
Дата: 17.05.10 11:53
Оценка:
Здравствуйте, Тролль зеленый и толстый, Вы писали:

FR>>
FR>>qsort []     = []
FR>>qsort (x:xs) = qsort (filter (< x) xs) ++ [x] ++ qsort (filter (>= x) xs)
FR>>


FR>>Ни чем ни хуже чем псевдокод по понятности.


ТЗИ> Лол. +100. Это ты знатно отмочил.


Ну вот давай попробуем написать тот же самый алгоритм русскими словами:

быстрая сортировка пустого списка = пустой список
быстрая сортировка списка, первый элемент которого x, а хвост списка xs = 
  конкатенация 3 списков:
    быстрой сортировки xs, из которого отфильтрованы элементы, меньшие x
    списка из одного элемента x
    быстрой сортировки xs, из которого отфильтрованы элементы, большие или равные x


Единственное, что может быть не сразу очевидно — это смысл операторов [], :, ++, но этот смысл элементарно восстанавливается, если знать, как устроена быстрая сортировка.
Re: Expression Tree для описания алгоритмов
От: Mystic Украина http://mystic2000.newmail.ru
Дата: 17.05.10 12:17
Оценка:
Здравствуйте, barn_czn, Вы писали:

_>Есть у кого предложения на данную тему?


В этом плане мне очень нравится литературное (грамотное) программирование, которое ввел еще Д. Кнут. В этом случае алгоритм пишется в специальной среде, на выходе которой получается TeX-файл, в котором есть описание алгоритма, и исходник на языке программирования (в случае паскаля крайне плохо оформленный). Если говорить про описание алгоритма, то это один из лучших способов (имхо). Основные идеи тут.
Re[6]: Expression Tree для описания алгоритмов
От: Тролль зеленый и толстый  
Дата: 17.05.10 12:20
Оценка: +1 -1
N>
N>быстрая сортировка пустого списка = пустой список
N>быстрая сортировка списка, первый элемент которого x, а хвост списка xs = 
N>  конкатенация 3 списков:
N>    быстрой сортировки xs, из которого отфильтрованы элементы, меньшие x
N>    списка из одного элемента x
N>    быстрой сортировки xs, из которого отфильтрованы элементы, большие или равные x
N>

Вот то-то и оно, что этот алгоритм не только синтаксически, но и семантически непонятен. Собственно говоря, это вообще не быстрая сортировка — это другой алгоритм, работающий совершенно по-другому. Общего с быстрой сортировкой у него только рекурсивность.

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

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

Описание алгоритма шиворот-навыворот + состоящий из значков синтаксис = абракадабра.

Нормальное-то описание алгоритма быстрой сортировки (а не какого-то другого) выглядит примерно так (из Википедии):

Выбираем в массиве некоторый элемент, который будем называть опорным элементом. С точки зрения корректности алгоритма выбор опорного элемента безразличен. С точки зрения повышения эффективности алгоритма выбираться должна медиана, но без дополнительных сведений о сортируемых данных её обычно невозможно получить. Известные стратегии: выбирать постоянно один и тот же элемент, например, средний или последний по положению; выбирать элемент со случайно выбранным индексом.
Операция разделения массива: реорганизуем массив таким образом, чтобы все элементы, меньшие или равные опорному элементу, оказались слева от него, а все элементы, большие опорного — справа от него. Обычный алгоритм операции:
Два индекса — l и r, приравниваются к минимальному и максимальному индексу разделяемого массива соответственно.
Вычисляется индекс опорного элемента m.
Индекс l последовательно увеличивается до m до тех пор, пока l-й элемент не превысит опорный.
Индекс r последовательно уменьшается до m до тех пор, пока r-й элемент не окажется меньше опорного.
Если r = l — найдена середина массива — операция разделения закончена, оба индекса указывают на опорный элемент.
Если l < r — найденную пару элементов нужно обменять местами и продолжить операцию разделения с тех значений l и r, которые были достигнуты. Следует учесть, что если какая-либо граница (l или r) дошла до опорного элемента, то при обмене значение m изменяется на r-й или l-й элемент соответственно.
Рекурсивно упорядочиваем подмассивы, лежащие слева и справа от опорного элемента.
Базой рекурсии являются наборы, состоящие из одного или двух элементов. Первый возвращается в исходном виде, во втором, при необходимости, сортировка сводится к перестановке двух элементов. Все такие отрезки уже упорядочены в процессе разделения.

Re[8]: Expression Tree для описания алгоритмов
От: Тролль зеленый и толстый  
Дата: 17.05.10 12:47
Оценка: +1
FR>Но если этот человек хоть немного изучал математику хаскельный псевдокод ему будет понятней чем сишный.

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

И вообще, хватит отождествлять математику и функциональное программирование. А императивное программирование — это что ли не математика?

Математика — это вообще всего лишь набор формальных соотношений. То, как в математике принято записывать формулы — всего лишь традиция.

То, что функциональное программирование похоже на запись формул в математике, не делает его ближе к математике, чем императивное или какое-либо другое программирование.

FR>Ты сам бредишь, у тебя мозги зомбированы императивщиной.


А ты делаешь ложное противопоставление, не понимая, что функциональное и императивное программирование — всего лишь две эквивалентные формы записи формальных соотношений.
Re[7]: Expression Tree для описания алгоритмов
От: nikov США http://www.linkedin.com/in/nikov
Дата: 17.05.10 12:50
Оценка:
Здравствуйте, Тролль зеленый и толстый, Вы писали:

N>>
N>>быстрая сортировка пустого списка = пустой список
N>>быстрая сортировка списка, первый элемент которого x, а хвост списка xs = 
N>>  конкатенация 3 списков:
N>>    быстрой сортировки xs, из которого отфильтрованы элементы, меньшие x
N>>    списка из одного элемента x
N>>    быстрой сортировки xs, из которого отфильтрованы элементы, большие или равные x
N>>

ТЗИ>Вот то-то и оно, что этот алгоритм не только синтаксически, но и семантически непонятен. Собственно говоря, это вообще не быстрая сортировка — это другой алгоритм, работающий совершенно по-другому. Общего с быстрой сортировкой у него только рекурсивность.

ТЗИ>Хорошенькое мы получаем объяснение алгоритма, приводя другой алгоритм.

ТЗИ>Нормальное-то описание алгоритма быстрой сортировки (а не какого-то другого) выглядит примерно так (из Википедии):

ТЗИ>

ТЗИ>Выбираем в массиве некоторый элемент, который будем называть опорным элементом.


В функциональном описании этот элемент назван x.

ТЗИ>

ТЗИ>Операция разделения массива: реорганизуем массив таким образом, чтобы все элементы, меньшие или равные опорному элементу, оказались слева от него, а все элементы, большие опорного — справа от него.


В функциональном описании эта реорганизация производится двумя вызовами функции filter: слева идут элементы, меньшие опорного элемента, а справа — большие или равные опорному. Но за счет того, что нет деструктивных обновлений списка, не приходится вести всю бухгалтерию с индексами, легко приводящую к ошибкам из-за невнимательности. Код получается короче, понятнее и ленивее (последнее может пригодиться, если нам надо получить только кусок отсортированного массива).

ТЗИ>

ТЗИ>Рекурсивно упорядочиваем подмассивы, лежащие слева и справа от опорного элемента.


В функциональном описани точно такая же рекурсия.
Так что это не другой алгоритм, а самая настоящая быстрая сортировка.

ТЗИ>Описание алгоритма шиворот-навыворот + состоящий из значков синтаксис = абракадабра.

А что, существует синтаксис, не состоящий из значков?
Re[6]: Expression Tree для описания алгоритмов
От: Mystic Украина http://mystic2000.newmail.ru
Дата: 17.05.10 12:50
Оценка:
Здравствуйте, gandjustas, Вы писали:

G>Выделенное — это твои трудности. По факту алгоритм на хаскеле или другом ФЯ оказывается гораздо читаемее.


Зачастую алгоритмы описывают байты и операции с ними, а также включают различные вопросы производительности, что не всегда так уж однозначно переводится на ФЯ. Например, если взять alpha-beta поиск, то там в C-варианте будут функции DoMove, и UndoMove. Соответственно, для того, чтобы функциональный язык генерировал оптимальный код, необходимо чтобы он был в курсе сакрального равенства Position = UndoMove(DoMove(Position, Move), Move).
Re[8]: Expression Tree для описания алгоритмов
От: Тролль зеленый и толстый  
Дата: 17.05.10 13:00
Оценка:
Ладно, какова алгоритмическая сложность алгоритма на Хаскеле? Если это тот же самый алгоритм, его сложность в среднем N log N, так? (Про потребление памяти скромно умолчим).
Re[9]: Expression Tree для описания алгоритмов
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 17.05.10 13:01
Оценка: -1
Здравствуйте, Тролль зеленый и толстый, Вы писали:

FR>>Но если этот человек хоть немного изучал математику хаскельный псевдокод ему будет понятней чем сишный.


ТЗИ>Если человек изучал математику и не изучал программирование, ему оба варианта будут непонятны.

Но хаскельный вариант быстрее будет понят незнающим человеком.

ТЗИ>А вот нормальное описание на естественном языке он с легкостью воспримет.

Только доказать что нормальное "описание на естественном языке" делает то что надо — далеко нетривиальная задача.

ТЗИ>И вообще, хватит отождествлять математику и функциональное программирование. А императивное программирование — это что ли не математика?

Императивное программирование опирается на изменяемое состояние, которое не имеет никакого отношения к математике.

ТЗИ>Математика — это вообще всего лишь набор формальных соотношений. То, как в математике принято записывать формулы — всего лишь традиция.

Программа на том же хаскеле тоже лишь набор формальных (проверяемых компилятором) отношений.

ТЗИ>То, что функциональное программирование похоже на запись формул в математике, не делает его ближе к математике, чем императивное или какое-либо другое программирование.

Доказывать такие утверждения надо.

А вообще математический аппарат (типа индукции) очень хорошо подходит для рассуждения над функциональными программами. А вот императивные программы таким похвастаться не могут. К чему бы это?
Re[7]: Expression Tree для описания алгоритмов
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 17.05.10 13:08
Оценка:
Здравствуйте, Тролль зеленый и толстый, Вы писали:

N>>
N>>быстрая сортировка пустого списка = пустой список
N>>быстрая сортировка списка, первый элемент которого x, а хвост списка xs = 
N>>  конкатенация 3 списков:
N>>    быстрой сортировки xs, из которого отфильтрованы элементы, меньшие x
N>>    списка из одного элемента x
N>>    быстрой сортировки xs, из которого отфильтрованы элементы, большие или равные x
N>>

ТЗИ>Вот то-то и оно, что этот алгоритм не только синтаксически, но и семантически непонятен. Собственно говоря, это вообще не быстрая сортировка — это другой алгоритм, работающий совершенно по-другому. Общего с быстрой сортировкой у него только рекурсивность.
Ты не знаешь быструю сортировку.

ТЗИ>Нормальное-то описание алгоритма быстрой сортировки (а не какого-то другого) выглядит примерно так (из Википедии):


ТЗИ>

ТЗИ>Выбираем в массиве некоторый элемент, который будем называть опорным элементом. С точки зрения корректности алгоритма выбор опорного элемента безразличен. С точки зрения повышения эффективности алгоритма выбираться должна медиана, но без дополнительных сведений о сортируемых данных её обычно невозможно получить. Известные стратегии: выбирать постоянно один и тот же элемент, например, средний или последний по положению; выбирать элемент со случайно выбранным индексом.
ТЗИ>Операция разделения массива: реорганизуем массив таким образом, чтобы все элементы, меньшие или равные опорному элементу, оказались слева от него, а все элементы, большие опорного — справа от него. Обычный алгоритм операции:
ТЗИ>Два индекса — l и r, приравниваются к минимальному и максимальному индексу разделяемого массива соответственно.
ТЗИ>Вычисляется индекс опорного элемента m.
ТЗИ>Индекс l последовательно увеличивается до m до тех пор, пока l-й элемент не превысит опорный.
ТЗИ>Индекс r последовательно уменьшается до m до тех пор, пока r-й элемент не окажется меньше опорного.
ТЗИ>Если r = l — найдена середина массива — операция разделения закончена, оба индекса указывают на опорный элемент.
ТЗИ>Если l < r — найденную пару элементов нужно обменять местами и продолжить операцию разделения с тех значений l и r, которые были достигнуты. Следует учесть, что если какая-либо граница (l или r) дошла до опорного элемента, то при обмене значение m изменяется на r-й или l-й элемент соответственно.
ТЗИ>Рекурсивно упорядочиваем подмассивы, лежащие слева и справа от опорного элемента.
ТЗИ>Базой рекурсии являются наборы, состоящие из одного или двух элементов. Первый возвращается в исходном виде, во втором, при необходимости, сортировка сводится к перестановке двух элементов. Все такие отрезки уже упорядочены в процессе разделения.


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

Если собрать выделенное, с учетом последнего замечания, то получится примерно тоже самое что приводил nikov
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.