Вот, сделал в Википедии табличку Сравнение языков программирования. Можно заполнить пропущенные значения, исправить где я ошибся, дописать побольше параметров сравнения и еще несколько языков.
Заодно будет возможность еще раз доказать, что ВАШ язык — самый лучший.
Здравствуйте, nikov, Вы писали:
N>Вот, сделал в Википедии табличку Сравнение языков программирования. Можно заполнить пропущенные значения, исправить где я ошибся, дописать побольше параметров сравнения и еще несколько языков. N>Заодно будет возможность еще раз доказать, что ВАШ язык — самый лучший.
Не думаю что это хорошая идея. Все таки лучше сравнивать однотипные языки. Которые позиционируются как Что-нибудь вроде D и С++. Ну например, зафигом goto или break в Haskell или Miranda. Или вообще если попробывать описать Refal по данной таблице, то вообще непонятно что. Что значит для него препроцессор, если он обладает свойством суперкомпилятора. То есть он может менять свой код в процессе исполнения. И что значит Bootstrapping для Refal'a или Lisp? Сделать транслятор себя в себя для Schema или для Refal — достаточно просто. К тому же для Lisp существуют до фига реализаций которые достаточно различны. Для некоторых Schema — есть pattern matching. Для некоторых нет. Вывод типов для динамической типизации, тоже непонятен.
Вобщем, можно сравнивать императивные с императивными, функциональные с функциональными, логические с логическими. И это в худшем случае. В лучшем неплохо выделять слаботипизированность — строготипизированность. Или например по данной квалификации:здесь
Здравствуйте, GlebZ, Вы писали:
GZ>Не думаю что это хорошая идея. Все таки лучше сравнивать однотипные языки. Которые позиционируются как Что-нибудь вроде D и С++.
В целом — я согласен. Есть параметры, по которым язки разных парадигм сравнивать невозможно или бессмысленно. В текущем варианте таблицы для этого предусмотрен крстик ("Данная постановка вопроса не применима к этому языку"). Возможно стоит сделать для таких параметров отдельную таблицу для каждой группы языков. Но есть и параметры, которые имеют смысл почти для всех языков общего назначения, например поддержка длинных целых чисел и т.д.
Это вики, так что любое улучшение, реорганизация и доделка приветствуются.
Здравствуйте, nikov, Вы писали:
N>Это вики, так что любое улучшение, реорганизация и доделка приветствуются.
И еще нужно добавить Оберон и Zonnon — детища Вирта и его детей...
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, nikov, Вы писали:
N>Это вики, так что любое улучшение, реорганизация и доделка приветствуются.
Да нет. Мое IMHO что данная таблица концептуально неверна. Она внесет элемент неточности, недосказанности что для энциклопедического сайта не совсем хорошо. Ну например, даже в таком виде в C# нет кортежей. Зато есть понятие анонимных типов. Вводить новую строку? Или понятие замыкания. Для C# замыкание работает только на уровне лямбда+анонимов. Для JavaScript/Pascal — на локальных функциях. А в JavaScript все целочисленные значения прозрачно приводятся к double или string в зависимости от контекста использования. Это типа такой прием слаботипизированности. Их считать как целые числа произвольной длины? То есть мы можем вырастить таблицу по вертикали неимоверно, при этом не избавившись полностью от неоднозначности. А если учесть что SQL, XSL/XQuery — также являются языками программирования, то и вдоль.
Вобщем, по моему IMHO, это была бы достаточно интересная для дальнейшего обсуждения в Философии/Св. войнах, но не для энциклопедии.
PS. В англ. варианте здесь неодназначностей значительно меньше. Но и недосказанность присутсвует.
Условная компиляция — Есть в GHC
Макросы препроцессора — Есть в GHC
Включение файлов — Есть в GHC
Шаблоны — Есть в GHC
Поддержка Unicode в идентификаторах — Есть в GHC
Неуправляемые указатели — С помощью модуля System сообразить можно
Целые числа с контролем границ — Нет
Вывод типов переменных из инициализатора — Если под инициализатором имеется в виду конструктор типа, то есть
Вывод типов переменных из использования — Есть
Алиасы типов — Есть
Параметрический полиморфизм с ковариантностью — А что это такое, если не секрет?
Перегрузка функций — Есть, основана на классах типов
Значения параметров по умолчанию — Нет
Локальные функции — Есть
Вывод сигнатуры для локальных функций — Есть
Цикл foreach — Есть, это функция map
Информация о типах в runtime — Есть
Информация о типах-параметрах в runtime — Не уверен, но думаю, что есть
Инструкция goto — В принципе нет, но можно сделать, при желании
Инструкции break без метки, Инструкции break без метки — аналогично goto
Поддержка try/catch — Есть, функция catch. Если кого-то не устраивает, он может сделать собственный вариант
Блок finally, Блок else (исключения) — аналогично goto
Здравствуйте, nikov, Вы писали:
N>Вот, сделал в Википедии табличку Сравнение языков программирования. Можно заполнить пропущенные значения, исправить где я ошибся, дописать побольше параметров сравнения и еще несколько языков.
Пункт "макросы препроцессора", (+) стоит только у C++. Похвально...
А куда припахать макросы вне препроцессора? У Lisp, Nemerle и Template Haskell это важные части языка, причём куда более мощные, чем сишные макросы.
Шаблоны. "Наличие шаблонов наподобие C++ template". До какой степени это подобие? Генерики в Java, классы типов в Haskell — это уже далеко от подобия?
Во всяком случае, язык многопараметрических типов классов в GHC — тьюринг-полный, то есть не уступает возможностям плюсовых шаблонов по созданию чудо-программ
N>Заодно будет возможность еще раз доказать, что ВАШ язык — самый лучший.
Эта таблица — а, скорее всего, вообще любая такая таблица, — обусловлена выбором опорного языка или семейства языков.
Для функциональных языков на первое место вылезут особенности системы типов, порядок вычисления и т.п., а всякие тонкости управляющих конструкций (goto/break/named break) просто пропадут из внимания.
Для объектно-ориентированных языков — возможности рефлексии, конструирования классов в различные моменты существования программы (макропроцессор, компилятор, рантайм), разнообразное наследование.
И так далее.
Здесь, скорее, преобладает процедурно-ориентированный подход. Но тогда где все фортраны?
Если попробовать обозреть сразу все знания в одной таблице — то
1) она разрастётся
2) там будут огромные кластеры минусов или крестиков
Значит, в сводной таблице должны быть только какие-то базовые сведения. Каков размер этого базиса — это предмет для обсуждения.
Здравствуйте, nikov, Вы писали:
N>Вот, сделал в Википедии табличку Сравнение языков программирования. Можно заполнить пропущенные значения, исправить где я ошибся, дописать побольше параметров сравнения и еще несколько языков.
Таблица мало о чём вообще говорит.
Может лучше статью «проблема — решение», вспомнить откуда все эти фичи выросли, и какие у них есть аналоги.
Например, была проблема освобождения ресурсов при выходе. Си решает через goto, C++ решает через автоматически вызывающиеся деструкторы, C# решает через Dispose + специальную конструкцию, (кстати, я не видел примера интенсивной работы с ресурсами в ФП).
Или проблема == для пользовательских типов, ради такого же удобства работы, как и со встроенными (DateTime, Point3D, Complex). Си — нет решения, С++ — есть, Basic — нет, Хаскель — есть.
Или вот «включение файлов», оно же растет из модульности, так в .Net например модульность гораздо круче, чем корявая её эмуляция через включения хидеров.
По Java:Условная компиляция. В Java все проверки внутренней корректности, осуществляемые утверждениями (зарезервированным словом assert):
assert obj != null: "Ошибка!";
, являющимися аналогом .NET-класса System.Diagnostic.Debug, всегда включаются в байт-код, но при запуске виртуальной машины могут быть разрешены (ключом -ea/-enableassertion) или запрещены (по умолчанию так и есть, все утверждения просто игнорируются при исполнении). Можно ли считать это наличием условной компиляции?
Локальные функции. Некоторый суррогат в Java есть — анонимные классы:
obj.someMethod(new ISomeInterface() {
public void someImplementedMethod() {
...
}
});
Канает?
Поддержка Unicode в идентификаторах. Есть.
N>Вот, сделал в Википедии табличку Сравнение языков программирования. Можно заполнить пропущенные значения, исправить где я ошибся, дописать побольше параметров сравнения и еще несколько языков.
Задумка неплохая. По крайней мере, получается гораздо информативнее, чем в английской Вики.
ИМХО стоит как-то сгруппировать требования, т.к. список пока совершенно нечитаемый (нарушается правило 7+-2).
Ещё вспомнилась статья Джоэла Сполски про фичи языков — может, чем-то пригодится.
N>Вот, сделал в Википедии табличку Сравнение языков программирования. Можно заполнить пропущенные значения, исправить где я ошибся, дописать побольше параметров сравнения и еще несколько языков.
+- — неинофрмативно. Имхо, лучше добавить фоновый цвет — зеленый(+), красный (-), желтый(+-), серый(неприменимо), белый(недостаточно информации)
Здравствуйте, nikov, Вы писали:
N>Вот, сделал в Википедии табличку Сравнение языков программирования. Можно заполнить пропущенные значения, исправить где я ошибся, дописать побольше параметров сравнения и еще несколько языков.
я добавил ссылку на http://www.prowiki.org/wiki4d/wiki.cgi?LanguagesVersusD и слегка подкорректировал хаскловкую часть. очень хорошо, что ты сделал разъяснения, только вот "как это сделано в скала" неинформативно для тех, кто её не знает
имхо, надо выкинуть первые пункты насчёт препроцессора — они С-специфичны, и наверно объединить tenplates/generics/type classes вместе
>Возможность создавать type constructors высших порядков (как в Scala)
Здравствуйте, Mamut, Вы писали:
M>+- — неинофрмативно. Имхо, лучше добавить фоновый цвет — зеленый(+), красный (-), желтый(+-), серый(неприменимо), белый(недостаточно информации)
А Википедии встречается выделение в таблицах цветом? Не будет выбиваться из общего оформления?
Здравствуйте, BulatZiganshin, Вы писали:
>>Возможность создавать type constructors высших порядков (как в Scala) BZ>такое сойдёт: BZ>data List a = Nil | Cons a (List a) BZ>?
Здравствуйте, palm mute, Вы писали:
PM>Здравствуйте, deniok, Вы писали:
D>>The requested URL /~adriaan/files/higher.pdf): was not found on this server. PM>Без последней скобки работает: http://www.cs.kuleuven.be/~adriaan/files/higher.pdf
А я-то ее искал... Спасибо!
BZ>и слегка подкорректировал хаскловкую часть. очень хорошо, что ты сделал разъяснения, только вот "как это сделано в скала" неинформативно для тех, кто её не знает
BZ>имхо, надо выкинуть первые пункты насчёт препроцессора — они С-специфичны,
Выкинул.
BZ>и наверно объединить tenplates/generics/type classes вместе
Я предполагал разделить шаблоны C++, в которых семантика выражений может определиться только после подстановки конкретного типа и их раскрытия, и generics (я выделил их в строку "Параметрический полиморфизм"). Надо или полностью объединить их, или привести твои правки в соответствие.
>>Возможность создавать type constructors высших порядков (как в Scala)
BZ>такое сойдёт:
BZ>data List a = Nil | Cons a (List a)
BZ>?
Вроде бы это первого порядка. Высшего порядка — это когда type parameter сам является type constructor'ом, то есть принимает параметры.
Здравствуйте, nikov, Вы писали:
BZ>>и наверно объединить tenplates/generics/type classes вместе
N>Я предполагал разделить шаблоны C++, в которых семантика выражений может определиться только после подстановки конкретного типа и их раскрытия, и generics (я выделил их в строку "Параметрический полиморфизм"). Надо или полностью объединить их, или привести твои правки в соответствие.
ок, тогда надо откатить мои правки. только интересно, куда мы занесём type classes?
>>>Возможность создавать type constructors высших порядков (как в Scala)
BZ>>такое сойдёт:
BZ>>data List a = Nil | Cons a (List a)
BZ>>?
N>Вроде бы это первого порядка. Высшего порядка — это когда type parameter сам является type constructor'ом, то есть принимает параметры.
вот такое у меня есть в одной либе:
-- | Type functions which converts universal ST/IO types to IO-specific ones
type IOSpecific (a :: * -> *) = a RealWorld
type IOSpecific2 (a :: * -> * -> *) = a RealWorld
type IOSpecific3 (a :: * -> * -> * -> *) = a RealWorld
data WithEncoding m h = WithEncoding h !(Encoding m) -- Encoding
!(Char -> m ()) -- putChar inlined
!(m Char) -- getChar inlined
первое — алиас с параметром высшего порядка, второе — тип данных, параметризуемый монадой (которая является конструктором типов). так что зачёт!
Здравствуйте, BulatZiganshin, Вы писали:
N>>Я предполагал разделить шаблоны C++, в которых семантика выражений может определиться только после подстановки конкретного типа и их раскрытия, и generics (я выделил их в строку "Параметрический полиморфизм"). Надо или полностью объединить их, или привести твои правки в соответствие.
BZ>ок, тогда надо откатить мои правки.
Откатил.
BZ>только интересно, куда мы занесём type classes?
Я не спец в Haskell, но насколько я понимаю, они очень похожи на возможность указывать интерфейсы в качестве констрейнтов у generic-типов и generic-функций. Или за ними стоит что-то большее?
>>>>Возможность создавать type constructors высших порядков (как в Scala)
BZ>первое — алиас с параметром высшего порядка, второе — тип данных, параметризуемый монадой (которая является конструктором типов). так что зачёт!
Здравствуйте, nikov, Вы писали:
N>Вот, сделал в Википедии табличку Сравнение языков программирования. Можно заполнить пропущенные значения, исправить где я ошибся, дописать побольше параметров сравнения и еще несколько языков.
N>Заодно будет возможность еще раз доказать, что ВАШ язык — самый лучший.
Это не встроенное средство. try/catch/finally и прочие не являются операторами, это функции модуля Error.pm, из-за особенностей синтаксиса Perl похожие на операторы.
M>>+- — неинофрмативно. Имхо, лучше добавить фоновый цвет — зеленый(+), красный (-), желтый(+-), серый(неприменимо), белый(недостаточно информации)
N>А Википедии встречается выделение в таблицах цветом? Не будет выбиваться из общего оформления?
Здравствуйте, nikov, Вы писали:
N>Вот, сделал в Википедии табличку Сравнение языков программирования. Можно заполнить пропущенные значения, исправить где я ошибся, дописать побольше параметров сравнения и еще несколько языков.
Такие вещи должны быть модерируемыми.
Пока что получился бардак, каша и в результате бред.
Например, в разделе Возможности языка присутсвуют пункты Шаблоны и Параметрический полиморфизм, что до некоторой степени одно и то же. Причем Шаблоны приписаны С++-у, C#-у, D и Яве, а Nemerle поставлен прочерк. Получается натуральная деза.
Если уж делать такое сравнение, то нужно делать его очень окуратно и развернуто.
Скажем тот же параметрический полиморфизм (ПП) нужно разбирать в отдельной таблице, так как там много нюансов. Ведь и дженирики и шаблоны — это ПП, но дженерики комонентны (поддерживают динамическое сосздание, информацию о типах и т.п., а шаблоны нет, но позволяют ряд вещей которые дженерики делать не позволяют).
N>Заодно будет возможность еще раз доказать, что ВАШ язык — самый лучший.
Почти бесполезное занятие. Там уже Эрланг компилируемый и поддерживает (на пару с Хаскелем) перегрузку фунций, а фич больше всего у Питона. В итоге получается очередная профанация... к сожалению.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
N>>Вот, сделал в Википедии табличку Сравнение языков программирования. Можно заполнить пропущенные значения, исправить где я ошибся, дописать побольше параметров сравнения и еще несколько языков.
VD>Такие вещи должны быть модерируемыми.
VD>Пока что получился бардак, каша и в результате бред.
VD>Например, в разделе Возможности языка присутсвуют пункты Шаблоны и Параметрический полиморфизм, что до некоторой степени одно и то же. Причем Шаблоны приписаны С++-у, C#-у, D и Яве, а Nemerle поставлен прочерк. Получается натуральная деза.
Это я разделял На то оно и вики. Если есть, что изменить, вилкоммен
VD>Если уж делать такое сравнение, то нужно делать его очень окуратно и развернуто. VD>Скажем тот же параметрический полиморфизм (ПП) нужно разбирать в отдельной таблице, так как там много нюансов. Ведь и дженирики и шаблоны — это ПП, но дженерики комонентны (поддерживают динамическое сосздание, информацию о типах и т.п., а шаблоны нет, но позволяют ряд вещей которые дженерики делать не позволяют).
На то это и вики. Можно взять и поправить
N>>Заодно будет возможность еще раз доказать, что ВАШ язык — самый лучший.
VD>Почти бесполезное занятие. Там уже Эрланг компилируемый и поддерживает (на пару с Хаскелем) перегрузку фунций,
func([List]) ->
ok.
func(atom, atom2) ->
ok.
func({tuple, t}, {tuple, t2}, [L]) ->
ok.
Получили func/1, func/2, func/3. Правда, возможно я ошибаюсь, и это не overloading.
VD>а фич больше всего у Питона. В итоге получается очередная профанация... к сожалению.
Здравствуйте, Mamut, Вы писали:
M>Получили func/1, func/2, func/3. Правда, возможно я ошибаюсь, и это не overloading.
для меня overloading — это когда по разным типам. здесь же скорее возможность использования одного и того же имени функции с разным числом аргументов
BB>>По Perl (try/catrch/finally): BB>>http://www.perl.com/pub/a/2002/11/14/exception.html
A>Это не встроенное средство. try/catch/finally и прочие не являются операторами, это функции модуля Error.pm, из-за особенностей синтаксиса Perl похожие на операторы.
у хаскела это тоже не встроенное свойство, а библиотека, что очень удобно — можно определять свои собственные способы обработки исключений. главное, что для них есть поддержка в RTS языка, без этого бы никакими библиотеками нельзя было бы обойтись
Здравствуйте, BulatZiganshin, Вы писали:
BZ>для меня overloading — это когда по разным типам.
А для всех остальных:
Overload (programming)
To overload a method in programming is to have two or more methods with the same name, but are distinguished by the number and/or type of variables they require.
AVK>To overload a method in programming is to have two or more methods with the same name, but are distinguished by the number and/or type of variables they require.
Здравствуйте, Mamut, Вы писали:
M>На то это и вики. Можно взять и поправить
Ага. Вот каждый со своим мерилом и будет подходить.
В общем, это то место где общественный труд вреден. Тут нужна авторская работа. Автор должен быть максимально беспрестрастен. Он должен определить линию и выдерживать ее. А тут получается хоровое пение бардовских песен. Знания экспертов конечно нужны, но они должны быть чисто экспертными. Решение же должен принимать кто-то один.
VD>>Почти бесполезное занятие. Там уже Эрланг компилируемый и поддерживает (на пару с Хаскелем) перегрузку фунций,
M>Внимательно смотрим на сноски у Эрланга: M>Компиляция: Указанная возможность поддерживается очень ограниченно. С помощью HiPE: http://www.erlang.se/euc/01/kostis2001/sld005.htm
Смотрю. Вот она:
Возможность компиляции/Erlang. HiPE — High Performance Erlang. Доступен только для *nix-систем
Это чисто воды профанация. Эрланг интерпритируемый по сути язык. Прекомпиляция только немного повышает производительность некторых вычислений. А из сноски этого никак не видно. Наоборот, из нее можно сделать вывод, что +/- был поставлен только потому, что компиляция доступна только на *nix-ах. Ну, нельзя сравнивать действительно компилируемые языки и языки для которых сделаны некоторые потуги. Для них нужно заводить отдельный пункт. Например, "наличие частичной динамической компиляции". Сам же язык должен классифицироваться как интерпретируемый. Ну, или надо усложнять схему сравнения.
M>Перегрузка функций: M>
M>func([List]) ->
M> ok.
M>func(atom, atom2) ->
M> ok.
M>func({tuple, t}, {tuple, t2}, [L]) ->
M> ok.
M>
M>Получили func/1, func/2, func/3. Правда, возможно я ошибаюсь, и это не overloading.
ОК. Это действительно перегрузка, но не по типам аргументов (которые в Эланге попросту отсуствуют на до рантайма), а по количеству параметров. Но типизированные языки поддерживают перегрузку по типам. Хаскель же вообще не поддерживает перегрузку в виду поддержки каринга. Разумным решением, в данном случае, было бы ввести два пункта "Перегрузка по количеству параметров", "Перегрузка по типам параметров". В прочем сюда же подошел бы и пункт "Сопоставление с образцом в параметрах функций" (которое есть Хаскеле и ОКамле, но нет в Немерле, Скале и других яхыкаъ пддерживающих перегрузку на уровне фунций).
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, Mamut, Вы писали:
M>>в таком случае в Эрланге overloading есть — как по типам, так и по количеству параметров
VD>По типам — нет. И не может быть, так как язык динамически типизированный.
Это скользкий вопрос, т.к. есть к примеру гарды (аля is_integer/1), которые тоже принимают в паттерн-матчинге участие, который осуществляется при выборке нужной function clause
Здравствуйте, Курилка, Вы писали:
VD>>По типам — нет. И не может быть, так как язык динамически типизированный.
К>Это скользкий вопрос, т.к. есть к примеру гарды (аля is_integer/1), которые тоже принимают в паттерн-матчинге участие, который осуществляется при выборке нужной function clause
Это вообще уже ни в какие ворота. Причем тут сопоставление с образцом и перегрузка фунций по типам? Есть в Эрланге типы в момент когда производится компиляция? Нет? Значит и о перегрузке по типам говорить неуместно. В прочем и о компиляции то тоже говорить не очень уместно, так как язык динамический.
Паттерн матчинг это не перегрузка. Это динамическая фича. Которая, к слову, если реализуется на уровне фунций препятствует перегрузке по типам, так как появляется конфликт синтаксиса. В прочем, теоретически последняя проблема разрешима, но языков в котором она решена я не знаю. Разве что в F#. Там вроде бы функции из фрэймворка (поддерживающие перегрузку) описываются как фунции принимающие кортеж. В Скале и Немерле вообще решили отказаться от паттерн-матчинга на уровне методов ради сохранения С-подобного синтаксиса. В прочем на макросах можно и это реализовать, если еще одно ключевое слово придумать.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Здравствуйте, Курилка, Вы писали:
VD>>>По типам — нет. И не может быть, так как язык динамически типизированный.
К>>Это скользкий вопрос, т.к. есть к примеру гарды (аля is_integer/1), которые тоже принимают в паттерн-матчинге участие, который осуществляется при выборке нужной function clause
VD>Это вообще уже ни в какие ворота. Причем тут сопоставление с образцом и перегрузка фунций по типам? Есть в Эрланге типы в момент когда производится компиляция? Нет? Значит и о перегрузке по типам говорить неуместно. В прочем и о компиляции то тоже говорить не очень уместно, так как язык динамический.
[cut]
Ну если определять фичу, которая лишь возможна для статически типизированных языков, тогда, как ни странно, для динамических она существовать не будет
во-первых, карринг делает невозможным перегрузку по кол-ву, но не типам параметров. перегрузка в нём есть в виде type classes. впрочем, из-за того, что функциональные типы — first class, по кол-ву перегрузить тоже можно:
> printf "%d\n" (23::Int)
23 > printf "%s %s\n" "Hello" "World"
Hello World > printf "%.2f\n" pi
3.14
во-вторых, языки делятся на статистически и динамически типизируемые. а компиляция/интерпретация — это свойства существующих реализаций, ввести в заблужение это может разве что какого-нибудь новичка
в-третьих, ООП языки обладают встроенным механизмом перегрузки по первому аргументу
в-четвёртых, для достаточно гибких языков (типа Ruby) есть библиотеки, которые организуют полноценную перегрузку, которая разумеется обрабатывается в runtime
и ещё — я понимаю, что понятие перегрузки включает в себя число аргументов. вот только толку от этого немного, так что я бы предпочёл изменить название пункта — "перегрузка по типам"
К>Ну если определять фичу, которая лишь возможна для статически типизированных языков, тогда, как ни странно, для динамических она существовать не будет
О том и речь. По этому в таком виде и получается профанация.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, BulatZiganshin, Вы писали:
BZ>детский сад.
Это ты о себе? Тогда согласен.
BZ>во-первых, карринг делает невозможным перегрузку по кол-ву,...
Этого достаточно. И вообще эта тема уже обсуждалась. Делай поиск. Перегрузкой это все назвать нельзя.
Так и знал, что вылезет кто-то шибко умны и начнет докапываться до токостей вместо того чтобы просто признать факт несоответствия в целом. Узнаю маньяков функциональщиков. Честь любимой игрушки дороже смысла.
BZ>во-вторых, языки делятся на статистически и динамически типизируемые. а компиляция/интерпретация — это свойства существующих реализаций, ввести в заблужение это может разве что какого-нибудь новичка
Согласен. От того и говорю, что это серьезный труд к которому нужно подходить очень ответственно и который не может быть сделан некоординированной толпой.
BZ>в-третьих, ООП языки обладают встроенным механизмом перегрузки по первому аргументу
Это вообще заумные рассуждения к делу не относящиеся. Скажем в Руби никакой перегрузки нет, а есть динамический диспатчинг. В ОКамле свои тараканы. Так что не стоит засорять эфир.
BZ>в-четвёртых, ...
Да по барабану что так в каовых. Фак в том, что без разработки методологий и без согласования и обдумывания каждого пункта получится как всегда — фигня.
BZ>для достаточно гибких языков (типа Ruby) есть библиотеки, которые организуют полноценную перегрузку, которая разумеется обрабатывается в runtime
Действительно детский сад. Перпгрузка в рантайме — это просто бред.
BZ>и ещё — я понимаю, что понятие перегрузки включает в себя число аргументов. вот только толку от этого немного, так что я бы предпочёл изменить название пункта — "перегрузка по типам"
Толку нет от твоих рассуждений. У тебя задача все свести к абсурду. Если честно, то мне участие в подобный "дискуссиях" в последнее рвемя не интересны.
Классификацию сделать можно. Но не так.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, nikov, Вы писали:
N>Но есть и параметры, которые имеют смысл почти для всех языков общего назначения, например поддержка длинных целых чисел и т.д.
Да, хороший пример. Вот скажем на С++ или Шарпе поддержку длинных чисел (с неограниченной длинной) можно реализовать средствами языка (в виде классов или структур). В язык это не интегрировано. Так как будем поступать?
С одной стороны проблема решается. С другой в языке решения нет. С третей, ты первый кто вообще заостряет внимание на этой проблеме.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Да, что ты напрягаешся... по пунктам разбираешь. Пиши проще — есть все. Все чего нет придумаем.
Если серьезно, то там многие вещи вообще вообще для Хаскеля смысла не имеют, но фанатизм столь велик, что ты даже их приписал бедному Хаскелю. Как map может быть forech-ем? forech не функция, а опертор вроде for-а, т.е. в доску императивный. Какой к черту break в "чистом ФЯ"? Акстись!
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Да, хороший пример. Вот скажем на С++ или Шарпе поддержку длинных чисел (с неограниченной длинной) можно реализовать средствами языка (в виде классов или структур). В язык это не интегрировано. Так как будем поступать?
Конечно, поставим "Нет". В примечании отмечено, что имеется в виду поддержка литералов на уровне языка. Ясно, что реализовать через библиотеки можно где угодно.
Здравствуйте, nikov, Вы писали:
N>Конечно, поставим "Нет". В примечании отмечено, что имеется в виду поддержка литералов на уровне языка. Ясно, что реализовать через библиотеки можно где угодно.
Как раз не ясно. Где угодно не выйдет, так как перегрузка операторов есть далеко не везде. К тому же разные скрипты, гда подобные фичи вмонтированы, даже если и позволят релизовать подобное, то результат будет плачевным. А вот на С++ проблем не будет.
Выходит очередная деза. С одной стороны все что дает фича в том же С++ получить можно, с другой мы ставим "Нет".
Я вообще болдею когда в сравнении языков появляются такие частности как наличие хитрых числе или оператора forech. А почему тогда нет пунктов специфичных для других языков/компиляторов? Ну, скажем наличие классов типов из Хаскеля, или поддержка 80-битных чисел с плавающей точкой на последних процессорах от Интела.
Ты пыташся сделать список фич, но раельно попадаешь в омут дизайнерских решений. Не может язык ориентированный на создание высокопроизводительного кода использовать по умолчанию типы с переменной и не ограниченной вестимостью. Эта фича интересна только для скриптов. И так по всем пунткам. В общем, сравнение теплого с мягким.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, rsn81, Вы писали:
VD>>Вообще-то не очень. В прочем, подобные сравнения вообще мало осмысленны. R>Согласен, суррогат жуткий.
Тут даже дело не во внешнем виде. Дело в том, что Ява не предназначена для написания кода в фунциональном стиле, а локальные функции они как раз из той оперы. Точнее они конечно есть и в Дельфи, но там совсем другая песня. Так что нужно создавать таблицы для каждого из стилей программирования и уже в них делать сравнения. Причем в фунциональной таблице не должно быть ни Дельфи, ни Явы, так как языки полноценно этот стиль не поддерживают. По уму даже Шарп там имеет право присуствовать только с 3-ей версии. Ну, со второй с натяжкой.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Такое ощущение, что страница wiki будет расти как в высоту, так и в ширину: постоянное добавление возможностей, в том числе и проприетарных для части языков — по высоте, а по ширине все новые и новые языки, что будут опять же вызывать рост высоты страницы.
Здравствуйте, VladD2, Вы писали:
VD>Если серьезно, то там многие вещи вообще вообще для Хаскеля смысла не имеют, но фанатизм столь велик, что ты даже их приписал бедному Хаскелю. Как map может быть forech-ем? forech не функция, а опертор вроде for-а, т.е. в доску императивный. Какой к черту break в "чистом ФЯ"? Акстись!
Разве?
int n;//аккумуляторforeach (int x in arr)
n+=x;
//это синтакс. сахар для (например вариант для Net 1.0)
IEnumerator en=arr.GetEnumerator();
while (en.MoveNext)
{
n+=(int)en.Current;
}
//Вводим функцию, для краткости вместо замыкания - возвращаем результат.int MySum(int n, int x){return x+n;};
IEnumerator en=arr.GetEnumerator();
while (en.MoveNext)
{
n=MySum(n, en.Current);
}
//концевую рекурсию наоборот
def a=MyForeach(arr.GetEnumerator(), n, MySum);
MyForeach(en:IEnumerator, n:int, f):int
{
match (en.MoveNext){
| false => n;
| true => MyForeach(en, f(n, x), f);
}
}
//заменяем IEnumerator на list
def a=MyForeach([1,2,3,4,5], n, MySum);
MyForeach(l:list, n:int, f):int
{
match (l)
| [] => n;
| (x:xs) => MyForeach(xs, f(n, x), f);
}
//чем не map?
Итого, foreach — это синтаксический сахар для MyForeach. Точно также map (где-то это встроенная функция, где-то библиотечная) — точно такой же синтаксический сахар для функции MyForeach. Они эквивалентны.
Здравствуйте, VladD2, Вы писали:
VD2> Хаскель же вообще не поддерживает перегрузку...
То есть как это нет перегрузки в Хаскелле?
Классы типов -- это и есть Haskell-way перегрузочного полиморфизма. Прочти статью Корделии Холл и др. "Type Classes in Haskell"
Type classes provide a uniform solution to overloading,
including providing operations for equality, arithmetic,
and string conversion
VD2> Так и знал, что вылезет кто-то шибко умны и начнет докапываться до токостей вместо того чтобы просто признать факт несоответствия в целом. Узнаю маньяков функциональщиков. Честь любимой игрушки дороже смысла.
VD2> Если серьезно, то там многие вещи вообще вообще для Хаскеля смысла не имеют, но фанатизм столь велик, что ты даже их приписал бедному Хаскелю. Как map может быть forech-ем? forech не функция, а опертор вроде for-а, т.е. в доску императивный. Какой к черту break в "чистом ФЯ"? Акстись!
Ну так Хаскелл -- в доску императивен! :lol:
Haskell: the world's finest imperative programming language
(C) Simon Peyton Jones
Здравствуйте, geniepro, Вы писали:
G>То есть как это нет перегрузки в Хаскелле? G>Классы типов -- это и есть Haskell-way перегрузочного полиморфизма.
Классы типов — это самый что ни на есть истенный полиморфизм. Это налог интерфейсов из ООП.
Ни в одном языке поддерижвающем перегрузку не нужно заводить какие-то левые описания. Достаточно просто создать две функции с разным списком параметров.
VD2>> Если серьезно, то там многие вещи вообще вообще для Хаскеля смысла не имеют, но фанатизм столь велик, что ты даже их приписал бедному Хаскелю. Как map может быть forech-ем? forech не функция, а опертор вроде for-а, т.е. в доску императивный. Какой к черту break в "чистом ФЯ"? Акстись!
G>Ну так Хаскелл -- в доску императивен! :lol:
И тебя вылечат... (с)
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, BulatZiganshin, Вы писали:
BZ>да брось Влад. просто поддержка 80-битных чисел была на i80x87 c самого начала. а вот поддержка 32/64-битных появилась только вместе с SSE
По-моему она появилась в Pentium Pro, и тем не менее половина компиляторов их не поддерживает. Но дело не в этом. Я привел пример неважной фичи.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
G>>То есть как это нет перегрузки в Хаскелле? G>>Классы типов -- это и есть Haskell-way перегрузочного полиморфизма.
VD>Классы типов — это самый что ни на есть истенный полиморфизм. Это налог интерфейсов из ООП.
VD>Ни в одном языке поддерижвающем перегрузку не нужно заводить какие-то левые описания. Достаточно просто создать две функции с разным списком параметров.
Нету, нету в Хаскеле перегрузки. Можно сделать её, частично. Но это не считается.
Здравствуйте, lomeo, Вы писали:
L>Нету, нету в Хаскеле перегрузки. Можно сделать её, частично. Но это не считается.
Согласен. И именно потому, сравнение языков еще больше усложняются. В ход идут имоции и собственное понимание терминов. А о терминах можно спорить вечно.
Ну, так что? Попробуем залудить более-менее полноценное и честное сравениние?
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Ну, так что? Попробуем залудить более-менее полноценное и честное сравениние?
Да ну, сам же говоришь, это терминологический спор.
Ну смотри — в таблице парадигм можно каждому языку понаставлять плюс на каждую парадигму, нет проблем.
Теперь про Хаскель.
В таблице типизации стоит "Явная типизация" — что под этим понимается? Возможность указывать типы явно? Тогда почему нет плюсика? Или наоборот, почему на "неявном приведении типов без потери данных" нет минуса? В Хаскеле в принципе нет приведения. Мы можем уточнить тип переменной, но привести целое к длинному целому не можем. Тем более неявно. Самая интересная таблица "Возможности языка". В Хаскеле нет шаблонов, но с другой стороны — нахрена козе баян? Это никак не говорит о достоинствах или недостатках языка. Мне кажется, интереснее было бы сравнивать не конкретные решения сами по себе, а то, как проблемы решаются на том или ином языке, В С++ это шаблоны, в Хаскеле для этого просто не надо уточнять тип функции Ну и дальше всё в том же духе, как то мне это представляется может быть и интересным, но не сильно полезным, ну разве что для расширения кругозора — теперь буду тыкать тебя в то, что Немерле отстой, потому что у него нет параметрического полиморфизма высших порядков
Здравствуйте, lomeo, Вы писали:
L>Да ну, сам же говоришь, это терминологический спор.
Ну, так если мы все будум пытаться прийти к конструктиву, то должно же что-то путное получиться?
L>Ну смотри — в таблице парадигм можно каждому языку понаставлять плюс на каждую парадигму, нет проблем.
Ага. Это если ставить их от любви к искуству. А можно сделать так. Ввести оценки:
1. Идеологически не совместим.
2. Не поддерживает.
3. Пытается эмулировать библиотеками без особого успеха.
4. С успехом эмулирует библиотеками.
5. Сносно поддерживает средствами самого языка.
6. Отлично поддерживает средствами самого языка.
То каждому языку можно будет поставить заслуженную оценку. Ну, какая к чертовой матери в С++ поддержка ФП? Ему я бы поставил 3. Конечно можно поспорить 3 или 4, но уж точно не 5 или 6. А вот Хаскелю и Немерле я бы опставил бы 6. C#-у 3.0, к слову, я бы поставил 5.
L>Теперь про Хаскель. L>В таблице типизации стоит "Явная типизация" — что под этим понимается?
Да в лес эту таблицу. Ежу понятно, что по уму нужно продумывать более гибкую оценку для данного параметра.
L> Возможность указывать типы явно? Тогда почему нет плюсика?
Потому как я уже сказал — "демакратическим" путем такие сопоставления не делются. Это профанация!
L> Или наоборот, почему на "неявном приведении типов без потери данных" нет минуса? В Хаскеле в принципе нет приведения. Мы можем уточнить тип переменной, но привести целое к длинному целому не можем. Тем более неявно.
Кстати, подобные вопросы сами по себе интересны. Ведь если нет фунций преобрзования, то писать на таком языке становится, мягко говоря, не просто. Тут как миниум нжно сноску. А то и подумать как лучше описать то или иное свойство.
Оптимально, чтобы каждый пункт сопровождался примером.
L> Самая интересная таблица "Возможности языка".
Ага. Ее вообще в лес. Надо сравнивать языки только в рамках поддерживаемых парадигм. А то и стилей. Для C# и С++ некоторые фичи могут быть разумными. А для Хаскеля — нет, так как он ФЯ.
L>В Хаскеле нет шаблонов, но с другой стороны — нахрена козе баян?
Полностью согласен. Шаблоны — это бред! Это отражение С++-нутого мышления — "если в С++ есть, то везед должно быть так же, а если нет, то они уроды". Надо сравнивать возможности обобщенного программирования (ОП). То что Шаблоны кроме ОП, на шаблонах ко всему прочему наворачивается метапрограммирование (МП) и реалзиуются фичи вроде миксинов нужно отражать в отдельных таблицах где описываются эти фичи. Другими словами должно быть наоборот. В графее "Поддержка ОП времени компиляции" доллжно стоять "Шаблоны". А в графе "Поддержка ОП времени выполнения" должен стоять прочерк. А у C# в перовой и второй гафе должно стоять "Generics", так как они доступны и в компайлатайм и в рантайм, а вот в графах "МП" и "Миксины" должн стоять "банан" (возможность не реализуется средствами языка).
L> Это никак не говорит о достоинствах или недостатках языка.
+1
L> Мне кажется, интереснее было бы сравнивать не конкретные решения сами по себе, а то, как проблемы решаются на том или ином языке, В С++ это шаблоны, в Хаскеле для этого просто не надо уточнять тип функции Ну и дальше всё в том же духе, как то мне это представляется может быть и интересным, но не сильно полезным, ну разве что для расширения кругозора — теперь буду тыкать тебя в то, что Немерле отстой, потому что у него нет параметрического полиморфизма высших порядков
Ну, Хаскель тоже можно потыкать много куда. Тут еще большой вопрос что такое "полиморфизма высших порядков" и зачем он нужен. Но это вопрос мне будет интересен если вдруг мы соберемся делать разумное сравнение.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, BulatZiganshin, Вы писали:
BZ>эмуляция многотредности рунтаймом самого языка. в пределах одного (или нескольких) тредов ОС выполняется куча потоков исходного кода
А если эмулция производится библиотекой (файберы/зеленые потоки), то это как называть?
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, FR, Вы писали:
VD>>Ну, так что? Попробуем залудить более-менее полноценное и честное сравениние?
FR>И какие предложения насчет этой процедуры?
В смысле? Сначала обдумываем что сравниваем и как по крупняку. Потом берем отдельные блоки и согласовываем их.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Мне кажется, интереснее было бы сравнивать не конкретные решения сами по себе, а то, как проблемы решаются на том или ином языке, В С++ это шаблоны, в Хаскеле для этого просто не надо уточнять тип функции Ну и дальше всё в том же духе, как то мне это представляется может быть и интересным, но не сильно полезным, ну разве что для расширения кругозора — теперь буду тыкать тебя в то, что Немерле отстой, потому что у него нет параметрического полиморфизма высших порядков
Ощущение, что характеристики, по которым будет идти сравнение, станут на порядок выше в абстракции, нежели существующие: не что умеет язык, а для чего язык умеет так, зачем ему нужно это, какие задачи это решает. Кстати, по такому сравнению сразу будет видно, какие языки самые удобные, а какие самые извратные для решения конкретных задач — здесь с процитированным не согласен, это очень и очень полезная информация. Вот только кто составит такой перечень? Себя настолько компетентным не ощущаю...
Здравствуйте, VladD2, Вы писали:
VD>Ну, так если мы все будум пытаться прийти к конструктиву, то должно же что-то путное получиться?
Честно говоря, не знаю. В смысле, да конечно, конструктив подразумевает рождение чего то полезного, сомневаюсь только, что у нас получится — очень уж тема скользкая. Хотя, возможно, это от того, что я пока не вижу, к чему это всё вообще.
Попытаюсь прокомментировать.
VD>Ага. Это если ставить их от любви к искуству. А можно сделать так. Ввести оценки: VD>1. Идеологически не совместим. VD>2. Не поддерживает. VD>3. Пытается эмулировать библиотеками без особого успеха. VD>4. С успехом эмулирует библиотеками. VD>5. Сносно поддерживает средствами самого языка. VD>6. Отлично поддерживает средствами самого языка.
Вот как тут оценивать? Понятия "успех" и "сносно/отлично" уж очень субъективны.
Голосованием? Мы ведь даже по шкале не сможем выставить — мол, этот язык поддерживает то-то лучше, чем этот — 100% будет флейм. А уж оценки ставить...
Не знаю я
VD>То каждому языку можно будет поставить заслуженную оценку. Ну, какая к чертовой матери в С++ поддержка ФП? Ему я бы поставил 3. Конечно можно поспорить 3 или 4, но уж точно не 5 или 6. А вот Хаскелю и Немерле я бы опставил бы 6. C#-у 3.0, к слову, я бы поставил 5.
Или вот здесь. Начнём спорить, что такое ФП, да что лучше — карринг в Хаскеле или не-знаю-как-называется — 5+_ в Немерле, ударимся в частности, короче.
VD>Кстати, подобные вопросы сами по себе интересны. Ведь если нет фунций преобрзования, то писать на таком языке становится, мягко говоря, не просто.
Не, функции есть, приведения нет, ну это оффтопик немного.
VD>Оптимально, чтобы каждый пункт сопровождался примером.
+1
VD>Но это вопрос мне будет интересен если вдруг мы соберемся делать разумное сравнение.
Попробовать можно, в любом случае. Я попробую, не смотря на свой скептицизм. У тебя есть конкретные предложения по тому, что оценивать? Огласите весь список, пжалста
Здравствуйте, lomeo, Вы писали:
VD>>Ага. Это если ставить их от любви к искуству. А можно сделать так. Ввести оценки: VD>>1. Идеологически не совместим. VD>>2. Не поддерживает. VD>>3. Пытается эмулировать библиотеками без особого успеха. VD>>4. С успехом эмулирует библиотеками. VD>>5. Сносно поддерживает средствами самого языка. VD>>6. Отлично поддерживает средствами самого языка.
L>Вот как тут оценивать? Понятия "успех" и "сносно/отлично" уж очень субъективны.
Субеъективны... Ну, что поделаешь?
Давай на примере. Берем функциональный стиль программирования и языки: С, С++, C#, Java, Nemerle, Haskell.
С я бы поставил 2, С++ — 3, C# 3.0 — 5, Java — 1, Nemerle и Haskell — 6. Причем к Haskell я бы сделал примечание, что это оснвоной и по сути единственный ситиль... к нему сделано множество оптимизаций...
L>Голосованием? Мы ведь даже по шкале не сможем выставить — мол, этот язык поддерживает то-то лучше, чем этот — 100% будет флейм. А уж оценки ставить...
Голосования тут бесполезны. А вот обсуждения полезны.
L>Или вот здесь. Начнём спорить, что такое ФП, да что лучше — карринг в Хаскеле или не-знаю-как-называется — 5+_ в Немерле, ударимся в частности, короче.
Если цель поспорить (как у нашего любимого еао197), то несомненно к консенсусу мы не прийдем. Но если мы будем стремиться к конструктиву, то договоримся.
Совершенно ведь не важно какие фичи позволяют писать на языке в фукнциональном стиле. Главное, что на нем можно писать в этом стиле и что это делать удобно. Не так ли? Немерле и Хаскель поддерживают ФП по полной программе. На обоих языках (как в прочем и на Лиспе) можно писать в этом стиле, и писать удобно. А вот скажем на С++ писать конечно можно, но только с подпорками вроде буста и все равно результат получается довольно отвратительным. Друими словами 1 или 2 ему поставить нельзя, но выше тройки тоже ничего не поставишь.
Опять же можно пообсуждать каждый выбор, но в пределах разумного. В конце концов можно для сопрных пунктов привести "коментарии экспертов".
VD>>Кстати, подобные вопросы сами по себе интересны. Ведь если нет фунций преобрзования, то писать на таком языке становится, мягко говоря, не просто.
L>Не, функции есть, приведения нет,
Есть фунции — есть приведение. Просто нет неявного приведения.
L>ну это оффтопик немного.
+1
VD>>Но это вопрос мне будет интересен если вдруг мы соберемся делать разумное сравнение.
L>Попробовать можно, в любом случае. Я попробую, не смотря на свой скептицизм. У тебя есть конкретные предложения по тому, что оценивать? Огласите весь список, пжалста
Я предпочитаю решать пролемы по мере поступления. Сначала нужно классифицировать языки по парадигмам, типам типизации и т.п.
Далее сравнивать их уже в разрезе поддерживаемой парадигмы. Так для ИП будут интересны поддерживаемые операторы, а для ФП возможности манипуляций с функциями и т.п.
Нужно заводить оп одному обсуждению на каждый вопрос. Само сравнение оформить отдельной страницей (или несколькими).
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>Давай на примере. Берем функциональный стиль программирования и языки: С, С++, C#, Java, Nemerle, Haskell.
VD>С я бы поставил 2, С++ — 3, C# 3.0 — 5, Java — 1, Nemerle и Haskell — 6. Причем к Haskell я бы сделал примечание, что это оснвоной и по сути единственный ситиль... к нему сделано множество оптимизаций...
ОК. Хотя я и не очень понял почему именно такие оценки, расскажи за что даётся каждая оценка.
Я видел твоё описание, но оно во-первых очень-очень субъективное ("пытается", "сносно" и т.д.), во-вторых, именно по этой причине — это всего лишь описание оценок, т.к. что 6, что "отлично поддерживает" — ни о чём не говорит. Можешь немного более формализовать выдачу баллов?
VD>Я предпочитаю решать пролемы по мере поступления. Сначала нужно классифицировать языки по парадигмам, типам типизации и т.п. VD>Далее сравнивать их уже в разрезе поддерживаемой парадигмы. Так для ИП будут интересны поддерживаемые операторы, а для ФП возможности манипуляций с функциями и т.п.
Да. Просто я плохо себе это представляю. Вот вернёмся к моему примеру. Есть проблема — в Scheme (без наворотов), для задания в map функции-преобразователя необходимо выписывать всю лямбду.
(map (lambda (x) (x + 5)) lyst)
В шарпе наверняка тоже что-то вроде:
lyst.Map(x => x + 5)
А вот в Haskell это решается каррингом
map (+5) lyst
В Nemerle не знаю как называется, partial function application?
lyst.Map(_ + 5)
И два последних варианта жутко удобны своей краткостью. Некоторые выводы, сравнение подходов к решению этой задачи и т.д. — в приниципе, понятно. Но вот как обозвать эту проблему? Как она вписывается в общую систему сравнений? Не хотелось бы получить винегрет. Как будут представлены эти данные — ведь матрично получается плохо, повествовательно — не очень наглядно? Раздавать ли для подобных решений оценки и как? И т.д. и т.п. Не ясно мне многое в том, как это должно быть. Что скажешь?
VD>Нужно заводить оп одному обсуждению на каждый вопрос. Само сравнение оформить отдельной страницей (или несколькими).
А если вопрос содержит подвопросы, насколько глубока кроличья нора?
Про сравнение на отдельной странице не очень понял.
Здравствуйте, lomeo, Вы писали:
VD>>С я бы поставил 2, С++ — 3, C# 3.0 — 5, Java — 1, Nemerle и Haskell — 6. Причем к Haskell я бы сделал примечание, что это оснвоной и по сути единственный ситиль... к нему сделано множество оптимизаций...
L>ОК. Хотя я и не очень понял почему именно такие оценки, расскажи за что даётся каждая оценка.
С — по сути был рассчитан на структурное программирование. Попытка писать в нем на любом из стилей приводит к закату сонца вручную. С++ не подерживает ФП сам по себе. Вместо этого имеются разные Локи и Бусты которые пытаются за счет гибкости шаблонов что-то подрихтовать. Однако программы написанные в ФП с использованием этих библиотек получаются громоздким, неуклюжими и требуют много усилий. C# 3.0 поддерживает главное — лябды с замыканиями, что позволяет использоват ФП во многих местах. Итераторы (те, что yeild) и LINQ так же облегчают использование ФП. Однако полной поддержки нет. Так, нет даже оптимизации концевой рекурсии. Нет паттерн-матчинга и т.п. Есть вывод типов, но он ограничивается выводом из инициализации. С Хаскелем и Немерлом все вроде ясно. Языки специально проектировались под ФП. Хаскль вообще только на него и рассчитан. Немерле — гибрид, но поддержка полноценная, на уровне языка и без компромисов.
L>Я видел твоё описание, но оно во-первых очень-очень субъективное ("пытается", "сносно" и т.д.), во-вторых, именно по этой причине — это всего лишь описание оценок, т.к. что 6, что "отлично поддерживает" — ни о чём не говорит.
Любая оценка субъективна, если она не рассчитывается на базе формальных показателей. Оценка языков по жизни будет субъективной, или прйдется оценивать количество байт в коде компилятора и другую никому не нужную фигню.
L>Можешь немного более формализовать выдачу баллов?
Меня в общем-то устраивает и такая. Если есть предолжения, то можно их рассмореть. Собственно суть моего предложения и заключается в том, чтобы вместе отшлифовать хероховатости с тем, чтобы у адекватных людей было меньше претензий.
L>Да. Просто я плохо себе это представляю. Вот вернёмся к моему примеру. Есть проблема — в Scheme (без наворотов), для задания в map функции-преобразователя необходимо выписывать всю лямбду.
L>
L>(map (lambda (x) (x + 5)) lyst)
L>
L>В шарпе наверняка тоже что-то вроде:
L>
L>lyst.Map(x => x + 5)
L>
L>А вот в Haskell это решается каррингом
L>
L>map (+5) lyst
L>
L>В Nemerle не знаю как называется, partial function application?
Да.
L>
L>lyst.Map(_ + 5)
L>
L>И два последних варианта жутко удобны своей краткостью.
+1
L> Некоторые выводы, сравнение подходов к решению этой задачи и т.д. — в приниципе, понятно. Но вот как обозвать эту проблему?
Мне кажется, что тут все очевидно. Сначала определяем поддерживает ли язык данную фичу. Далее смотрим как он ее поддериживает. Вот мой набор оценок для данного теста:
1 — не поддерживается.
2 — эмулируется библиотеками/МП (обязательно требуется пояснить суть эмуляции, данный пункт може быть полезен для С++, где ничерта нет, но все с горем пополам эмулируется).
3 — поддерживается за счет наличия лябд и замыканий.
4 — п. 3 + шорткат (сокращеный синтаксис) для урощения применения (опять же приводим пример).
В общем, если проблема сложная, то просто не надо описывать ее в терминах булевой логики . По сути мы даем объяснения, а уж оценки нужны исключительно для того чтобы можно было вывести некий общий вывод. Скажем С++ поддерживает ФП на 36, а Хаскель на 256. При этом мы поясним, что это синтетика и по ней можно судить только об общих тенденциях.
L>Как она вписывается в общую систему сравнений? Не хотелось бы получить винегрет. Как будут представлены эти данные — ведь матрично получается плохо, повествовательно — не очень наглядно? Раздавать ли для подобных решений оценки и как? И т.д. и т.п. Не ясно мне многое в том, как это должно быть. Что скажешь?
Мне кажется нужно совмещать табличную форуму, расширенный набор оценок, и пояснения на разговорном языке и конечно же снабжать все массой примеров. Глядишь у такого сравнения появятся и другие полезные фунции. Например, по ней можно будет выучить "похожий" язык. Ведь зная различия не трудно начать использовать новый язык.
Сложности скорее появятся в других местах. Вот скажем в Хаскеле есть лист-компрехеншон. Но в C# 3.0 есть квари-компрехеншон. Тоже штука мощьная, особенно если учитывать, что она прозрачно мапится на БД (про Хаскель ДиБи я знаю). Вот тут прийдется поломать голову, как преподнести подобное сравнение. Тут таблички уже почти наверняка не подойду и прйдется давать не мало текста и примеров, а однозначные выводы вообще вряд ли можно будет сделать, так как тут уже специфика аудитории и задач прет во все дыры.
VD>>Нужно заводить оп одному обсуждению на каждый вопрос. Само сравнение оформить отдельной страницей (или несколькими).
L>А если вопрос содержит подвопросы, насколько глубока кроличья нора?
Дык, на то и нужно обсуждение. Может разобъем, может оптом зачтем.
L>Про сравнение на отдельной странице не очень понял.
Ну, результат (сравнение) должен быть всегда перед глазами. Хранить множество версий срвенений в обсуждениях не очень разумно. Их ведь после нескольких итераций вообще не найти будет. Так что обсудили некую маленькую часть... создали страничку... еще раз осбудили... если претенций нет, то оставляем и приступаем к следующей части. Если потом оказывается, что надо внести изменения в существующую часть, то снова обсуждаем и меняем ее. Но результат у нас всегда доступен по ссылке из корневого сообщения (или в закладках).
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, geniepro, Вы писали:
VD>>>Оптимально, чтобы каждый пункт сопровождался примером.
L>>+1
G>Это уже получится не просто сравнение, а миниэнциклопедия...
От этого кто-то пострадает?
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
G>>Это уже получится не просто сравнение, а миниэнциклопедия...
VD>От этого кто-то пострадает?
У них цели немного разные.
Сравнение обычно бывает быстрое, поискал в гугле — нашёл матрицу сравнения, сравнил. А если нужны детали ищешь уже конкретно по ним.
Здравствуйте, lomeo, Вы писали:
L>У них цели немного разные. L>Сравнение обычно бывает быстрое, поискал в гугле — нашёл матрицу сравнения, сравнил. А если нужны детали ищешь уже конкретно по ним.
Ну, про матрицу я уже все сказал. Это по любому получится обманом.
Собственно Веб предоставляет возможность вынести дополнительное описание во всплывающие окна или куда-то вниз. Так что данные представимые в табличной форме можно будет смотреть точно так же, но при этом будет возможность разобраться в сути срвнения.
Все равно мы не сможет дать некую общуюю оценку по которой можно будет выбрать "лубщий язык" для всех и на все времена. Кому-то важно одно. Кому-то другое. Кому-то важны ограничения...
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>С — по сути был рассчитан на структурное программирование. Попытка писать в нем на любом из стилей приводит к закату сонца вручную. С++ не подерживает ФП сам по себе. Вместо этого имеются разные Локи и Бусты которые пытаются за счет гибкости шаблонов что-то подрихтовать. Однако программы написанные в ФП с использованием этих библиотек получаются громоздким, неуклюжими и требуют много усилий. C# 3.0 поддерживает главное — лябды с замыканиями, что позволяет использоват ФП во многих местах. Итераторы (те, что yeild) и LINQ так же облегчают использование ФП. Однако полной поддержки нет. Так, нет даже оптимизации концевой рекурсии. Нет паттерн-матчинга и т.п. Есть вывод типов, но он ограничивается выводом из инициализации. С Хаскелем и Немерлом все вроде ясно. Языки специально проектировались под ФП. Хаскль вообще только на него и рассчитан. Немерле — гибрид, но поддержка полноценная, на уровне языка и без компромисов.
Два момента. Один по теме, один не очень.
Во-первых, из этого описания можно понять различия в поддержке ФП языков. Однако его надо читать. Значит это будет вроде пояснения к тем оценкам, что ты выставил этим языкам, верно я понял?
Во-вторых, (частности) подход к ФП может быть разным, а из этого описания можно сделать вывод, что Хаскель является подмножеством Немерле. Однако, это не так, даже если оставить такие глобальные вещи как multiparameter type classes, type families, GADT (тут, правда, не уверен) и т.д. как не относящиеся к ФП, то ещё остаётся масса различий — разница в выводе типов, разница в системе типов (пример с гарантией на уровне типов в отсутствии side effect-ов внутри atomically у STM), pattern guards, view patterns, использование карринга в качестве порождения комбинаторов (eDSL) и т.д. Стоит ли дописывать об этой разнице?
Последнее замечание, раузмеется, относится не к самому подходу, а только к примеру текста.
L>>Можешь немного более формализовать выдачу баллов?
VD>Меня в общем-то устраивает и такая. Если есть предолжения, то можно их рассмореть. Собственно суть моего предложения и заключается в том, чтобы вместе отшлифовать хероховатости с тем, чтобы у адекватных людей было меньше претензий.
Мне это представляется в целом так. Есть стандартная проблема — такая то. На языке таком то она решается так-то, на этом так-то, на этом даже проблемы такой не стоит, а на этом мы никак её не обойдём. У этого решения такие то преимущества в таких то условиях, а у этого такие то недостатки. До сих пор всё понятно.
Но вот дальше слишком много субъективного, это уровень генерации флейма. Хотя у этого решения такие то недостатки, но для одного они более важны, так как он чаще работает вот в таких то условиях, а для другого менее. Оценки могут не просто отличаться, они могут существенно различаться.
Давай что ли начнём что нибудь обсуждать, а там поглядим, насколько страшно то, чего я опасаюсь?
VD>Мне кажется, что тут все очевидно. Сначала определяем поддерживает ли язык данную фичу. Далее смотрим как он ее поддериживает. Вот мой набор оценок для данного теста: VD>1 — не поддерживается. VD>2 — эмулируется библиотеками/МП (обязательно требуется пояснить суть эмуляции, данный пункт може быть полезен для С++, где ничерта нет, но все с горем пополам эмулируется). VD>3 — поддерживается за счет наличия лябд и замыканий. VD>4 — п. 3 + шорткат (сокращеный синтаксис) для урощения применения (опять же приводим пример).
VD>В общем, если проблема сложная, то просто не надо описывать ее в терминах булевой логики .
ОК, т.е. всё таки получается миниэнциклопедия?
VD>Мне кажется нужно совмещать табличную форуму, расширенный набор оценок, и пояснения на разговорном языке и конечно же снабжать все массой примеров.
Я — за.
VD>Глядишь у такого сравнения появятся и другие полезные фунции. Например, по ней можно будет выучить "похожий" язык. Ведь зная различия не трудно начать использовать новый язык.
Э.. Не хотелось бы размазывать цели.
VD>Сложности скорее появятся в других местах. Вот скажем в Хаскеле есть лист-компрехеншон. Но в C# 3.0 есть квари-компрехеншон. Тоже штука мощьная, особенно если учитывать, что она прозрачно мапится на БД (про Хаскель ДиБи я знаю). Вот тут прийдется поломать голову, как преподнести подобное сравнение. Тут таблички уже почти наверняка не подойду и прйдется давать не мало текста и примеров, а однозначные выводы вообще вряд ли можно будет сделать, так как тут уже специфика аудитории и задач прет во все дыры.
Осмелюсь заявить, что наличие LH в Haskell не сильно то и полезно, местами удобно, но do-синтаксис порождает форму почти один в один (разве что появятся явно "guard" — буквально это слово, в одном месте return — тоже одно слово, да вместо запятых будут точки с запятой).
[ f z | x <- xs, y <- ys, x < y, let z = g x y]
do { x <- xs; y <- ys; guard(x < y); let z = g x y; return (f z)}
А вот в шарпе это вещь существенно облегчает кодирование/чтение. И как их оценивать?
Кстати, query comprehension в C# — это скорее do-syntax, т.к. query работает для разных IEnumerable, а do для разных монад. Может быть стоит сравнивать именно их?
VD>Дык, на то и нужно обсуждение. Может разобъем, может оптом зачтем.
ОК.
L>>Про сравнение на отдельной странице не очень понял.
VD>Ну, результат (сравнение) должен быть всегда перед глазами. Хранить множество версий срвенений в обсуждениях не очень разумно. Их ведь после нескольких итераций вообще не найти будет. Так что обсудили некую маленькую часть... создали страничку... еще раз осбудили... если претенций нет, то оставляем и приступаем к следующей части. Если потом оказывается, что надо внести изменения в существующую часть, то снова обсуждаем и меняем ее. Но результат у нас всегда доступен по ссылке из корневого сообщения (или в закладках).
Осталось начать?
Уже есть масса информации в таблицах. Может стоит поменять представление, добавить к таблицам описания, а то они в сносках.
Чтобы не начинать всё с самого начала.
Здравствуйте, lomeo, Вы писали:
L>Спасибо, я не знаю C#, к сожалению. L>Если можно расскажи подробнее.
Query comprehension работает при наличии т.н. query pattern, т.е. наличия методов определенной сигнатуры у аргумента (или наличия для него extension методов с аналогичной сигнатурой с учетом this параметра). Минимально необходимый метод один — C<U> Select<U>(Func<T,U> selector). При его наличии будет работать такое:
var res = from x in Arg select x.Foo;
Что эквивалентно:
var res = Arg.Select(x => x.Foo);
Если еще есть метод C<T> Where(Func<T,bool> predicate), то возможно такое:
var res =
from x in Arg
where x.Foo > 5
select x.Foo;
Что эквивалентно:
var res = Arg.Where(x => x.Foo > 5).Select(x => x.Foo);
Ну и т.д. Весь query pattern выглядит так:
class C
{
public C<T> Cast<T>();
}
class C<T>
{
public C<T> Where(Func<T,bool> predicate);
public C<U> Select<U>(Func<T,U> selector);
public C<U> SelectMany<U>(Func<T,C<U>> selector);
public C<V> Join<U,K,V>(C<U> inner, Func<T,K> outerKeySelector,
Func<U,K> innerKeySelector, Func<T,U,V> resultSelector);
public C<V> GroupJoin<U,K,V>(C<U> inner, Func<T,K> outerKeySelector,
Func<U,K> innerKeySelector, Func<T,C<U>,V> resultSelector);
public O<T> OrderBy<K>(Func<T,K> keySelector);
public O<T> OrderByDescending<K>(Func<T,K> keySelector);
public C<G<K,T>> GroupBy<K>(Func<T,K> keySelector);
public C<G<K,E>> GroupBy<K,E>(Func<T,K> keySelector,
Func<T,E> elementSelector);
}
class O<T> : C<T>
{
public O<T> ThenBy<K>(Func<T,K> keySelector);
public O<T> ThenByDescending<K>(Func<T,K> keySelector);
}
class G<K,T> : C<T>
{
public K Key { get; }
}
Сорри, перечитал и усомнился, похоже какая то левая спецификация под руку попала. Вот правильный query pattern:
delegate R Func<T1,R>(T1 arg1);
delegate R Func<T1,T2,R>(T1 arg1, T2 arg2);
class C
{
public C<T> Cast<T>();
}
class C<T> : C
{
public C<T> Where(Func<T,bool> predicate);
public C<U> Select<U>(Func<T,U> selector);
public C<V> SelectMany<U,V>(Func<T,C<U>> selector,
Func<T,U,V> resultSelector);
public C<V> Join<U,K,V>(C<U> inner, Func<T,K> outerKeySelector,
Func<U,K> innerKeySelector, Func<T,U,V> resultSelector);
public C<V> GroupJoin<U,K,V>(C<U> inner, Func<T,K> outerKeySelector,
Func<U,K> innerKeySelector, Func<T,C<U>,V> resultSelector);
public O<T> OrderBy<K>(Func<T,K> keySelector);
public O<T> OrderByDescending<K>(Func<T,K> keySelector);
public C<G<K,T>> GroupBy<K>(Func<T,K> keySelector);
public C<G<K,E>> GroupBy<K,E>(Func<T,K> keySelector,
Func<T,E> elementSelector);
}
class O<T> : C<T>
{
public O<T> ThenBy<K>(Func<T,K> keySelector);
public O<T> ThenByDescending<K>(Func<T,K> keySelector);
}
class G<K,T> : C<T>
{
public K Key { get; }
}
Здравствуйте, lomeo, Вы писали:
L>Во-первых, из этого описания можно понять различия в поддержке ФП языков. Однако его надо читать. Значит это будет вроде пояснения к тем оценкам, что ты выставил этим языкам, верно я понял?
Я бы рассматривал эти оценки более абстрактно, ну, как номера описаний, что ли. Это точно не аналог универсальной системе школьных оценок.
L>Во-вторых, (частности) подход к ФП может быть разным, а из этого описания можно сделать вывод, что Хаскель является подмножеством Немерле.
Дык, когда будет сравниваться поддержка ФП, тогда на свет и выплывут частности. А так, по сути и получается, что язык поддерживающий одну парадигму является подмножеством языка поддерживающего две (включая первую). Но это же очень поверхностный взгляд на вещи.
L> Однако, это не так,
Мы же не пытаемся посторить отношение между языками. Мы хотим сравнить сравнимое и описать то, что сравнить нельзя.
L>...вещи как multiparameter type classes, type families, GADT (тут, правда, не уверен) и т.д.
Это все относится к системе типов. Вот в ее описании и надо продумать сравнение. Система типов Хаскеля конечно уникальна, но состоит она из вполне понятных всем вещей. В ней есть и плюсы и минусы. В других языках есть другие идиомы. Где-то они удобнее, где-то нет.
Главное, что эти вопросы имеют очень косвенное отношение к поддержке именно ФП. Система типов Хаскеля несомненно сильная сторона Хаскеля, но не всего ФП как парадигмы. Так и нужно оценивая ФП оценивать его основные моменты. Если есть какие-то аспекты системы типов которые позволяют писать в ФС более удобно, то их нужно оговорить и продемонстрировать. Причем в других языках нужно попытаться найти средства заменяющие данные (если такие есть). Скажем монады и классы типов в том же Немерле или Шарпе заменяются наличием классов, наследования и интерфейсов. То что классы типов чем-то лучше или хуже в применении нужно разбирать при рассмотрении системы типов, а не при рассмотрении поддержки ФП.
L> как не относящиеся к ФП, то ещё остаётся масса различий — разница в выводе типов,
Вот и будем разбирать этот вопрос при рассмотрении системы типов.
L> разница в системе типов (пример с гарантией на уровне типов в отсутствии side effect-ов внутри atomically у STM),
Вот это можно внести как пункт ФП-таблице. Я бы обобщил этот вопрос. Нужно рассматривать гарантии отсуствия побочных эффектов как таковых. А уж то, что оные есть на уровне типов — это частности которые должны стать подразделом.
L> pattern guards,
Ну, это вообще ни в какие вороста. Тут даже ФП не особ причем. Будет раздел посвященный сопоставлению с обрзцом. В нем скажем С++ и C# получат баранку, а языки реализующие данную фичу получат ее оценку по отдельным пунтам.
L> view patterns,
Тоже самое.
L> использование карринга в качестве порождения комбинаторов (eDSL) и т.д.
Это вопрос ДСЛ-естрония. Что до каринга, то мы уже о нем говорили. Это сахар для комбинирования фунций. Вот при расмотрении этого вопроса и надо его рассматривать.
Опять же никто не мешате рассматривать одну фичу в разных аспектах. Но не надо смешивать. ДСЛ-и, ДСЛ-ями, а кобинирование фунций комбинированием. Скажем Шарп не очень то позиционирется как ДСЛ-язык (хотя библиотеку аля Парсек на нем таки повторили), а в Немерле есть более мощьные средства для этого.
L> Стоит ли дописывать об этой разнице?
Стоит. Но всему свое место. Не надо все мешать в одну кучу. Те кого трогает ДСЛ-естроение откроют соответствующий раздел и прочут его. А те кому интересны возможности поддержки ФП — прочтут соответствующий раздел.
L>Мне это представляется в целом так. Есть стандартная проблема — такая то. На языке таком то она решается так-то, на этом так-то, на этом даже проблемы такой не стоит, а на этом мы никак её не обойдём. У этого решения такие то преимущества в таких то условиях, а у этого такие то недостатки. До сих пор всё понятно.
К сожалению, даже на одном и том же языке одни ти те же проблемы могут решаться по разному. А уж на разных языках и подоавно. Скажем вопросы автоматизации раеализации паттернов ОО-проектирования мало интересуют тех кто пишет на Хаскеле хотя бы потому, что Хаскель не предназначен для ООП. И наоборот, вопросы чистоты мало трогают тех кто пришет на С++.
К тому же чтобы сравнивать решения нужно хорошо знать язвк (чтобы свободно читат код на нем).
Подобное сравнение тоже конечно интересно, но мне кажется оно должно быть бонусом более формальному срвнению.
В качестве примера можно взять Гапертоновскую "Проблему К". Привести примеры реализаций с коментариями, что делается в коде и почему выбраны те или иные решения.
L>Но вот дальше слишком много субъективного, это уровень генерации флейма. Хотя у этого решения такие то недостатки, но для одного они более важны, так как он чаще работает вот в таких то условиях, а для другого менее. Оценки могут не просто отличаться, они могут существенно различаться.
Скажу больше. Самое кривое решение может оказаться приемлемым для большинства, так как оно в духе ООП, а оно (большинство) только его пока и знает. А другие решения вообще будут казаться чем-то сильно запутанным, так как им — Блабам, просто не понятны идеомы используемые в решении.
L>Давай что ли начнём что нибудь обсуждать, а там поглядим, насколько страшно то, чего я опасаюсь?
Вот это разумное предложение. Надо создать отдельную ветку, скажем, посвященную поддержке парадигм, а там будет видно.
L>ОК, т.е. всё таки получается миниэнциклопедия?
Хоть горшком, только не в печь...
L>Осмелюсь заявить, что наличие LH в Haskell не сильно то...
Это детали. Вот когда дойдем до него, тогда и обсудим.
L>Кстати, query comprehension в C# — это скорее do-syntax, т.к. query работает для разных IEnumerable, а do для разных монад. Может быть стоит сравнивать именно их?
Я думаю, что их вообще бесполезно сравнивать. Сравнивать, в данном случае, лучше решение проблем обработки последовательностей, т.е. того на что направлены данные механизмы.
L>Уже есть масса информации в таблицах. Может стоит поменять представление, добавить к таблицам описания, а то они в сносках. L>Чтобы не начинать всё с самого начала.
Если ты о таблицах в Вики, то там неточной информации больше. Я бы начал с нуля.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, lomeo, Вы писали:
L>Во-вторых, (частности) подход к ФП может быть разным, а из этого описания можно сделать вывод, что Хаскель является подмножеством Немерле. Однако, это не так, даже если оставить такие глобальные вещи как multiparameter type classes, type families, GADT (тут, правда, не уверен) и т.д. как не относящиеся к ФП, то ещё остаётся масса различий — разница в выводе типов, разница в системе типов (пример с гарантией на уровне типов в отсутствии side effect-ов внутри atomically у STM), pattern guards, view patterns, использование карринга в качестве порождения комбинаторов (eDSL) и т.д. Стоит ли дописывать об этой разнице?
стоит ли спорить с Владом? он во-первых, во всём этом не разбирается, во-вторых, уверен, что всё в чём он не смог разобраться, не нужно. сейчас пошёл частный вариант этого убеждения — что оно не относится к ФП
я бы лично дал оценку ml 8, а хаскелу — 12: ФП далеко ушло от простого использования higher-order functions and anonymous lambdas, которыми ограничены оценки Влада
Здравствуйте, BulatZiganshin, Вы писали:
BZ>стоит ли спорить с Владом? он во-первых, во всём этом не разбирается, во-вторых, уверен, что всё в чём он не смог разобраться, не нужно. сейчас пошёл частный вариант этого убеждения — что оно не относится к ФП
Этого я тоже боюсь, есть у него такая черта, непробиваемость называется. Но с другой стороны — не спорить я всегда успею Потом, Влад всё таки будет не единственным, полагаю.
BZ>я бы лично дал оценку ml 8, а хаскелу — 12: ФП далеко ушло от простого использования higher-order functions and anonymous lambdas, которыми ограничены оценки Влада
Вот-вот, оценки уж очень зависят от оценивающего, его опыта, взглядов, пристрастий, да даже объективно — от места приложения оцениваемого пункта, с другой стороны не оценивать при проведении сравнения нельзя.
Я просто не знаю, как это делать. У тебя есть предложение, как можно сделать качественное сравнение языков?
Здравствуйте, BulatZiganshin, Вы писали:
BZ>стоит ли спорить с Владом? он во-первых, во всём этом не разбирается, во-вторых, уверен, что всё в чём он не смог разобраться, не нужно. сейчас пошёл частный вариант этого убеждения — что оно не относится к ФП
Прости за авториторизм, но следующее обсуждение моей песоны с твоей стороны приведет тебя в баню на месяц. И мне по фигу в шутку оно там или всерьез. Мне это уже надоело. Во всем должна быть мера.
BZ>я бы лично дал оценку ml 8, а хаскелу — 12: ФП далеко ушло от простого использования higher-order functions and anonymous lambdas,
Это твое мнение. Высказывайся, обосновывай — обсудим.
BZ>которыми ограничены оценки Влада
Мм... полгода.
... << RSDN@Home 1.2.0 alpha rev. 637>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, VladD2, Вы писали:
VD>По делу сказать есть что? Если нет, то проходим даельше.
Что-то все заглохло.
Я тут нашел чудную статью по теме http://home.perm.ru/~strannik/st_txt_prog_07.html
Ладно то что программу на итоне если правильно написать можно ужать до 3 строчек, простительно, но то что самый шустрый среди сравниваемых языыков у него оказался самым медленным это что-то
Да, правда чудная статья. Где-то использована сортировка из библиотеки, а где-то почему-то реализована вручную, несмотря на наличие библиотечной. Потом еще удивляется длине исходников и скорости.. Почему при наличии компиляторов использовались интерпретаторы тоже непонятно.