LINUX.ORG.RU

Чистые функции

 ,


1

4

Долго не мог понять, каую же магию таят в себе чистые функции, и вот наконец проблеск:

(and state1 state2 (change-state)
; этот код может изменить состояние
; мы можем написать этот код в более привычно-костыльной форме:
(if (and state1 state2) (change-state))
; суть от этого не меняется
; этот код основывается на сайд-эффектах и сам создает его
; оформим его в виде функции
(define code (lambda() (and state1 state2 (change-state))))
; теперь мы можем менять состояние делая вызов функции - мы добились просто более краткой записи кода, но пока у нас нет никакой абстракции.
; ту же функцию мы могли бы записать так:
(define code (lambda() (and (get-state1) (get-state2) (change-state))))
; это ничего не меняет, ненужное усложненние
; eсли в нашем приложении имеют значение только эти 3 состояния, то такой код нас устроит во всех отношениях
; однако если у нас есть разные программные объекты которые пользуются тем же принципом, "если это и это тогда это", мы должны обобщить это в виде функции:
(define sup-code (lambda(x y) (and (get-state x) (get-state y) (change-state))))
; данная абстракция не использует напрямую сайд-эффекты, но все еще сама является источником его, исправим это
(define sup-code (lambda(x y z state) (and (get-state x) (get-state y) (z state))))
; мы получили абстракцию которая сама может быть объектом манипуляций, и до тех пор пока она является объектом манипуляций, она не вызовет сайд-эффектов. Если же она будет вызвана, посредством своих аргументов, она создаст сайд-эффекты. Иными словами мы получили СЛОЙ АБСТРАКЦИИ!!!
Таким образом, это банальная абстракция, в некотором смысле, инкапсуляция. Идея вполне себе простая и естественная, в плане расширяемости и преодоления сложности. Собственно вопрос в том, нахрена делать из этого культ, и городить какие-то типы, особенные языки и представлять это как науку посвященных (я имею в виду, что в литературе «постижение» обычно начинается с матанов). Или я неправильно понимаю идею чистоты функций?



Последнее исправление: cetjs2 (всего исправлений: 1)

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

Чтобы сайд-эффекты были синтаксической ошибкой.

ilammy ★★★
()

Я сам не особо разбираюсь в этом (мне CL хватает, который не ФП, но с элементами его). Но сразу так можно сказать - out of order execution. А где там ТС инкапсуляцию усмотрел - это я затрудняюсь сказать

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

Да но ведь можно на в том же языке сделать наколеночный тайпчекер «от задачи», и тогда бы не пришлось болоться со сложностями «специального языка», было бы проще контролировать типы, которые нужны в данном случае, а не те, что дядя приказал

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

out of order execution

Хотя они об этом твердят, но я не видел, конечно ничего такого прям «искаропки». То ли оно там настолько прозрачно, то ли это просто заманиловка

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

инкапсуляцию усмотрел

Инкапсуляция в самом общем смысле - сокрытие данных от низлежащего слоя абстракции, в этом смысле.

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

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

Очень интересно послушать про типы

shamaz
()

всю жизнь писал на ассемблере и не мог понять, нафига эти ваши while, if, switch и for. и тут понял: это же все просто абстракция над jmp, j[n]? и cmp. Собственно вопрос в том, нахрена делать из этого культ, и городить какие-то типы, особенные языки и представлять это как науку посвященных?

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

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

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

Проблема в том что это не шутка. while, if, switch и for сбивают прогеров с толку, приходит время, и они вообще утрачивают эту связь, и восстанавливается она через жопу, и только иногда.

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

Это простейшая мысль, проще не скажешь

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

Посмотри erlang.

To be serial-safe we need to control side effects. As a solution, first we invented stuctured programming, then object oriented programming. Each time the goal was to isolate state and variables to reduce side-effects. In the same tradition, side effects are more restricted in Erlang. If a function has no state then it will behave the same way every time. If a function has no side effects, then it cannot cause other functions to break.

A pure function is a function that returns the same value given the same arguments regardless of the context of the call of the function.

© викибуксы, первое нагугленное.

x3al ★★★★★
()

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

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

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

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

Причина — запрет на изменение переменных вообще.

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

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

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

Все правельно. Помому что когда запрещается делать то, что делается на каждом шагу, все остальное начинает выглядеть немного по-другому.

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

Я считаю, что данный подход привнес кучу лишней сложности и породил собой поколение «посанов», которые «пишут чиста фапе»

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

Толсто, но у меня никогда даже так не получается

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

Я считаю, что посаны которые «пишут чиста ооп» привнесли сложности столько, сколько посаны «пишут чиста фапе» никогда не принесут.

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

ООП упрощает, а не усложняет. Вот ФП... заставляет смотреть на мир и моделирование через задницу.

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

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

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

Меня успокаивает лишь одно, что тебе, мудило, этого вообще не дано.

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

ООП упрощает, а не усложняет. Вот ФП... заставляет смотреть на мир и моделирование через задницу.

Есть данные, есть их функции, через какую задницу?

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

Старенького вполне достаточно для ответа на твой вопрос.

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

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

Нет. Я пока не видел ни одного императивного языка (за исключением, может быть, D), компилятор которого гарантировал бы отсутствие побочных эффектов у функции.

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

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

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

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

Как ты интересно собственную глупость и безграмотность называешь умом)

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

Ох, видишь ли, деточка, слова «какой я умный, что не стал это учить» - удел школоты.

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

Waterlaz ★★★★★
()
(and state1 state2 (change-state)
; этот код может изменить состояние
; мы можем написать этот код в более привычно-костыльной форме:
(if (and state1 state2) (change-state))
; суть от этого не меняется
; этот код основывается на сайд-эффектах и сам создает его
; оформим его в виде функции

Посколько это одно и то же, то написал ты это лишь для сомнительного выпендрежа. Да, мы все увидели, что 2+2=4, спасибо. Смысла в этом ноль.

Waterlaz ★★★★★
()
Последнее исправление: Waterlaz (всего исправлений: 1)

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

Так, как ты написал, никто не пишет. Не понятно, что от чего ты решил абстрагировать.

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

Типы тут ортогональны чистоте. На схеме вполне можно писать в функциональном стиле и емнип даже поощряют так писать.

я имею в виду, что в литературе «постижение» обычно начинается с матанов

Матан матаном, а есть же множество литературы, не затрагивающей матан вовсе.

«one must not criticise mathematicians for what they do, they are not slaves to physicists» Р. Фейнман

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

Вы задолбали, какое отношение имеет современная математика и «матан», к этим вашим типам? Вообще опосредствованное, если вообще имеет.

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

Во-первых, имеет (матан не имеет, но это такое).

Во-вторых, я о том и говорю, что нет надобности учить теоркат для изучения haskell

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

Ему бесполезно что-либо объяснять; ты видимо не застал последнюю серию, где он смог не понять индукцию.

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

Ты очередной дурачок, который не осилил основной посыл того топика, а скатился на частности, которые не имеют никакого отношения к теме. Мат индукция по определению матдрочеров - это дедукция, да они так считают, но мне плевать что они считают и почему, также как и на твое мнение. Однако замечу, что среди такого говна, как ты, все же нашлись ЛЮДИ, которые поняли основную мысль и не скатились до срача по индукци, хотя и не согласились со столь резкой постановкой вопроса.
А на матиндукцию мне срать, как и на тебя.

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

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

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

Не понятно, что от чего ты решил абстрагировать.

Ну как же, если написать (function-that-may-contain-side-effects) то это не сайд-эффект!

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

Я че-то не совсем понял. Это ирония что ли была?

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

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

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

Тебя мой маленький, ограничили от этого may-contain на уровне твоего интерфейса. А я сначала подумал было, что ты что-то понял.

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

Надо писать понимая что ты пишешь, а не волшебными словами. Асм тоже, кстати, сахар, в определенной степени. Дело тут не в том, на чем писать, а в том, чтобы понимать, что реально происходит. Я как-раз стремлюсь этому научиться, а вся эта хрень сбивает с толку. И порождает быдлокодерство причем с ЧСВ, понтами и шлюхами.

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

Не, лол, я прекрасно понимаю, что

(define (add a b)
  (+ a b))
и
(define (add a b)
  (let ((t a))
    (let loop ()
      (if (= b 0) t
          (begin
            (set! t (+ t 1))
            (set! b (- b 1))
            (loop))))))
это чистые функции. И внешним сущностям по барабану, там есть побочные эффекты внутри или нет. Компьютеры, на которых реализуются функционально чистые хаскели, работают на побочных эффектах.

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

Программам легче запомнить кучу особенностей процессоров, так что они вероятно лучше знают, когда там что менять. И чистые функциональные языки это такой договор: «Я не буду мешать, окей? а ты оптимизируй хорошо. Пожалуйста. Ну пожалуйста! Я даже утыкаю код {-# СОТНЕЙ ДИРЕКТИВ -#} и начну объявлять типы в динамически типизированных языках!

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

Ты путаешь «концепцию» и ее реализацию.

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