- 1
(reverse (butlast ...))
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
+121
(reverse (butlast ...))
Родное :)
bormand 16.07.2012 13:02 # 0
roman-kashitsyn 16.07.2012 13:33 # 0
bormand 16.07.2012 13:50 # 0
roman-kashitsyn 16.07.2012 13:56 # 0
А вообще я к тому, что он не любит функциональный код.
bormand 16.07.2012 14:14 # 0
wvxvw 16.07.2012 14:19 # 0
Ох, так у меня и (defun butlast! () ...) есть! :Р
roman-kashitsyn 16.07.2012 19:34 # 0
wvxvw 16.07.2012 20:24 # 0
Только он бесперспективный вообще его можно разве что некро-бомберу, но для них есть лучшие элитные скилы.
guest 16.07.2012 23:43 # +5
bormand 17.07.2012 06:22 # 0
А вот практика - вариант с tail . reverse потребляет процентов на 12% меньше памяти:
Prelude> sum $ (tail . reverse) [1..100000]
4999950000
(0.16 secs, 18141096 bytes)
Prelude> sum $ (reverse . init) [1..100000]
4999950000
(0.16 secs, 20616380 bytes)
guest 17.07.2012 11:08 # 0
зачем копетанишь?
А вообще странно, что скорость у второго варианта не меньше
defecate-plusplus 18.07.2012 07:43 # +2
bormand 18.07.2012 09:18 # 0
Т.е. запросто может показать и 20гиг, при том, что ни в какой момент времени программа не потребляла более мегабайта.
defecate-plusplus 18.07.2012 09:26 # 0
допустим 64-битная система, целое и указатель хранятся в 8 байтах, список двунаправленный (врядли стоит надеяться, что там массив, верно?), значит на элемент 24 байта, итого 2*(24*100к + небольшое K для объекта "список") выходит около 5Мб, кто съел еще 15?
bormand 18.07.2012 10:17 # +1
Вот эти 7.4мб скорее всего ушли на thunk'и для ленивых вычислений, которые в хаскеле создаются тоннами. Надо бы посмотреть подробную раскадровочку в профайлере - но сегодня лень.
Abbath 18.07.2012 08:20 # 0
4999950000
(0.13 secs, 21013984 bytes)
Prelude> sum $ (reverse . init) [1..100000]
4999950000
(0.08 secs, 17709816 bytes)
Prelude>
wvxvw 18.07.2012 10:40 # 0
roman-kashitsyn 18.07.2012 11:03 # 0
wvxvw 18.07.2012 11:17 # 0
wvxvw 17.07.2012 15:15 # +1
работает всего самую малость медленнее чем такой убогий и запутанный:
Поэтому нужно использовать именно его!
roman-kashitsyn 17.07.2012 17:42 # +3
wvxvw 17.07.2012 18:19 # +1
bormand 17.07.2012 18:30 # +1
wvxvw 17.07.2012 18:39 # +1
Так если писать программы без вай-комбинаторов, каррирования и замыканий на Хаскеле - получится тот же Си под редакцией очень креативного эстето-полиграфисто-неневистника.
roman-kashitsyn 17.07.2012 18:41 # 0
wvxvw 17.07.2012 18:52 # 0
> Кстати [...]
Добавьте в код выше каррирование, так чтобы вай-вай-комбинатор мог вызывать функцию с произвольным количеством аргументов! Проще ж не бывает (и, пожалуйста, без прикрас, расскажите о том, сколько времени у вас это заняло).
К сожалению, для полноты эксперимента нам нужно будет существенно больше времени, т.как через год, когда вы забудете, что именно сделали, вернуться к этому же коду и понять, что именно он делает может занять ну, с полчаса, хорошо если.
roman-kashitsyn 17.07.2012 18:59 # +1
Код выше на хаскеле выглядит так: Лепить лямбды в haskell нужно очень редко (ибо каррирование).
guest 17.07.2012 19:10 # 0
Смотря в какой ипостаси. В принципе к нему можно(?) отнести fixIO :: (a -> IO a) -> IO a.
А он уже нужен например для гуйни (когда обработчик, скажем, одноразовый и должен уметь отцепляться):
p.s. ret - сахар для "классового" mfix, в данном случае fixIO.
guest 17.07.2012 19:13 # 0
bormand 17.07.2012 19:30 # +1
Так?
http://ideone.com/kol8B
Сколько времени заняло... да собственно минут 5-10.
wvxvw 17.07.2012 19:59 # 0
roman-kashitsyn 17.07.2012 20:00 # 0
КО: в комбинаторе
wvxvw 17.07.2012 20:23 # 0
roman-kashitsyn 17.07.2012 20:27 # 0
В представленой вами формулировке задача решена полностью.
guest 17.07.2012 20:56 # 0
bormand 17.07.2012 21:08 # 0
TarasB 17.07.2012 21:20 # 0
bormand 17.07.2012 21:27 # 0
Хм. Так соль Y комбинатора как раз в пропихивании функции в качестве ее же первого параметра. Или я туплю?
bormand 17.07.2012 21:34 # 0
Чтобы не выглядело рекурсивно ;)
USB 17.07.2012 22:47 # +2
wvxvw 17.07.2012 21:31 # 0
А то, что в Хаскелле функции от нескольких аргументов по-сути и так всегда карринговые - так как бы ну и что? Это можно расценивать как ответ в духе "а я могу использовать мега-крутую библиотеку, которая все умеет". Речь шла о понимании, как устроена библиотека, а не как ее можно использовать.
bormand 17.07.2012 21:45 # 0
Вы о чем вообще? Какой порядок?
http://ideone.com/tM98r
Ну вот передал Y комбинатору функцию для переворачивания списка. Списки из 10млн элементов пережевывает без проблем.
> Речь шла о понимании, как устроена библиотека, а не как ее можно использовать.
Речь идет о том, что вы очень туманно ставите задачу.
USB 17.07.2012 22:52 # 0
USB 17.07.2012 22:50 # 0
wvxvw 18.07.2012 00:54 # 0
Каррирование, это когда у вас из функции f(a, b) получается функция f(b)(g(a)), т.е. у вас есть только функции от одного аргумента.
В Хаскелле это поведение всех функций по-умолчанию (частичное применение) и вам не нужно ничего специально делать, чтобы этого эффекта добиться, но реализовать этот эффект самому (чтобы наглядно объяснить что оно делает) - тяжело, а в конкретном случае - мне даже тяжело придумать как это сделать без всяких "нечесных" способов.
USB 18.07.2012 06:05 # 0
Вы имеете ввиду какой-нибудь лисп? Тогда понятно.
wvxvw 18.07.2012 10:20 # 0
roman-kashitsyn 18.07.2012 12:23 # +1
На лиспе вообще невозможно написать нормальное каррирование. Ведь могут быть функции с необязательными параметрами и переменным числом параметров. Определить каррирование для таких функций невозможно. В частности, поэтому в хаскеле кол-во аргументов строго фиксировано.
Но можно сделать вменяемый вариант, работающий только при ограничениях на характер потребляемых аргументов.
bormand 18.07.2012 10:22 # 0
Вот честные лямбдочки, каждая из которых принимает ровно 1 параметр.
http://ideone.com/OJB5r
P.S. Y комбинатор взят с RosettaCode и немного допилен под каррированные функции.
wvxvw 18.07.2012 12:01 # 0
Решать конкретную задачу на Хаскелле - это читерство потому, что вы пользуетесь "встроенной" возможностью, работу которой требовалось объяснить / продемонстрировать. Точно такое же читерство, как если бы понадобилось объяснить устройство сборщика мусора, а вместо этого вы бы использовали язык со встроенным сборщиком мусора.
wvxvw 18.07.2012 12:07 # 0
Но вообще, серьезно, демонстрация была предназначена показать плохую читаемость и понимаемость таких практик в общем случае, а не конкретно на то, чтобы запилить универсальный вай-комбинатор для каррированых функций.
bormand 18.07.2012 12:17 # +1
Что-что? Да хоть со 100500:
Приведенный Y-комбинатор вполне съест любую каррированную функцию. Я не спорю, что вызов каррированной функции на лиспе смотрится ужасно. Но он же работает.
> плохую читаемость и понимаемость таких практик в общем случае
Ну правильно. Еще остается довести все до абсурда, и применить нумералы чёрча вместо чисел...
wvxvw 18.07.2012 12:30 # 0
Что-то я очевидно не досмотрел в вашем комбинаторе, но на первый взгляд, все его отличие от канонического варианта было в том, что он добавляет один funcall сверх запланированного. Возможно я ошибся, т.как код очень тяжело понять :)
bormand 18.07.2012 12:29 # 0
http://ideone.com/qDR1M
Тот же самый Y-комбинатор примененный к функции с другим числом аргументов. Слив засчитан.
wvxvw 18.07.2012 12:34 # 0
Но я уже вижу как код становится все понятнее и понятнее с каждой правкой!
bormand 18.07.2012 12:54 # +1
Если вы внимательнее посмотрите на код, я добавил funcall'ы не в сам комбинатор, а в вызов функции которую он возвращает.
> Но я уже вижу как код становится все понятнее и понятнее с каждой правкой!
Согласен ;)
> Лисп честно показывает ту акробатику, которую нужно проделать в уме для того, чтобы понять концепцию.
Вот только зачем мне проделывать эту акробатику и понимать концепцию каждый раз, когда я пишу код? Хватило бы и одного раза. Тот же ассемблер тоже помогает понять архитектуру, но люди почему-то стараются писать на языках более высоких уровней.
bormand 18.07.2012 16:05 # 0
Нате ;) Макрооберточки для каррированных функций. Чтобы вызовы и описание оных не смотрелось как говно.
wvxvw 18.07.2012 01:58 # 0
guest 17.07.2012 19:01 # 0
По сабжу: разве не плюс, когда есть альтернатива записать код в более близком виде к смысловой нагрузке?
wvxvw 17.07.2012 19:43 # −1
При чем вся практически без исключения современная наука так выглядит. Вместо того, чтобы пользоваться универсальной и понятной системой записи ежики жрут кактус собранный из значков разных стран времен и народов, который они мало того что вслух по-человечески произнести не могут, так и изза того, что не могут используя эту же систему создавать новые сущности в необходимом количестве используют по-новой те же закорючки в новом контексте.
На фоне того, что человечество вообще достигло в теоретическом плане понимания языка, хранения и понимания информации, математические закорючки - неимоверный анахронизм. Его современное использование ничем не обосновано.
Чего там за примерами далеко ходить, моя профессор по дискретной математикe путалась в греческом алфавите и иногда называла маюскульные буквы неправильно, например гимму называла альфой, и хоть застрелись! Особенно полезное свойство, когда в контексте есть и то и другое.
А как на счет отличить фрактурную минускульную си от любой другой си, если вдруг у вас книжка на немецком, и набрана фрактурой?
В контексте иврита (в котором нет минускульных/маюскульных букв, зато есть огласовки) алеф-ноль читается как алеф-халом (о). И т.д.
Хаскел - это апогей этого кретинизма, когда не взирая ни на какие разумные доводы люди пытаются использовать римские цифры вместо арабских / восьмеричной / шестнадцатиричной системы.
roman-kashitsyn 17.07.2012 19:55 # 0
Есть чёткие соглашения насчёт того, какие буквы что обозначают в конкретных областях, это негласный стандарт. Любой вменяемый редактор научного журнала пошлёт вас подальше, если вы будете обозначать греческими буквами натуральные числа.
Алефы вообще влезли в традиционно греко-римскую нотацию из-за рассово-верного еврея Кантора.
Профессора бывают разные. Когда мой научник полез в справочник за определением гиперболического синуса, я разочаровался в современной отечественной науке и с головой ушёл в промышленное программирование.
wvxvw 17.07.2012 20:13 # 0
Только, давайте для начала разберемся. Я работал в издательстве 4 года, а до этого еще 6 учился на полиграфиста. И я думаю, что не пошлет, а очень даже посочувствует. Сужу не только по опыту, но исходя из имеющихся знаний и понимания теории, о которой у вас в лучшем случае очень расплывчатое предстваление, если вообще какое имеется.
Более того, прогрессивное человечество вполне даже в курсе проблемы, например, поэтому существуют такие проекты как "простой английский", lojban и т.п.
Подождите, значит алефы - это фигня, и на нее не нужно обращать внимание, а как на счет особых шрифтов и некоторых букв из этих шрифтов - например буква f из позднего французкого барокко (интеграл). Или, про что уже упоминалось, фрактурной си?
Существуют соглашения? Да ну? Я даже в контексте одного курса по дискретной математике насчитал три разных значка для записи разницы сетов. Три различных значка (но вполне вероятно их есть еще) для записи логического отрицания. А чего только может не значить запятая - тут просто кроме интуиции и счастливой случайности ничего не поможет разобраться.
Соглашений нет, никто ни с кем не соглашался, более того, никто даже не предпринимал серьезной попытки что-то с этим сделать.
Или, еще пример, те, кто учились в совке верят в то, что есть такой символ "делится на", а те, кто учился, например в штатах про такой значек (три вертикальные точки) ничего не знают, но зато у них есть неизвестный в совке значек "число делит другое" (записывается как вертикальная черточка). И где только не используется эта вертикальная черточка...
roman-kashitsyn 17.07.2012 20:30 # +4
Интеграл к f не имеет никакого отношения. Это деформированная буква S (сумма). Говорим спасибо Лейбницу.
wvxvw 17.07.2012 20:50 # 0
Абсолютно не важно какую букву подразумевал Лейбниц когда задумывал интегралы. Важно то, что используется каллиграфическая f из чего-то смутно напоминающего рафинированый курсив Петрарки.
guest 17.07.2012 21:08 # 0
Нафига например тензоры, ведь: "некогда думать, надо матрицы расписать".
guest 17.07.2012 21:22 # +1
Разве tail . reverse, показанное [color=blue]bormand[/code] не читабельно?
Или вас "." смущает в контесте ЯП? Ну здесь, слава ТНБ, операторы не сильно отличаются от ф-ий, делаем линк и записываем:
Кстати, есть и такое, только вы аккуратно по ссылке ходите, ежели пойдете: http://hackage.haskell.org/packages/archive/base-unicode-symbols/0.2.2.4/doc/html/Prelude-Unicode.html
bormand 17.07.2012 21:28 # +1
Привет из APL?
wvxvw 17.07.2012 21:47 # 0
Я могу ошибаться, т.как давно читал, но, iirc это говорила Княжна Ольга то ли в беседе с Безуховым то ли в письме к кому-то. Но не суть.
ТНБ и иже с ними - не нужно, более того, вредно, т.как мешает а не содействует пониманию того же материала. Заставляет заучивать кучу закорючек. Вот вы тут пример привели. И вам кажется что это читабельно. Но, на самом деле, человек с опытом чтения разноплановой литературы прийдет в недоумение от вашего примера:
1. Ни один из популярных языков мира не расставляет слова в таком порядке (мозг нужно напрячь, чтобы переставить их в читабельную форму).
2. У обратных апосторофов есть куча значений (Баш / ПХП - системный вызов, экранирование, мета-кавычки и т.д.).
3. Эта форма ничего не говорит о порядке применения функций (вообще не понятно, функции это или нет).
Увидев текст выше вне контекста я бы интепретировал это как вызов системной утилиты compose (которая очевидно возвращает какие-то опции которые можно использовать с утилитой tail) и чтение из файла под названием reverse количество строк указанных в compose. С другой стороны: tail(reverse(x)) не оставил бы никаких сомнений в смысле интерпретации.
bormand 17.07.2012 21:55 # +1
guest 17.07.2012 22:19 # 0
kipar 19.07.2012 10:44 # −1
guest 17.07.2012 22:32 # 0
Не говорил, что сразу. Привычка нужна, да и редактор, подсвечивающий операторный вид ф-ии не помешает.
> 2. У обратных апосторофов есть куча значений
Кто первый встал, того и тапки?
> 3. Эта форма ничего не говорит о порядке применения функций
Чуть-чуть говорит: если помнить, что оператор, тогда логично, что это (∘). Можно было бы then = flip (.). Вроде так меньше однозначностей.
И всегда можно явно передавать аргументы, как указал bormand. point-free можно не придерживаться, но, имхо, если в меру - удобно.
> Увидев текст выше вне контекста я бы интепретировал это
Это скорее межязыковая проблема. Для backquote ведь общих соглашений? (в смысле по сравнению с + - et cetera).
wvxvw 17.07.2012 23:25 # +2
Эта форма говорит что-то ограниченному кругу ограниченных людей, нормальным людям она не говорит ни о чем. Это попытка сохранить никому не нужную традицию вопреки здравому смыслу (необходимости понимания тебя другими людьми).
Так я и пишу (tail (reverse x)) только Хаскелл мне для этого не нужен. Более того, мне более приятен язык, который не допустит херни с разными вариантами написания, потому что я хочу не только свой код читать, но и код других людей тоже.
Особо хотелось бы взять и уебать г. Декарта за "поинт фри" - это кажется была его идея не писать значек умножения между множителями. При всех его заслугах перед математикой, столько говна в типографию как математики не привнесли даже музыканты.
Просто для сравнения: страница рукописи на заре моей юности стоила 5 шекелей у студента и 10 у машинистки. Страница рукописи с шахматными диаграммами, нотами и прочей херней - от 50 шекелей. Математические формулы - обычно просто посылают нахуй, простите, но именно так. Ни одна профессиональная машинистка по доброй воле не возьмется их печатать. (что уж и говорить о корректорах!)
Причины такой нелюбви банальны:
- нет никакой возможности автоматически проверить напечатанное ввиду эзотерической манеры письма.
- очень тяжело понять (даже просто прочитать вслух!) практически любую нетривиальную формулу.
- нет никакой возможности механически взаимодействовать с источником. Автор написанной херни должен в буквальном смысле вычитывать каждую строчку. Процесс просто мучительный.
- даже при наличии ЛаТеКса набор требует запоминания неимоверной кучи хаотически определенных пиктограм и последовательностей.
roman-kashitsyn 17.07.2012 23:37 # 0
Ваши претензии напоминают мне случай с Бетховеном: скрипачи пришли к нему пожаловаться, что им сложно играть произведения мастера.
Бетховен был в бешенстве: "Какое мне дело до ваших скрипочек, когда во мне горит вдохновение!".
wvxvw 18.07.2012 00:32 # +1
Я говорю, что Хаскелл больше всего похож на неведомую средневековую херню, а вы мне говорите "а за то он похож на неведомую средневековую херню которую понимает несколько человек, которые разбираются в неведомой средневековой херне".
Да! Я с вами согласен, именно так и есть.
roman-kashitsyn 18.07.2012 00:50 # 0
А то, что вы воспринимаете математическую нотацию как вещь в себе, нотацию ради нотации. На самом деле это лишь механизм, способ передачи глубоких идей и закономерностей.
Мне абсолютно ВСЁ РАВНО, насколько сложно играть allegro ma non troppo девятой симфонии или allegretto седьмой или allegro assai 23 сонаты или presto agitato из 14 или <подставьте удачный музыкальный фрагмент>. Меня гораздо больше волнует сама музыка, чувства, которые она вызывает, нежели трудности, возникающие при её воспроизведении (уж поверьте, техничность в музыке - лишь вершина айсберга). Ноты, техника, скрипки, клавиши - это всё средство, механизм достижения высшей цели. И, чёрт возьми, Бетховен прекрасно умел достигать эту цель. А скрипачи... Да кого волнуют их трудности?
Вот и ваши жалобы на сложность нотации/синтаксиса у меня лично других эмоций кроме ЛОЛЧТО не вызывают.
wvxvw 18.07.2012 01:09 # +2
Есть очень немного областей человеческой деятельности в которых изучение инструмента (а не того, как добиться необходимого результата) представляют существенный процент. Такими областями являются, например, авиация (очень важно знать КАК управлять самолетом, а не куда лететь).
Иногда такая расстановка приоритетов оправдана и не вызывает неудобств. Нет ничего плохого в том, что всего 0.01% людей будет летчиками или музыкантами, и не стоит тратить сил на разработку лучшей нотной записи или изготовление упрощенных самолетов.
Но с математикой ситуация совсем не такая. Чем больше людей ей будут владеть и чем лучше - тем лучше для этих самых людей вне зависимости от рода деятельности. Это не наука для "избранных", где можно закрыть глаза на "исторически сложившиеся обстоятельства" и послать недовольных.
eth0 18.07.2012 13:07 # +1
HukoJlau_KJll-OEB 17.12.2019 20:14 # 0
И уже оставшуюся половину жизни копить репертуарю
wvxvw 18.07.2012 00:40 # 0
Но у этих слов есть практическая мера установленная экспериментальным путем: человек в среднем может запомнить Х слов, в кратросрочной памяти хранить У слов, произвести Н перестановок, предугадать К ситуаций и т.д. Это все, конечно, не константы, но диапазон более-менее известен и его можно вполне оценить доступными инструментами. Перeдачу информации в виде текста можно оценить в смысле удобства экспериментальным путем. О чем я выше и говорил. Математические формулы объективно плохой пример передачи информации, на шкале между узелковым письмом и нотами, но скорее ближе к узелковому письму.
roman-kashitsyn 18.07.2012 01:03 # 0
Собственно, переубедить мне вас всё равно не удастся.
wvxvw 18.07.2012 01:34 # 0
Есть язык со сложившимися практиками и набором идиом. А каким образом они в него попали - так какая разница?
Когда я что-то говорил про сущности в Хаскелле? :/ эта тема меня никогда особо не интересовала / в этом смысле в нем нет ничего необычного / интересного.
Все, что я говорл про Хаскелл касается исключительно системы письма и более ничего. Т.е. хуже Хаскелла существуют языки, например тут несколькими постами ниже, или XSLT тоже то еще моральное уродство. Просто иногда зло берет когда у человека без представления о читабельности и понятности хватает смелости выдвигать гипотезы и подавать их в качестве истины в последней инстанции.
roman-kashitsyn 18.07.2012 01:50 # 0
То есть Type Classes для вас - обыденное дело, во всех языках полно такого хлама, Expression Problem давно побеждён, верно?
> у человека без представления о читабельности и понятности хватает смелости выдвигать гипотезы
Откуда сведения о моих представлениях? Почему ваши представления более авторитетны, чем, например, мои?
wvxvw 18.07.2012 02:04 # 0
Нет, в этом нет ничего удивительного в том смысле, что у кого-то есть что-то одно, у другого - другое. В Хаскелле идиотская система сохранения состояния (монады), но кому-то она нравится. Она не достаточно плохая или хорошая, чтобы вызывать эмоции сопоставимые с эмоциями, которые вызывает его синтаксисом. Точно в таком же смысле как ПХП замечателен анархизмом и полным произволом создателей, что и вызвяет много эмоций. То, что это, наверное, единственный язык в котором есть всего один тип коллекций (ну из отностильно популярных) - не очень интересный факт на общем фоне.
roman-kashitsyn 18.07.2012 02:06 # 0
Например, Гвидо, создателю Python
> нет ничего удивительного
Type Classes лично на меня произвели несравнимо большее впечатление, чем питоньи метаклассы. Сильнее меня впечатляли только лисповые макросы.
XYPO3BO3 27.12.2019 00:39 # 0
HukoJlau_KJll-OEB 19.12.2019 20:41 # 0
guest11 22.12.2019 23:25 # 0
rOMOCEKCYAjluCT 23.12.2019 01:03 # 0
inkanus_gray 23.12.2019 01:04 # 0
6A9lHuCT 23.12.2019 01:08 # 0
USB 17.07.2012 23:00 # 0
Как то так?
http://ideone.com/Cwbu8
zim 19.07.2012 12:10 # 0
XYPO3BO3 17.12.2019 17:26 # 0
inkanus_gray 23.12.2019 01:05 # 0
roman-kashitsyn 16.07.2012 13:20 # +1