LINUX.ORG.RU
ФорумTalks

Нормальные пацаны не пишут ФП

 ,


0

2

Начал вникать в модную хрень. Выбрал конечно же хаскель. Ну и, не будучи дурачком от природы, а будучи от природы авторитетным пацаном, чиста, экспертом во всех областях человеческой и нечеловеческой деятельности, решил пошерстить про него по разным форумам, докам, и другим хреням, поспрашать за него у авторитетных чиста людей, поинтересоваться, чиста, че там, как. И не пожалел.

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

Вся эта хрень идет чиста от непонимания такой фигни: функция всегда чиста как котоффские яйца. Если она оперирует муттабельными данными, она от этого грязной не становиться. Смотрите псевдокодик:

a=1
f=fun(x)x
f(a) ---> выхлоп 1
a=2
f(a) ---> выхлоп 2

Казалось бы, типа императивщина, грязь, да пацаны? Не хрена подобного. Эта хрень - кажущаяся. Это происходит, чиста от того, что вычисления у нас здеся, типо, энергичные. Помните присказку: явное лучше неявного? Сказка впереди. Что же тут реально, семантически, происходит? f принимает аргумент a и возвращает тоже a. Что взял, то и отдал. a пришло, и оно же ушло. Че из себя представляет а - это нашу функцию нии*т. Тут кажется, чиста, шо она возвращает разную хрень, потому что прогер не видит, что она реально берет и что возвращает, он видит не сам символ, а его значение, чиста. Функция соответствует определению того, что при любом одинаковом входе, она ВСЕГДА возвращает чиста одинаковый результат — a.

То шо ФП хорошо анализируется конпелятором, ето нормальных пацанов не волнует. Тут речь о том, шоб фэпешники не держали пацанов и экспертов чисто за лохов.

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

Перемещено leave из development

Это какая-то нереальная толщина.

anonymous
()

Тонко.

anonymous
()

Ты, реально, открыл мне глаза на ФП. Я серьезно.

anonymous
()

ладно с чистотой, а вот функция как перврклассная сушность тоже не нужна пацанам?

anonymous
()

Спасибо, посмеялся, хорошая попытка.

Но что ты сказать-то хотел? Твоя f - чистая, да.

yoghurt ★★★★★
()

Манфред фон Тун, перелогиньтесь.

buddhist ★★★★★
()

Спасибо, похихикал в кулак.

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

Да любая функция чистая, потому как дефолтно функция оперирует символами. Если бы не было этих неявных вычислений, которые создают иллюзию того, что «функция НЕ ВСЕГДА возвращает одинаковый выход при одинаковом входе», про чистоту бы вообще не трындели.

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

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

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

шах и мат

Да любая функция чистая

func = rand

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

Твоя f - чистая, да.

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

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

f = time()

А здесь ведь тоже, как посмотреть... Она ВСЕГДА возвращает только текущее время. Текущее время, само понятие его, неизменно, хотя оно и меняется в цифрах, означает оно всегда одно и то же. Вот если бы сегодня текущее время означало бы текущее время, а завтра - расстояние, тогда да, а так, да, в некотором смысле - это чистая ф-ция.

anonymous
()

Лор какой-то не тот: во всем Ынтерпрайзе сейчас мейнстрим это ООП,а fp - just for fun, на лоре почему-то все с точностью на оборот.

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

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

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

Я, наверное, не совсем удачный пример привел. Пусть будет пример со свободной переменной

l(x) ---> x + a
a=1
b=2
l(b) ---> выхлоп 3
a=2
l(b) ---> выхлоп 4
Эта функция чистая, потому что ей насрать, что означают а и b, она возвращает просто сумму a и b. Что означает это в данный момент/в данном контексте, ее не волнует.

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

Эта функция чистая,

Эта функция такая же чистая как и говно которое ты только что наложил.

anonymous
()

С pure-философской точки зрения - да! Неоспоримо!

Но в программировании нас интересует баланс между pure-философией и практикой. И когда pure-философия становится непрактичной, нам приходится от нее отклониться в сторону практики.

Существует баланс между выгодой и вредом применения pure-философской точки зрения. И назвать функции time(), rand() чистыми с философской точки зрения можно, но не практично. Выгоды от этого нет.

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

Угодай уже популярно, на пальцах, объяснил. Если не ферштейн, то срочно наверни матчетца. Тебя даже википедия просветит.

anonymous
()

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

Но когда мы выпускаем ее из лука, и она попадает в цель, это тоже неоспоримый факт.

Образно говоря, наша задача стрелять стрелами по цели и попадать, несмотря на эти верные рассуждения о покое стрелы. И теории наши также способствуют именно стрельбе, а не философским рассуждениям.

anonymous
()

Гы-ы-ы-ы. Ышшо один «прозревший»? Сколько же вас таких еще будет-то?

Ты сначала в кишки какого-нибудь Data.ByteString (строгой версии), а потом три пацанам про чистоту ФП вообще, и хаскеля в частности.

Для тех кто в танке: все потроха BS сотоят из unsafe-вызовов чуть более чем наполовину. В том числе и из пресловутого unsafePerformIO. BS — суть ForeignPtr, т.е. на хаскельной куче лежат только указатель на данные, и указатель на финалайзер. ЧСХ, и финалайзер, и аллокатор — высокомагические функции рантайма (написанного на самом обычном чистом C), а по сути дела — malloc и free.

Короче, засунть себе в жопу свои диванные экзерсисы и высокотеоретические построения. Они неверны, бесполезны и бессмысленны.

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

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

avtoritetniy-expert
() автор топика
Ответ на: комментарий от Macil

Они неверны, бесполезны и бессмысленны.

Они идеально верны с философской точки зрения, но вот бесполезны и бессмысленны - это точно!

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

но вот бесполезны и бессмысленны - это точно!

Печально, что ТС этого не понимает и считает себя тоже правым.

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

быдло элита ФП

Пусть они и дальше продолжают забавляться с монадами:-)

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

Эта функция чистая

Чистая функция по определению возвращает одни и те же значения при одних и тех же аргументах — твоя l возвращает разные при одном и том же b, значит она не чистая. Её можно очистить если передавать контекст явно (State monad, etc.) — b одно и то же, но контекст (окружение) разное, так что результаты разные, всё чисто, никаких проблем.

Так же можно очистить всё что угодно (ST, IO, Par, etc. monads) — все функции чистые, просто в остальных языках это не так (не возвращают там функции одно и то же при одинаковых результатах).

З.Ы.

Нормальные пацаны

http://dlang.org/function.html

http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html

http://lwn.net/Articles/285332

http://llvm.org/releases/2.2/docs/ReleaseNotes.html

http://llvm.org/releases/2.4/docs/ReleaseNotes.html

http://pimiddy.wordpress.com/2012/04/20/pure-functions-in-cc

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

можно очистить если передавать контекст явно

Ну так, при динамическом диндинге контекст передается явно:


(define inner (lambda() (+ x y)))

(define context1 (lambda()(let (x 1 y 2) (inner))))
(define context2 (lambda()(let (x 2 y 2) (inner))))

(print (context1)) ; 3
(print (context2)) ; 4

Это что чистое ФП?

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

явно

Неявно — в context1 и context2 ты же ничего не передаёшь. Но если починить дисциплину связывания, то да — вполне будет чистое при явной передаче иммутабельных mapов в качестве окружения (только не ФП, а функции в вопросе).

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

в context1 и context2 ты же ничего не передаёшь

Ну, можно сказать, что передаю. Let здесь, кажись, эквивалентно:


(define inner (lambda() (+ x y)))
(define context1 (lambda() ((lambda(x y) (inner))1 2)))
(print (context1)) ; 3

Но можно и явно передавать, в принципе.

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

Я про

(inner)

(context1)

прилетают они туда исключительно за ширмой по dynamic scoping. Scheme, CL (не считая специальных переменных) и все остальные нормальные языки используют лексическую область видимости, так что вообще не вижу смысла обсуждать заведомо сломанное поведение.

А так классический пример:

f >- g = uncurry g . f
ret = (,)
put x _ = ((), x)
get x = (x, x)
lift f x y = x >- \a -> y >- (ret . f a)

t =
  put 1                                 >- \_ ->
  let l x = lift (+) get (ret x)        in
  l 1                                   >- \r1 ->
  put 2                                 >- \_ ->
  l 1                                   >- \r2 ->
  ret (r1, r2)

-- > t 0
-- ((2,3),2)
quasimoto ★★★★
()
Последнее исправление: quasimoto (всего исправлений: 2)

К параше пройди, фраер приблатненный, пока всей хатой твою морду под шконарь не опустили, мурло ушастое.

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

Недолго мучилась старушка. У фраерка то пукан с гипертонией.

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

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

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

Лор какой-то не тот: во всем Ынтерпрайзе сейчас мейнстрим это ООП,а fp - just for fun, на лоре почему-то все с точностью на оборот.

А что тебя удивляет? Ведь ЛОР не является сообществом профессиональных разработчиков, да и никогда им не был. Профессионалы (то есть те, кто владеет технологиями на высоком уровне и зарабатывает на жизнь разработкой ПО) здесь в подавляющем меньшинстве и, я бы сказал, на птичьих правах. Абсолютное большинство — это тролли, диванные теоретики, доморощенные гуру, форумные трепачи, лисперы, хаскелисты и прочие ёбнутые на голову адепты маргинальщины, фрики, школьники, хипсторы, петросяны, IT-эзотерики, IT-шарлатаны, IT-небыдло и так далее. Здесь в воздухе густо пахнет мамкиным борщом и нонконформизмом. Здесь модно поливать говном все практические, промышленные технологии и подходы (к которым, несомненно, относится и ООП).

ЛОР маргинален, поэтому и мейнстримом здесь является маргинальщина (Haskell, LISP и т.п.) Поэтому IMHO все закономерно.

anonymous
()

будучи от природы авторитетным пацаном, чиста, экспертом во всех областях человеческой и нечеловеческой деятельности

Можно подробнее о нечеловеческой деятельности?

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