LINUX.ORG.RU

Возможно ли избавиться от последовательного выполнения, оставаясь в рамках ФП?

 ,


0

4

Увлекся я тут ФП. Очень мне нравиться. Но вот возникает вопрос. В ФП любая ф-ция обязана возвращать значение в место вызова. Значит мы не можем делать асинхронные вызовы, любой такой вызов будет побочным эффектом. Значит и про параллелизм придется забыть. Насколько я понял, там это делается через разные костыли, но это все некрасиво. А можно ли избавится от последовательного выполнения, оставаясь при этом в рамках чистого ФП?



Последнее исправление: theKingOfJava (всего исправлений: 1)
Ответ на: комментарий от Stil

Кстати в книжке по R я примерно это и читал, мне тоже понравилась такая «суть» :)

Тебя обманули. Суть пайпов — это суть ООП. каждый элемент пайпа - объект. Эти объекты обмениваются сообщениями. К ФП это не имеет ни малейшего отношения. Если бы это было ФП, у тебя вычисление должно было бы не прерваться на stdout, а уйти обратно в вызывающий код, то есть, ушел со stdin — туда же и вернулся. FP не допускает прерывания вычислений. Подпрограмма (функция) обязана вернуть результат вызывающему коду.

anonymous
()

В ФП любая ф-ция обязана возвращать значение в место вызова. Значит мы не можем делать асинхронные вызовы, любой такой вызов будет побочным эффектом

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

slovazap ★★★★★
()
Ответ на: комментарий от slovazap

Вообще-то наоборот

вообще то он прав, это ты лошара. Прочитай чтоли статейку какую нибудь про фп, прежде чем кукарекать.

anonymous
()
Ответ на: комментарий от anonymous

мало ли что там Вася Пупкин пишет. Ему кажется, что это говно похоже на пайпы, пусть думает, тебе то что?

anonymous
()
Ответ на: комментарий от Debasher

С чего ты взял что я тс? Ты думаешь, кроме тса адекватных людей не существует, у которых нет лапши на ушах?

но ты в любом случае слился, щедрый урокодар. Ты не смог аргументированно отстоять свою позицию, не прояснил ни одного вопроса.

anonymous
()

Неужели пациент таки принял таблетки (правда, не те), и его теперь клинит по-другому?

anonymous
()
Ответ на: комментарий от anonymous

Мутабельные объекты не противоречат ФП, если сохраняется ссылочная прозрачность.

Это как?

Я неправильно понимаю, что такое ссылочная прозрачность или просто не могу придумать правильный контрпример? Ссылочная прозрачность, это ведь про то, что неважно передается объект по ссылке или по значению - поведение от этого не меняется.

Kuzy ★★★
()
Ответ на: комментарий от Kuzy

Ссылочная прозрачность, это ведь про то, что неважно передается объект по ссылке или по значению - поведение от этого не меняется.

Отсюда следует, что ТС прав, получается, фьючер не ложится на чистую ФП-парадигму?

anonymous
()
Ответ на: комментарий от Kuzy

Это как?

Легко, просто и непринуждённо. Например, открываем исходники пакета bytestring и слегка охреневаем от обилия мутабельности.

Если не нравятся байтстринги, посмотри исходники пакета buffer-builder. Его, кстати, используют в самом настоящем хайлоад-продакшене.

Если не нравится буфер-билдер, посмотри исходники пакета hashtables.

Если и это не нравится, то хакейдж тебе в руки, сам ищи.

Macil ★★★★★
()
Ответ на: комментарий от Macil

Ну а при чем тут реализация, если речь идет о самом ФП? Никто ведь, в здравом уме не думает, что ФП-программы выполняются физическим процессором в том виде, котором они написаны. Говорим о том слое абстракци, который касается семантики ФП.

anonymous
()
Ответ на: комментарий от Kuzy

Ссылочно-прозрачное выражение - это выражение, которое можно заменить результатом его вычисления. Передача объектов куда-либо тут ни при чем.

anonymous
()
Ответ на: комментарий от anonymous

Ссылочно-прозрачное выражение - это выражение, которое можно заменить результатом его вычисления

Ну, и как сюда засунуть муттабельный объект, так, чтобы это условие соблюдалось?

anonymous
()
Ответ на: комментарий от Macil

Легко, просто и непринуждённо. Например, открываем исходники пакета bytestring и слегка охреневаем от обилия мутабельности.

unsafe
74 matches

unsafePerformIO
5 matches

Точно читать?

Kuzy ★★★
()
Ответ на: комментарий от anonymous

Ссылочно-прозрачное выражение - это выражение, которое можно заменить результатом его вычисления

array=[1,2,3]
func=function(){return array}
func() ---> array
array.pop()
func() ---> array

Выражение func() ссылочно-прозрачное. В чем проблема?

theKingOfJava
() автор топика
Ответ на: комментарий от theKingOfJava

Ты не понял, речь о возможности трансформации твоего примера в

array=[1,2,3]
func=function(){return array}
let x = func()
x
array.pop()
x

с сохранением семантики.

anonymous
()
Ответ на: комментарий от anonymous

Ну, и как сюда засунуть муттабельный объект, так, чтобы это условие соблюдалось?

Ещё раз. Thunk в ленивом языке это мутабельный объект. Просто его изменения контролируемы: вначале он ссылка на замыкание, которое вычисляет некое значение, а когда значение вычислено — ссылка на само значение. Таким образом thunk может быть и фьючер'ом: вначале он ссылка на функцию которая вычисляет значение, затем он ссылка на wait, а в конце ссылка на значение. И никакого IO.

KblCb ★★★★★
()
Ответ на: комментарий от anonymous

Ну, и как сюда засунуть муттабельный объект, так, чтобы это условие соблюдалось?

Например как в Хаскеле, обернув все в IO.

Почему обернутый в IO объект - мутабельный?

Kuzy ★★★
()
Ответ на: комментарий от anonymous

речь о возможности трансформации твоего примера в ... с сохранением семантики.

Ну так она и сохранится.


array=[1,2,3]
func=function(){return array}
func()
array.pop()
func()

// ::: [ 1, 2, 3 ]
// ::: [ 1, 2 ]


array=[1,2,3]
func=function(){return array}
x = func()
x
array.pop()
x

// ::: [ 1, 2, 3 ]
// ::: [ 1, 2 ]

theKingOfJava
() автор топика

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

lazy_aleks
()
Ответ на: комментарий от Kuzy

ЕМНИП перезапись санка значением — часть концепции ленивого вычисления и редукции графов. Хотя я так понимаю непосредственно к лямбда исчислению оно отношения не имеет.

KblCb ★★★★★
()
Ответ на: комментарий от theKingOfJava

Слышь, недоумок, тебе говорили антипсихотические препараты принимать, а не тяжелые наркотики. Ты опять все перепутал, недоумок.

anonymous
()
Ответ на: комментарий от theKingOfJava

Тем не менее, она не нарушает ссылочной прозрачности.

KblCb ★★★★★
()
Ответ на: комментарий от theKingOfJava

Слышь, недоумок, тебе говорили антипсихотические препараты принимать, а не тяжелые наркотики. Ты опять все перепутал, недоумок.

anonymous
()
Ответ на: комментарий от anonymous

А что не так? Его просили трансформировать пример с сохранением семантики, он это сделал. Или что? Загорелось от того, что ссылочная прозрачность может быть не только в ФП? Ну так учи матчасть, это всем известно. То что тебя на ФП-пропагандисты развели как последнего лоха, это уже другой вопрос.

anonymous
()

Увлекся я тут ФП. Очень мне нравиться.

Увлекись-ка русским языком для начала.

hateyoufeel ★★★★★
()

В ФП любая ф-ция обязана возвращать значение в место вызова. Значит мы не можем делать асинхронные вызовы, любой такой вызов будет побочным эффектом.

У тебя каша в голове.

Побочные эффекты - это, всего-лишь, обратная сторона чистоты функций, никакого отношения к паралеллизму не имеющая.
С точки зрения ФП, нет никакой разницы, вызываешь ты чистую функцию синхронно с чем-либо, или асинхронно. Вот за (возможными) побочными эффектами - да, нужно бдеть.

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

В языках, где ФП прикручен в качестве костыля, уже после продумывания первоначальной архитектуры, побочные эффекты являются «сущностью первого класса» (в смысле, что они там повсюду и их не объедешь), что часто мешает правильно понять и применять ФП. В результате чего, попытка написать что-либо в стиле ФП на таком языке-франкенштейне, превращаются в пытку для себя и окружающих.

blexey ★★★★★
()
Ответ на: комментарий от theKingOfJava

Ты опять не понял. Речь не о конкретном выражении, речь о том, что в ФП этот принцип работает для _любых_ выражений. Например,

func=function(){return array}
let x = func()
let y = array.pop()
x
y
x

должно быть эквивалентно предыдущим двум примерам. «Частичная» ссылочная прозрачность есть, наверное, в любом языке.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.