Здравствуйте, BulatZiganshin, Вы писали:
BZ>согласен — в асме были переходы, в С циклы, в хаскеле — формулы. какой тебе вариант понятней — асмовский, сишный или
BZ>fac 0 = 1 BZ>fac n = n*fac(n-1)
BZ>?
Смотря что считать понятностью. Если задавать вопросы "как это работает?", "насколько это эффективно?", "а что такое хвостовя рекурсия?" — то циклы таки-попонятнее будут.
Здравствуйте, BulatZiganshin, Вы писали:
BZ>согласен — в асме были переходы, в С циклы, в хаскеле — формулы. какой тебе вариант понятней — асмовский, сишный или BZ>fac 0 = 1 BZ>fac n = n*fac(n-1) BZ>?
K>>ФП — это комбинирование комбинаторов как основной способ решения задач программирования, а не "я тут как-то раз фильтр использовал вместо цикла".
не смотри на хакселистов. они ещё и не такое скажут.
F>>а как без них? EP>Комбинирование комбинаторов полно по Тьюрингу. Смотри например SKI, Unlambda:
это если они есть в языке.
EP>Pointfree в том числе именно об этом — лямбды либо принимают какие-то параметры, либо захватывают. Pointfree же о том, чтобы вообще не использовать никакие параметры.
и там же автор пишет "не превращайте код в нечитабельное говно своим pointfree-фаназизмом".
это не серебрянная пуля. это скорее маленьках синтаксическая хитрость, которая позволяет сделать код в некоторых случаях читабельней.
Здравствуйте, Evgeny.Panasyuk, Вы писали:
EP>Здравствуйте, Kernighan, Вы писали:
K>>А где тут ЯВУ, а где ассемблер? K>>Можно ли назвать ЯВУ язык, в котором даже циклов нет? (трольфейс)
EP>В ASM есть инструкция с говорящим именем loop
Ну, да. Digital в своё время даже на С долгое время не переходила,
потому что у неё был настолько хороший Макроассемблер.
Здравствуйте, Evgeny.Panasyuk, Вы писали:
K>>А где тут ЯВУ, а где ассемблер? K>>Можно ли назвать ЯВУ язык, в котором даже циклов нет? (трольфейс)
EP>В ASM есть инструкция с говорящим именем loop
Она как, это что же теперь получается, асм в яву записали?
Здравствуйте, Evgeny.Panasyuk, Вы писали:
EP>В ASM есть инструкция с говорящим именем loop
А ещё есть (были?) loadsb, stosb. Но это не настоящий ассемблер
Они теперь всё это на лету переделывают в настоящий ассемблер, на чём наверняка что-то теряют.
А у остальных (RISC) такого никогда и не было.
K>>>ФП — это комбинирование комбинаторов как основной способ решения задач программирования, а не "я тут как-то раз фильтр использовал вместо цикла".
F>не смотри на хакселистов. они ещё и не такое скажут.
Они давно распробовали и комбинаторы и лямбды, и в результате отдают предпочтение комбинаторам. Почему бы не принять во внимание их мнение?
F>>>а как без них? EP>>Комбинирование комбинаторов полно по Тьюрингу. Смотри например SKI, Unlambda: F>это если они есть в языке.
А в каком ФП языке их нет?
Я даже на C++ реализовывал
gentoo fibs # tail -n 6 main.cpp && clang++ main.cpp -std=c++1y -stdlib=libc++ && echo _____ && ./a.out
int main()
{
auto fibs = fix(cons(0) * cons(1) * (zipWith(sum) <ap> tail));
auto x = fibs <at> 101;
cout << x << endl;
}
_____
573147844013817084101
EP>>Pointfree в том числе именно об этом — лямбды либо принимают какие-то параметры, либо захватывают. Pointfree же о том, чтобы вообще не использовать никакие параметры. F>и там же автор пишет "не превращайте код в нечитабельное говно своим pointfree-фаназизмом". F>это не серебрянная пуля. это скорее маленьках синтаксическая хитрость, которая позволяет сделать код в некоторых случаях читабельней.
Я же сказал что pointfree это "хороший тон", а не руководство к действию.
Здравствуйте, Evgeny.Panasyuk, Вы писали:
EP>Они давно распробовали и комбинаторы и лямбды, и в результате отдают предпочтение комбинаторам. Почему бы не принять во внимание их мнение?
потому что они хакселисты. этого уже достаточно, чтобы относиться с подозрением к их вкусам.
тем более, если они создают новые определения для старых вещей. что дальше будет? для ФП-языка потребуется поддержка линз или монад?
F>>это если они есть в языке. EP>А в каком ФП языке их нет?
EP>Я же сказал что pointfree это "хороший тон", а не руководство к действию.
хороший тон в ФП? нет, это хороший тон в х-е, потому что не все языки поддерживают ЧП.
Здравствуйте, BulatZiganshin, Вы писали:
EP>>Какой вариант тебе понятней? Императивное вычисление чисел Фибоначчи? Или BZ>fib 0 = 1 BZ>fib 1 = 1 BZ>fib n = fib(n-1) + fib(n-2)
Эта наивная реализация requires O(fib n) additions В то время как в наивной итеративной версии будет линейное количество сложений.
BZ>а тебе?
Во-первых хакелисты считают каноничной другую версию.
Во-вторых итеративную версию можно объяснить ребёнку, который даже складывать не умеет — через линейку и циркуль. А вот на счёт рекурсивной версии (не говоря уже об каноничной) я так не уверен
Здравствуйте, cures, Вы писали:
EP>>В ASM есть инструкция с говорящим именем loop C>А ещё есть (были?) loadsb, stosb. Но это не настоящий ассемблер C>Они теперь всё это на лету переделывают в настоящий ассемблер, на чём наверняка что-то теряют.
Я кстати не помню чтобы компилятор вставлял loop — везде был явный счётчик и условный переход.
Здравствуйте, BulatZiganshin, Вы писали:
BZ>Здравствуйте, Kernighan, Вы писали:
K>>Можно ли назвать ЯВУ язык, в котором даже циклов нет? (трольфейс)
BZ>согласен — в асме были переходы, в С циклы, в хаскеле — формулы. какой тебе вариант понятней — асмовский, сишный или
BZ>fac 0 = 1 BZ>fac n = n*fac(n-1)
Ну мне понятнее сишный.
Получается, что функциональные языки по степени своей высокоуровневости стоят где-то рядом с процедурными, а не выше их.
Кстати, факториал на С тоже пишется в две строчки (можно даже в одну).
BZ>>fac 0 = 1 BZ>>fac n = n*fac(n-1)
K>Ну мне понятнее сишный.
При том, что это — практически прямая математическая запись? Ну-ну.
K>Получается, что функциональные языки по степени своей высокоуровневости стоят где-то рядом с процедурными, а не выше их.
Здравствуйте, Mamut, Вы писали:
BZ>>>fac 0 = 1 BZ>>>fac n = n*fac(n-1)
K>>Ну мне понятнее сишный.
M>При том, что это — практически прямая математическая запись? Ну-ну.
Вы так говорите, как будто математическая запись — это хорошо.
В современном мире программистов гораздо больше, чем математиков,
и программирование по большей части решает задачи с математикой
(тем более школьно-формульной математикой) никак не связанные.
K>>Получается, что функциональные языки по степени своей высокоуровневости стоят где-то рядом с процедурными, а не выше их.
M>Нет, не получается.
Здравствуйте, Evgeny.Panasyuk, Вы писали:
EP>Здравствуйте, Kernighan, Вы писали:
K>>А где тут ЯВУ, а где ассемблер? K>>Можно ли назвать ЯВУ язык, в котором даже циклов нет? (трольфейс)
EP>В ASM есть инструкция с говорящим именем loop
Ну вот видите, даже в ассемблере есть, а в функциональных языках нет.
Какие же они после этого высокоуровневые?
M>>При том, что это — практически прямая математическая запись? Ну-ну.
K>Вы так говорите, как будто математическая запись — это хорошо.
Вообще-то — это очень хорошо.
K>В современном мире программистов гораздо больше, чем математиков,
И подавляющее боьшинство программистов учило математику не только в школе, но и в университете.
K>и программирование по большей части решает задачи с математикой K>(тем более школьно-формульной математикой) никак не связанные.
А я и не говорил, что они этим занимаются Главная проблема императивщины в том, что она убирает любую декларативность из программирования и за деревьями не видно леса. ФП предлагает возможность описать задачу в терминах «что надо сделать», а не «как это сделать».
И все эти определения функций, иммутабельные переменные и прочее прекрасно ложатся на даже те базовые мат. знания, которыми по идее должен обладать каждый программист.
K>>>Получается, что функциональные языки по степени своей высокоуровневости стоят где-то рядом с процедурными, а не выше их.
M>>Нет, не получается.
K><сарказм>Аргументированно.</сарказм>
Здравствуйте, Evgeny.Panasyuk, Вы писали:
EP>Я кстати не помню чтобы компилятор вставлял loop — везде был явный счётчик и условный переход.
Это потому, что она если и была когда-то эффективней отдельных декремента и условного перехода, то очень давно, во времена 8086. Кстати, с декрементом такая же фигня по сравнению с обычным вычитанием. Их даже отменили в 64-битном режиме, чтобы освободить место для новых инструкций.
Так что можете считать, что инструкции loop в ассемблере нет
Здравствуйте, Mamut, Вы писали:
M>Главная проблема императивщины в том, что она убирает любую декларативность из программирования и за деревьями не видно леса. ФП предлагает возможность описать задачу в терминах «что надо сделать», а не «как это сделать».
Нет, не предлагает. Несмотря на лаконичный синтаксис, это всё равно описание "как это сделать". Например поменяв строчки в примере fac местами — получим stackoverflow.
Причём это "как" зачастую плохо отображается на современные железо. Лаконичный и "типа декларативный" fibs — тормоз
— именно потому что описывается "как", а не "что." И только потому что описывается "как" приходится знать о таких вещах "как" хвостовая рекурсия, чтобы понимать и иметь возможность переписать через дополнительный acc параметр, убивая изначальную "типа декларативность".
Здравствуйте, BulatZiganshin, Вы писали:
I>> Если начать осваивать программирование с процессора, то окажется, что никакого ФП и близко нет, всё насквозь мутабельное.
BZ>а если изучить как физически устроены процессоры то окажется что это чистое ФП, которое протянули через угольное ушко императивности.
Это как??
> в результате монстр с миллиардами транзисторов может выполнять от силы несколько тыщ операций одновременно, да и то с кучей ограничений.
да, у императивной парадигмы такие требования. а что меняет функциональная?
> или изучить как работает человеческая психика и окажется что там есть императивная часть в виде мускулов и желех и ФП-часть > которая занимается чисто обработкой информации.
мне более понятно представление где вычисляющая система это экспертная система как CLIPS, а не символическая система как Lisp
(об этом хорошо написал Питер Джексон, Введение в экспертные системы в Главе 4; п.4.4. "Почему LISP не является языком представления знаний" )
> и даже если заглянуть в глубины физики, то окажется что они давно представляют мир в виде формул, где время представляет > собой всего лишь одну из многих переменных
в смысле если где-то в физике есть формула то это формула почему-то на лиспе? И почему эта формула не на ФорТране?? ("языке формул"). хотелось бы знать, при чем тут время вообще.