Обновить
14

Химик и программист.

32
Подписчики
Отправить сообщение
Нет, не переменная, она ж не меняется.
Как не меняется? Я так понял, что до выполнения оператора
where s = sin fi

s не определена, а после равна значению синуса аргумента fi.
Да. Можем взять другой ЯП — ассемблер)
s, как и мой temp — переменная? Значит переменные допустимы в ФП? Сколько раз вызывается sinFi в каждом примере?
В каком языке?
ОО Паскаль (Дельфи-7).
Вы понимаете разницу между переменной и параметром?
Понимаю. В Паскале, нпр.:
function sinFi (fi :real) :real;
begin
 Result := sin(fi);
end;

Могу вызвать из другой функции:
function f2 :real;
begin
 Result := sinFi(pi/2);
end;

И так:
function f2(fi :real)  :real;
var
 temp: real; // локальная переменная
begin
 temp := sinFi(fi);
 if temp>0.5 then
 Result := temp*2
else
 Result := temp*3;
end;

Можно такое в рамках ФП. Или, чтобы избежать переменной, я должен сделать:
function f2(fi :real)  :real;
begin
 if sinFi(fi)>0.5 then
 Result := sinFi(fi)*2
else
 Result := sinFi(fi)*3;
end;

Result — переменная?
Да, наивному решету надо в log n раз больше памяти, но это лечится если ввести сегментацию — тогда оно будет занимать ассимптотически столько же памяти, что и ваш алгоритм. А если надо хранить не все простые
Т.е. что-то надо хранить. Хранят в переменных (явных или неявных), но при этом постоянно говорят, что
в чистых функциональных языках переменных вообще нет

Так есть или нет? ИМХО если что-то хранить, то хранится в переменной. А иначе напоминает двоемыслие.
Тут путаница. Я понял, что глобальные переменные в ФП запрещены. А локальные? Могу в функции определить и использовать переменную? Аргументы функции — переменные? Результат — переменная?
при одинаковых входных данных не получим одинаковые выходных.
Это допустимо в ФП? В определении сказано обратное.
main чистая функция?
Спасибо. Я читал про SSA.
Фактически — это версия вашей программы в функциональном стиле.
По указанной ссылке я такого не нашел. И не очевидно, как это соотносится с определением ФП, предложенным в данной статье.
Особо меня интересуют ГСЧ и обработка событий. Не вижу трудностей для:
промежуточное представление, используемое компиляторами, в котором каждой переменной значение присваивается лишь единожды. Переменные исходной программы разбиваются на версии, обычно с помощью добавления суффикса, таким образом, что каждое присваивание осуществляется уникальной версии переменной.

Но в обсуждаемой статье:
Формулы хорошо формализуются и при одинаковых входных данных возвращают одинаковые выходные.
Про эту проблему для событий и ГСЧ уже говорил в данном обсуждении.
Еще раз уточню: исхожу из определения обсуждаемой статьи.
Вряд ли разработку google.com можно назвать «маленькой учебной задачей».
Нет, но как сказал выше:
у каждого проекта своя специфика
Мы о случайных величинах или об этом?
В примере в качестве случайной величины я предложил использовать неинициализированную переменную. На практике кто-то может ее использовать и по ошибке. Как защититься от такой ошибки?
Понял. Может лучше сказать, что это переменные с особыми свойствами? ;) Так будет понятнее, чем «без переменных».
Компилятор для DSL — достаточно крупный проект?
Наверняка крупный, но у каждого проекта своя специфика. Для другого может не подойти.
И чистота системы типов отлично от этого защищает.
Как защищает в случае неинициализированных переменных?
Мне нужно вдумчиво смотреть на insert и balance, чтобы попытаться понять, какой случай я упустил. Зачем мне бегать дебаггером, какую новую информацию он мне даст?
Это уже не теория, а практика. Действительно в простых учебных задачах бывает достаточно просто хорошо подумать над результатами тестов. Но для более сложных отладчики себя зарекомендовали. Факт, что чем больше всяких возможностей для отладки — тем лучше. Дело не только в том чтобы найти баг, а чтобы найти его достаточно быстро.
Э, ну можно же. Модификация состояния (в том числе состояния ГПСЧ) — это эффект, а эффект моделируется монадой.
я не спорю: многое возможно. Но люди склонны совершать ошибки. Одна из типовых ошибок — непредсказуемое поведение функции.
Когда как удобнее. Полезно владеть всем.
Если я правильно понял, есть случаи, когда ФП удобнее ООП — можете привести пример?
И наоборот: когда ООП удобнее ФП — а пример такого случая?
ИМХО это как раз плохо, когда нет переменных. Что-то скрыть не самоцель, а цель облегчить понимание и отладку. Или м.б. вместо отладки на высоком уровне исходного кода лезть в объектный код? Выше я привел примеры, в которых нельзя применить ФП — это случайные значения переменной и события. Мы ушли в сторону, выясняя, что можно без переменных. Но исходный пункт остался: видимо есть задачи, которые решаются ООП, но не ФП.
Ok. Готов допустить, что компилятор не нарушает. Но при этом не понял, чем эта абстракция удобнее, нпр., абстракции ООП? Тут нужно какое-то отдельное обоснование, т.к. может быть абстракция наоборот затрудняющая работу с кодом.
Так нужны переменные a,b,n? Зачем слово «переменных» в кавычки ставить? ИМХО отлаживать проще, когда известно точное имя. Мне кажется, что переменные (пусть локальные) облегчают разработку.
который, конечно, где-то в глубине компилируется во вполне мутабельный код, но это деталь реализации, нас не сильно интересующая
В данном случае интересующая: если деталь скрытая — то не значит, что ее нет. Посмотреть ассемблер — будут там переменные, изменения значения.

Информация

В рейтинге
Не участвует
Зарегистрирован
Активность