2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу Пред.  1, 2, 3, 4, 5 ... 8  След.
 
 Re: Слабость функциональной парадигмы
Сообщение19.05.2015, 15:12 


07/05/15

110
aa_dav в сообщении #1017201 писал(а):
я не понимаю к чему ваши примеры про номиналы или равенство программ.


К тому, что мы берем объект, и возвращаем объект
Код:

Account := Object clone do(
balance ::= 0
deposit := method(amount, setBalance(balance + amount))
)

account := Account clone

deposit := method(amount, account, account deposit(amount); account)

deposit(10, account) print
deposit(30, account) print

# :::  Account_0xbb0a18:
# :::   balance          = 10
# :::  Account_0xbb0a18:
# :::   balance          = 40

функция deposit всегда возвращает одно и то же -- тот же экземпляр аккаунта, который подается на вход ее. В чем нечистота? Так же и с random. Я запутался, конечно, по поводу new вы возможно правы, но если она будет возвращать всегда тот же экземпляр random, который подается в качестве аргумента, она останется чистой во всех смыслах, она возвращает всегда одно и то же.

 Профиль  
                  
 
 Re: Слабость функциональной парадигмы
Сообщение19.05.2015, 15:48 


11/12/14
893
nondeterminism в сообщении #1017215 писал(а):
функция deposit всегда возвращает одно и то же -- тот же экземпляр аккаунта, который подается на вход ее. В чем нечистота?


Здесь нечистота проистекает не из содержания функции deposit, а из-за наличия set в методе и потому mutable данного.
Причём в данном коде концептуально проблема еще не видна.
Вот где она появится:
Код:
var account = new Account;
function something( account )
{
     return function() { return deposit( 10, account ); };
};
var subfunc = something( account );
// следующие куски кода поведут себя по разному:
// 1 вариант
deposit( 10, account );
print subfunc();
// 2 вариант
print subfunc();
deposit( 10, account );

(1-ый и 2-ой варианты взаимоисключающи).
т.е. мы получили нечистую функцию, её результат зависит не только от параметров, а и от внешнего окружения.

 Профиль  
                  
 
 Re: Слабость функциональной парадигмы
Сообщение19.05.2015, 16:27 
Заслуженный участник


27/04/09
28128
Хотел упомянуть Disciple, но, видимо, не стоит, а то ещё вдруг у nondeterminism взорвётся мозг…

 Профиль  
                  
 
 Re: Слабость функциональной парадигмы
Сообщение19.05.2015, 16:30 


07/05/15

110
aa_dav в сообщении #1017223 писал(а):
т.е. мы получили нечистую функцию, её результат зависит не только от параметров, а и от внешнего окружения.


Я не вижу тут никакой зависимости от параметров или внешнего окружения
Код:


Account=function(){}
Account.prototype={
balance: 0,
deposit: function(amount){this.balance+=amount}
}

var account = new Account;

account.name="this account"

deposit=function(amount, account){account.deposit(amount); return account}

function something( account )
{
     return function() { return deposit( 10, account ); };
};

subfunc = something( account );

deposit( 10, account );
console.log(subfunc())

console.log(subfunc());
deposit( 10, account );

console.log(subfunc());

// ::: { name: 'this account', balance: 20 }
// ::: { name: 'this account', balance: 30 }
// ::: { name: 'this account', balance: 50 }

она по прежнему всегда возвращает одно о то же.

-- 19.05.2015, 17:35 --

arseniiv

По поводу взрыва мозга -- это Вы себе льстите, по поводу же Вашей бумаги: я не читаю абы что, иначе я бы уже перечитал весь литературный мусор на планете. Прежеде чем что-либо читать, я сначала должен быть уверен, что оно мне нужно.

 Профиль  
                  
 
 Re: Слабость функциональной парадигмы
Сообщение19.05.2015, 16:40 


11/12/14
893
nondeterminism в сообщении #1017252 писал(а):
она по прежнему всегда возвращает одно о то же.


Если // ::: это выводы console.log, то блин, видно что оно возвращает разный результат. А должно быть balance: 10 три раза.

 Профиль  
                  
 
 Re: Слабость функциональной парадигмы
Сообщение19.05.2015, 16:44 


07/05/15

110
aa_dav в сообщении #1017255 писал(а):
видно что оно возвращает разный результат. А должно быть balance: 10 три раза.


Давайте, таки, определимся с терминологией. Функция возвращает один и тот же объект. Всегда. То что у этого объекта изменяется состояние, нашу функцию не волнует.
Цитата:
разный результат

один и тот же объект -- это разный результат?

 Профиль  
                  
 
 Re: Слабость функциональной парадигмы
Сообщение19.05.2015, 16:51 
Заслуженный участник


27/04/09
28128
nondeterminism в сообщении #1017252 писал(а):
я не читаю абы что
Не читайте и дальше.

 Профиль  
                  
 
 Re: Слабость функциональной парадигмы
Сообщение19.05.2015, 16:52 


11/12/14
893
nondeterminism в сообщении #1017258 писал(а):
один и тот же объект -- это разный результат?


Да.
Функция должна вернуть что то с чем одинаковый кусок кода выдаст одинаковый результат.
Код:
console.log(func())

должно вести себя абсолютно одинаково и ни от чего более не зависеть.
Сколько раз не напиши подряд - должно быть 10,10,10,10...
Видим код - сразу же сужаем те возможности что он может сделать.
Чистота функций в ФП рассматривается в полезном смысле именно благодаря этому свойству. Иначе бы никому и не было бы интересно.
Видим:
Код:
func1(f(arg),g(arg))

и к примеру совершенно не заморачиваемся сперва вычислится ли f(arg) или сперва вычислится g(arg). Порядок вычисления НЕВАЖЕН.
Отсюда возможности к параллелизму и т.п.
На корню такую возможность срубает мутабельность и вот эти вот ссылочные мутабельные объекты.
Если дело принимает такой оборот программа обрастает мгновенно невидимыми и неявными но сильными связями затрудняющими то-то и то-то.
В этом смысле чистое ФП воспринимается как некая "благодать".
Но признаюсь тоже в данный момент - я не сильный поклонник ФП, хотя признаю что штука красивая и как минимум отличная разминка для мозгов.
Но я в практике сильно не сталкивался и более того - не хочу.

 Профиль  
                  
 
 Re: Слабость функциональной парадигмы
Сообщение19.05.2015, 17:04 


07/05/15

110
aa_dav в сообщении #1017263 писал(а):
Сколько раз не напиши подряд - должно быть 10,10,10,10...


Код:

sum = function(x, y){return x + y}

with(console){
  log(sum(1, 2).foo)
   Number.prototype.foo="bar"
  log(sum(1, 2).foo)
}

// ::: undefined
// ::: bar

ф-ция sum по-Вашему, чистая?

-- 19.05.2015, 18:10 --

aa_dav в сообщении #1017263 писал(а):
Отсюда возможности к параллелизму и т.п.


Но ведь в рамках чистого ФП невозможен параллелизм. Об этом еще Барендрегт в начале своей книги пишет. И с чего Вы взяли, что ФП абстрангированно от последовательности вычислений? Как раз наоборот, одна редукция за другой, строго последовательная модель.

 Профиль  
                  
 
 Re: Слабость функциональной парадигмы
Сообщение19.05.2015, 17:13 


11/12/14
893
nondeterminism в сообщении #1017272 писал(а):
ф-ция sum по-Вашему, чистая?

тут - уже нет.
если вы не поняли почему (и почему яваскрипт не чистый ФЯ), то... возьмите SICP да почитайте.

-- 19.05.2015, 18:14 --

nondeterminism в сообщении #1017272 писал(а):
Но ведь в рамках чистого ФП невозможен параллелизм.


Ух ты! А что в чистом ФЯ мешает вычислить f(arg) и g(arg) параллельно?

 Профиль  
                  
 
 Re: Слабость функциональной парадигмы
Сообщение19.05.2015, 17:17 


07/05/15

110
aa_dav в сообщении #1017280 писал(а):
возьмите SICP да почитайте.


Я читал sicp достаточно забубенная книга, но в SICP конкретно заявляется, между прочим ровно то, что я сказал в стартовом топике. ФП -- слабая парадигма для проектирования моделей реального мира. С этого начинается, ЕМНИП 3-я глава.

-- 19.05.2015, 18:18 --

aa_dav в сообщении #1017280 писал(а):
А что в чистом ФЯ мешает вычислить f(arg) и g(arg) параллельно?


Именно то, что там строго последовательная модель вычислений. Один шаг -- одна редукция.

-- 19.05.2015, 18:24 --

aa_dav в сообщении #1017280 писал(а):
и почему яваскрипт не чистый ФЯ


javascript -- это вообще ни разу не ФЯ. Но у нас разговор не о языке, а о функциях.

 Профиль  
                  
 
 Re: Слабость функциональной парадигмы
Сообщение19.05.2015, 17:26 
Заслуженный участник


27/04/09
28128
Если я правильно помню семантику соответствующих мест JS, та функция sum чиста.

P. S. Но вы тот кусок кода написали, видимо, с намерением показать разный результат в исполнении чистой функции? Не вышло, потому что разные результаты — у выполнения атрибута foo уже готового результата функции, а не у неё.

 Профиль  
                  
 
 Re: Слабость функциональной парадигмы
Сообщение19.05.2015, 17:27 


11/12/14
893
nondeterminism в сообщении #1017282 писал(а):
С этого начинается, ЕМНИП 3-я глава.


Лол, да, там сперва дифирамбы поются немутабельности и чистоте, а потом в какой то момент хренак - и говорится что очередь (кажется) мы бы без set не реализовали эффективно и вся последющая книга идёт с применением set. Да, я тоже заметил.

nondeterminism в сообщении #1017282 писал(а):
Именно то, что там строго последовательная модель вычислений. Один шаг -- одна редукция.


Так а что мешает в
Код:
func(f(arg),g(arg))

аргументы рассматривать за два шага сразу?
я не знаю, может в какой то конкретной реализации конечного автомата прохода по дереву чего то там Барендрегт критикует - но не вижу проблемы для произвольного.

-- 19.05.2015, 18:28 --

arseniiv в сообщении #1017284 писал(а):
Если я правильно помню семантику соответствующих мест JS, та функция sum чиста.


Функция то чиста. JS нечист. =) И то что nondeterminism делает там - нечисто.

 Профиль  
                  
 
 Re: Слабость функциональной парадигмы
Сообщение19.05.2015, 17:30 
Заслуженный участник


27/04/09
28128
aa_dav в сообщении #1017285 писал(а):
И то что nondeterminism делает там - нечисто.
То, что он там делает, типично для JS, хотя не сказать чтобы этот язык мне нравился. (Но он мне не нравится из-за динамических типов, а не «грязноты».)

 Профиль  
                  
 
 Re: Слабость функциональной парадигмы
Сообщение19.05.2015, 17:35 


07/05/15

110
arseniiv в сообщении #1017284 писал(а):
Не вышло, потому что разные результаты — у выполнения атрибута foo уже готового результата функции, а не у неё.

Ровно то же самое и тут:
Код:
Account=function(){}
Account.prototype={
balance: 0,
deposit: function(amount){this.balance+=amount}
}

var account = new Account;

account.name="this account"

deposit=function(amount, account){account.deposit(amount); return account}

function something( account )
{
     return function() { return deposit( 10, account ); };
};

subfunc = something( account );

deposit( 10, account );
console.log(subfunc())

console.log(subfunc());
deposit( 10, account );

console.log(subfunc());

// ::: { name: 'this account', balance: 20 }
// ::: { name: 'this account', balance: 30 }
// ::: { name: 'this account', balance: 50 }

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 106 ]  На страницу Пред.  1, 2, 3, 4, 5 ... 8  След.

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: Bing [bot]


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group