Степан Митькин писал(а):
3. Не указано, что сначала нужно посчитать delta, потом radix, потом корни.
Так и в Haskell порядок вычислений не указывается.
Там наоборот приходится делать специальные приседания для того, чтобы указать порядок выполнения.
Порядок выполнения как раз нужен в программах типа "введите a, введите b, введите c, ваш ответ такой-то".
Степан Митькин писал(а):
В чём выигрыш? В том, что этого кода нужно писать меньше. В этом соль изобретения Тыугу. Оно просто и гениально.
Это когда стрелочки сами рисуются между квадратиками
Вообще говоря, современный подход предполагает, что "глобальные переменные это зло".
Вы же наоборот радуетесь от того, что "функция получает аргументы из глобальной области видимости".
Я, конечно, понимаю, что вы больше про то, что "функция получает аргумент из того места где она была вызвана" и что, якобы, "глобальных переменных может не быть".
Но при "автоматическом непойми-каком связывании" получится, что "система обнаружит, что функция delta может вычислить D из a, b и c". Но эта система же никак не понимает смысл a b c? Может, программист вообще не квадратное уравнение имел ввиду, а просто имена совпали. В итоге, имена переменных совпали, а система уже вызвала delta и т.п. Кому такое нужно?
Степан Митькин писал(а):
Рассмотрим непосредственную выгоду первой идеи (уменьшение связующего кода).
1. Отсутствует вызов quad_discr a b c
О, да, сэкономили целую строку кода! Сразу видно, что технология нужная. Шутка.
Этот "сэкономленный" вызов quad_discr решал понятную задачу. Он описывал на каких именно данных вычисляется функция (см ниже).
Степан Митькин писал(а):
2. Функции radix и delta не имеют аргументов.
Встречный вопрос: а почему тогда у функции quadsolve аргументы появились?
Где логика?
Ну и ещё вопрос: как решить сразу 2 квадратных уравнения?
Допустим, у меня (каким-то образом) возникли переменные a,b,c, a1,b1,c1.
Ну и хочу я решить два квадратных уравнения, а в результат вывести частное корней.
Вы же говорите, что "delta" не имеет аргументов. Значит решить a1,b1,c1 "автоматическим связыванием" не получится.
Что, добавлять ещё одну функцию delta1=b1*b1-4*a1*c1 ?
Ну и какой тогда смысл в этом автоматическом связывании?
Степан Митькин писал(а):
Этот пример маленький, и связующего кода там мало. Объём связующего кода в сложных задачах возрастает и достигает безумия.
Это бомба!
Где же оно, это безумие?
Давайте такой пример посмотрим.
Дано: "файл с цифрами по-английски" (one two five one ...). Нужно: заменить слова на цифры (1 2 5 1 ...)
Решение на Haskell (см
https://stackoverflow.com/a/7833652/1261287 ):
Код:
import Control.Monad
main = do
str <- readFile "no.txt"
mapM_ (print . english) (words str)
english "one" = 1
english "two" = 2
english "three" = 3
english "four" = 4
english "five" = 5
english "six" = 6
english "seven" = 7
english "eight" = 8
english "nine" = 9
words разделяет строку на слова (делает список из слов). mapM_ применяет функцию (print . english) к списку.
Имена переменных вообще нигде не фигурируют. Где же обещанный безумный объём связывающего кода?
Материал по теме называется
pointfree notation