|
|
|
Функциональное программирование
|
|||
|---|---|---|---|
|
#18+
Январский рейтинг языков программированияРейтинг составляется на основе интеллектуального подсчета упоминаний конкретного языка программирования при поиске в Google, Google Blogs, MSN, Yahoo!, Wikipedia и YouTube. Он затрагивает только тьюринг-полные языки, не учитывая, например, SQL или HTML, а также ассемблер ввиду его специфичности. Хм.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2010, 12:06:10 |
|
||
|
Функциональное программирование
|
|||
|---|---|---|---|
|
#18+
Gluk (Kazan), 1. Покажем что любую частично рекурсивную функцию можно реализовать на SQL : Базовые функции - нулевая (0), следования (n+1), выбора ({x1,...,xn}->xi) заложены в логику операторов и выражений (она в SQL точно такая же как во всех императивных языках). Достаточно очевидно чтобы останавливаться на этом. Оператор подстановки (h(x1,x2,...,xn)=f(g1(x1,..,xn),...,gn(x1,...xn)) - реализуется при помощи Join, cоздается JOIN подзапроса вычисления f, с условия для ON соответственно {параметрI=gI(x1,...,xn), AND} Оператор минимизации аргумента h(x1,...,xn-1)=min(y), при условии f(x1,...,xn-1,y) = 0, делается при помощи Group By, в group by идет x1,...,xn-1, в where f(x1,...,xn-1,y) = 0, а выражением будет min(y) Оператор примитивной рекурсии h(x1,...,xn,0) = f(x1,...,xn), h(x1,...,xn,y+1) = g(x1,...,xn,y,h(x1,..,xn,y)) - собственно реализация рекурсивного CTE и делалась с оператора примитивной рекурсии, делаешь with h(x1,...,xn,y), до UNION ALL (начальный шаг) ставишь f и 0, после UNION ALL, SELECT'аешь g и y+1. Конечно можно написать формальное доказательство но это будет не 10 зря потраченных минут, а все 4 часа. Все тоже самое касается сравнения грамматик, но итак очевидно что в базовом императивном алгоритме количестве правил ну явно не больше SQL, который из-за своей кривоты еще больше усложнен чем мог бы быть, но все равно нормально оптимизируется ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2010, 12:23:55 |
|
||
|
Функциональное программирование
|
|||
|---|---|---|---|
|
#18+
Nitro_Junkie wrote: > В любом случае вы почему-то считаете что SQL проще структурного кода, > что явно не так. Грамматика первого состоит где-то из правил 5-10, а > грамматика второго в несколько раз больше. Простота языка и простота грамматики языка -- это не одно и то же. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2010, 12:31:40 |
|
||
|
Функциональное программирование
|
|||
|---|---|---|---|
|
#18+
Nitro_Junkie wrote: > Если у вас плохо с образованием, вам не читали теорию грамматик, и вы > даже не понимаете что именно я имею ввиду под структурным > программированием и его грамматикой (и конкретный синтаксис тут роли не > играет), то я вам ее рисовать здесь не буду, воспользуйтесь поиском... Слушай, ты постоянно подменяешь понятия. Структурное программирование тоже НИКАК не связано с грамматикой языка. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2010, 12:36:27 |
|
||
|
Функциональное программирование
|
|||
|---|---|---|---|
|
#18+
Nitro_JunkieGluk (Kazan), ... Конечно можно написать формальное доказательство но это будет не 10 зря потраченных минут, а все 4 часа. Все тоже самое касается сравнения грамматик, но итак очевидно что в базовом императивном алгоритме количестве правил ну явно не больше SQL, который из-за своей кривоты еще больше усложнен чем мог бы быть, но все равно нормально оптимизируется 1. отвечу позже 2.1 в "алгоритме" нет правил грамматики 2.2 если имеется в виду некий абстрактный максимально примитивный язык, достаточный для выражения всех императивных конструкций и базовых типов данных, непонятно, почему мы не рассматриваем грамматику для столь же базового примитивного "SQL" (пусть даже с введенным CTE), а норовим сравнить с последним стандартом ??? двойные стандарты ? Уверяю тебя, в SQL правил будет меньше, но суть не в этом 2.3 как правильно заметил MasterZiv, сложность языка никак не связана со сложностью описывающей его грамматики. Взять хоть LISP ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2010, 12:43:51 |
|
||
|
Функциональное программирование
|
|||
|---|---|---|---|
|
#18+
MasterZiv, Смотря что понимать под простотой. Простота понимания\задания - как правило сильно коррелировано с простотой грамматики. Человеку с улицы императивные принципы ближе чем декларативные. К примеру именно первые используются в описании бизнес-процессов. А вот простота реализации и в частности оптимизации может сильно отличаться от простоты задания. То есть в проектировании\создании архитектуры они тоже коррелированы - так называемая бритва Оккама применима именно к нему. А вот в алгоритмике ярким примером не работы этого принципа можно считать большую теорему ферма, где задача формулируется одним предложением, а решение на 30 страницах. Но собственно об этом и шел спор, что параллелятся именно декларативные языке не потому что они проще или узко-специфичны, а потому что они лучше для этого подходят... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2010, 12:46:25 |
|
||
|
Функциональное программирование
|
|||
|---|---|---|---|
|
#18+
Gluk (Kazan), А я и не говорил про современные диалекты SQL, SQL-92 без наворотов+рекурсивных CTE вполне хватит... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2010, 12:48:13 |
|
||
|
Функциональное программирование
|
|||
|---|---|---|---|
|
#18+
MasterZiv, Это как раз вы цепляетесь к словам. Как еще можно формально описать структурное программирование (как и любое другое) как не через абстрактную грамматику языка его использующего. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2010, 12:51:08 |
|
||
|
Функциональное программирование
|
|||
|---|---|---|---|
|
#18+
Nitro_JunkieMasterZiv, Wikipedia Функциона́льное программи́рование — раздел дискретной математики и парадигма программирования, в которой процесс вычисления трактуется как вычисление значений функций в математическом понимании последних (в отличие от функций как подпрограмм в процедурном программировании). Противопоставляется парадигме императивного программирования, которая описывает процесс вычислений как последовательность изменения состояний (в значении, подобном таковому в теории автоматов). Функциональное программирование не предполагает изменяемость данных (в отличие от императивного, где одной из базовых концепций является переменная) . На практике отличие математической функции от понятия «функции» в императивном программировании заключается в том, что императивные функции взаимодействуют и изменяют уже определённые данные. Таким образом, в императивном программировании, при вызове одной и той же функции с одинаковыми параметрами можно получить разные данные на выходе, из-за влияния на функцию внешних факторов. А в функциональном языке при вызове функции с одними и теми же аргументами мы всегда получим одинаковый результат в обоих случаях, входные данные не могут измениться, выходные данные зависят только от них. Первые 2 абзаца в википедии про функциональное программирование... Таким образом SQL более удовлетворяет определению функционального программирования чем тот же Haskell или тем более Lisp... PS: Хотя счас конечно скажут, что википедия не аргумент, что у каждого свое определение ФП, и т.п. А когда каждый придумывает сам определения, разговаривать о чем бы то ни было бесполезно... Сравнил а английским вариантом "определения" - переводящий похоже не в теме был. Да и английский вариант - какая-то туфта. Императивное программирование вроде по учебникам определяется как программирование через прямые команды компьютеру - как делать. А декларативное только заданием - что делать. То есть функция в императивном программировании - всего лишь сгруппированные команды, а функция в ФП - ближе к математической функции. Само собой контекст вычисления в ФП контролируется лучше. Об этом вроде в ангельском варианте. И как уже отмечалось состояния есть. Собственно и КАМ (Категориальная абстрактная машина, в название языка OCAML - CAM - в честь КАМ, Haskell, SML, Moscow ML тоже с КАМ теор. связаны) определяется на состояниях (по учебникам же). КАМ более программ. ориент. категориальная комбинАторная логика) ------------------------------------ Вопрос: насколько практически ценно создать создать виртуальную машина вроде JVM, NET, но специально под функциональные языки? Как в этом теоретически КАМ (более программ. ориент. категориальная комбинАторная логика) поможет? Конечно КАМ в общем такая же абстракция как и машина Тьюринга, и частично-рекурсивные функции, ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2010, 13:17:10 |
|
||
|
Функциональное программирование
|
|||
|---|---|---|---|
|
#18+
Nitro_Junkie 1. Покажем что любую частично рекурсивную функцию можно реализовать на SQL : Базовые функции - нулевая (0), следования (n+1), выбора ({x1,...,xn}->xi) заложены в логику операторов и выражений (она в SQL точно такая же как во всех императивных языках). Достаточно очевидно чтобы останавливаться на этом. давай будем конкретнее select 0 from arguments; select x+1 from arguments; select xi from arguments; Имеешь в виду? Если нет, твои варианты запросов??? Если да, вопросы: 1. select всегда будет возвращать скаляр (одна столбец одной строки)? 2. как в функцию передавать аргументы? т.е. откуда их брать??? 3. как быть с не однострочными запросами? на мой взгляд, более удачным было бы считать аргументами строки, но и тут возникнет масса вопросов. Nitro_Junkie Оператор подстановки (h(x1,x2,...,xn)=f(g1(x1,..,xn),...,gn(x1,...xn)) - реализуется при помощи Join, cоздается JOIN подзапроса вычисления f, с условия для ON соответственно Что означает "JOIN позапроса"? запросы в JOIN одноуровневые Пример SQL-запроса, если не сложно, для f(g(x))? Что мы будем считать оператором??? (join, union,...)? Nitro_Junkie Оператор минимизации аргумента h(x1,...,xn-1)=min(y), при условии f(x1,...,xn-1,y) = 0, делается при помощи Group By, в group by идет x1,...,xn-1, в where f(x1,...,xn-1,y) = 0, а выражением будет min(y) Меня опять терзают смутные соменения. Примерчик запроса можно??? в частности интересно, что будет в where? Nitro_Junkie Оператор примитивной рекурсии h(x1,...,xn,0) = f(x1,...,xn), h(x1,...,xn,y+1) = g(x1,...,xn,y,h(x1,..,xn,y)) - собственно реализация рекурсивного CTE и делалась с оператора примитивной рекурсии, делаешь with h(x1,...,xn,y), до UNION ALL (начальный шаг) ставишь f и 0, после UNION ALL, SELECT'аешь g и y+1. опять же, примерчик запроса не помешает. понимаешь, тебе со своими мыслями разобраться проще чем окружающим. Ты можешь не договаривать что-то, считая это очевидным, при том что для окружающих это не так. В любом случае, ты ничего не теряешь, а лишь приобретаешь ясность концепции :) Или ты не можешь сказать как будут выглядеть все эти запросы ??? Nitro_Junkie Конечно можно написать формальное доказательство но это будет не 10 зря потраченных минут, а все 4 часа. инвестиции в собственный мозг - это, как правило, очень удачные инвестиции ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2010, 13:19:45 |
|
||
|
Функциональное программирование
|
|||
|---|---|---|---|
|
#18+
Nitro_JunkieНо собственно об этом и шел спор, что параллелятся именно декларативные языке не потому что они проще или узко-специфичны, а потому что они лучше для этого подходят... передергиваешь, либо не понял о чем шел спор. я не говорил, что декларативные языки узко-специфичны и потому лучше параллелятся, это ты выдумал ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2010, 13:22:54 |
|
||
|
Функциональное программирование
|
|||
|---|---|---|---|
|
#18+
Nitro_JunkieGluk (Kazan), А я и не говорил про современные диалекты SQL, SQL-92 без наворотов+рекурсивных CTE вполне хватит... Тогда давай и язык брать какой-то образца 90 годов Pascal например. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2010, 13:25:53 |
|
||
|
Функциональное программирование
|
|||
|---|---|---|---|
|
#18+
Gluk (Kazan), Я уже писал SQL расматриваем как абсолютно функциональный язык, то есть таблица это функция. И он возвращает не один параметр - одно значение, а сразу - все возможные параметры -> значения. Соотвественно чтобы не смешивать несколько функций, говорим что в одной таблице, все ключи как колонки + и плюс еще одна колонка значение функции. Так как это чисто функциональный язык вопрос передачи параметров состоит из выбора в результате выполнения твоего SELECT'а нужного параметра, то есть абстрагируемся от этого. JOIN состоит из таблицы\подзапроса и условия связывания читаем книгу по SQL для f(g()) - допустим SELECT ... JOIN g1 ON ... JOIN g2 ON ... JOIN f ON f.x1=g1.value AND f.x2=g2.value ... AND f.xn = gn.value - что тебе не понятно? Опять же для минимизации аргумента : SELECT MIN(f.y) FROM f GROUP BY f.x1,f.x2,...,f.xn WHERE f.value=0 CTE - дольше расписывать, лень время тратить, но надеюсь идею ты понял... хотя могу расписать, если совсем тяжело ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2010, 13:35:18 |
|
||
|
Функциональное программирование
|
|||
|---|---|---|---|
|
#18+
Gluk (Kazan)Nitro_JunkieGluk (Kazan), А я и не говорил про современные диалекты SQL, SQL-92 без наворотов+рекурсивных CTE вполне хватит... Тогда давай и язык брать какой-то образца 90 годов Pascal например. Бери мне не жалко... Сможешь написать виртуальную машину распараллеливающую его в общем случае? Кстати не уверен что этого нельзя сделать, но кажется что в отличии от SQL задача NP-полная ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2010, 13:36:35 |
|
||
|
Функциональное программирование
|
|||
|---|---|---|---|
|
#18+
Gluk (Kazan)передергиваешь, либо не понял о чем шел спор. я не говорил, что декларативные языки узко-специфичны и потому лучше параллелятся, это ты выдумал Ты говорил : Gluk (Kazan)Там не распараллеливание, а оптимизация в полный рост. И не за счет декларативности, а за счет узкой сцепифичности задачи Вообще SQL один из немногих реально декларативных языков (как их определить очень удачно описал Пилотажный сверху) так что ты сам себе противоречишь ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2010, 13:39:23 |
|
||
|
Функциональное программирование
|
|||
|---|---|---|---|
|
#18+
Nitro_Junkie асматриваем как абсолютно функциональный язык, то есть таблица это функция. И он возвращает не один параметр - одно значение, а сразу - все возможные параметры -> значения. Соотвественно чтобы не смешивать несколько функций, говорим что в одной таблице, все ключи как колонки + и плюс еще одна колонка значение функции. т.е. функцией является все-таки таблица, а не select-запрос? что является значениями? если опять-же таблице, как передать их таблице (функции)? Вопрос о примерах функций остается в силе. у меня создается впечатление, что ВЫ не можете это сформулировать??? Nitro_Junkie JOIN состоит из таблицы\подзапроса и условия связывания читаем книгу по SQL какую книгу? У меня JOIN состоит из двух равноправных таблиц: select * from T1, T2 где здесь подзапрос??? Nitro_Junkie для f(g()) - допустим SELECT ... JOIN g1 ON ... JOIN g2 ON ... JOIN f ON f.x1=g1.value AND f.x2=g2.value ... AND f.xn = gn.value - что тебе не понятно? Будет понятнее с мааааленьким примерчиком табличек g и f (последняя вполне достаточна от одного аргумента). Nitro_Junkie Опять же для минимизации аргумента : SELECT MIN(f.y) FROM f GROUP BY f.x1,f.x2,...,f.xn WHERE f.value=0 CTE пока оставим. Идею надеюсь пойму когда дашь примерчики с содержимым таблиц и запросами, выражающими операторы минимизации аргумента и подстановки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2010, 13:47:14 |
|
||
|
Функциональное программирование
|
|||
|---|---|---|---|
|
#18+
Nitro_JunkieGluk (Kazan)Nitro_JunkieGluk (Kazan), А я и не говорил про современные диалекты SQL, SQL-92 без наворотов+рекурсивных CTE вполне хватит... Тогда давай и язык брать какой-то образца 90 годов Pascal например. Бери мне не жалко... Сможешь написать виртуальную машину распараллеливающую его в общем случае? Кстати не уверен что этого нельзя сделать, но кажется что в отличии от SQL задача NP-полная ты опять стекаешь куда-то. На кой мне его параллелить? мы вроде их грамматики мерять собирались??? кстати, отнюдь не любой SQL-запрос можно распараллелить и куда более чем не любой параллелить нужно. подумай над этим. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2010, 13:49:02 |
|
||
|
Функциональное программирование
|
|||
|---|---|---|---|
|
#18+
Nitro_JunkieGluk (Kazan)передергиваешь, либо не понял о чем шел спор. я не говорил, что декларативные языки узко-специфичны и потому лучше параллелятся, это ты выдумал Ты говорил : Gluk (Kazan)Там не распараллеливание, а оптимизация в полный рост. И не за счет декларативности, а за счет узкой сцепифичности задачи Вообще SQL один из немногих реально декларативных языков (как их определить очень удачно описал Пилотажный сверху) так что ты сам себе противоречишь Неа. Я говорил, что SQL параллелится (в некоторых местах) за счет своей специализации, а не за счет декларативности. Поясни, как из этого вытекает, что ВСЕ декларативные языки узко-специализированы (и именно поэтому лучше параллелятся) ??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2010, 13:51:22 |
|
||
|
Функциональное программирование
|
|||
|---|---|---|---|
|
#18+
Nitro_Junkie, Аргументация полноты неубедительна. Join это умножение множеств, а не подстановка. Ну и с остальными операциями маловато точности в "предъявах". Но SQL без процедурных расширений в абсолютной трансизоляции, все таки декларативен. Gluk (Kazan) Сообразил ответ, почему СУБД плохо подходят как хранилище переменных для языка: 0. Слишком много посредников xDBC и ему подобные. 1. Доступ из языка очень неудобный, вызов предварительных действий для обращения к переменной, да и само обращение через процедуры с десятком параметров ( Может быть, алл знает примеры языков (желательно из области ФП и слегка современных), с родным в языке обращением в БД (постоянным хранением данных или результатов вычислений). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2010, 13:56:01 |
|
||
|
Функциональное программирование
|
|||
|---|---|---|---|
|
#18+
Siemarg Сообразил ответ, почему СУБД плохо подходят как хранилище переменных для языка: 0. Слишком много посредников xDBC и ему подобные. 1. Доступ из языка очень неудобный, вызов предварительных действий для обращения к переменной, да и само обращение через процедуры с десятком параметров ( На практике это не проблема Siemarg Может быть, алл знает примеры языков (желательно из области ФП и слегка современных), с родным в языке обращением в БД (постоянным хранением данных или результатов вычислений). Erlang+Mnesia очень ФП и современно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2010, 13:59:53 |
|
||
|
Функциональное программирование
|
|||
|---|---|---|---|
|
#18+
Nitro_JunkieЯ уже писал SQL расматриваем как абсолютно функциональный язык, то есть таблица это функция. Еще раз медленно: SQL - это язык операций рел. алгебры. Операнды операций - таблицы. Результат операций - таблица. Операции это функции. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2010, 14:04:58 |
|
||
|
Функциональное программирование
|
|||
|---|---|---|---|
|
#18+
_модNitro_JunkieЯ уже писал SQL расматриваем как абсолютно функциональный язык, то есть таблица это функция. Еще раз медленно: SQL - это язык операций рел. алгебры. Операнды операций - таблицы. Результат операций - таблица. Операции это функции. ну что ты за него, пусть сам :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2010, 14:22:19 |
|
||
|
Функциональное программирование
|
|||
|---|---|---|---|
|
#18+
нихера не понял :) об чем тут споры Я распараллеливание понимаю только как сделано в Питоне, через yield (что было содрано Питоном у языка Icon) Т.е. ты чик-чик , из функции , назад , опять туда же, потом в другую GOTO в чистом виде, все контексты висят где-то, ждут своего продолжения Я вот проверил для себя факторизацию с кучей вызовов, с разными параметрами и вы знаете тут явно есть польза ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2010, 15:02:30 |
|
||
|
Функциональное программирование
|
|||
|---|---|---|---|
|
#18+
Siemargl, _мод Повторяю для всех кто плохо читает... Рассматриваем SQL во 2 или какой там НФ. В которой у любой таблицы есть ключи и связывание всегда идет по этим ключам. Соответственно во такой форме Join это как раз подстановка, а не умножение множеств. И вообще уже не реляционная алгебра, а "функциональная" получается. Gluk, Join'ить можно не только таблицы но и запросы, если вы не в курсе. Пример дам с таблицами g (сложение всех чисел до 2) f (увеличение на 1 всех чисел до 4) k1, k2, value k1, value 1 1 2 1 2 1 2 3 2 3 2 1 3 3 4 2 2 4 4 5 Соответственно подстановка SELECT g.k1, g.k2 FROM g JOIN f ON f.k1=g.value получаем функцию a+b+1 для a и b <= 2 Можно расширить эти таблицы до любого счетного множества.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.01.2010, 15:05:23 |
|
||
|
|

start [/forum/topic.php?fid=16&msg=36438388&tid=1343707]: |
0ms |
get settings: |
13ms |
get forum list: |
17ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
237ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
63ms |
get tp. blocked users: |
1ms |
| others: | 213ms |
| total: | 560ms |

| 0 / 0 |
