LINUX.ORG.RU

Концептуальная дыра ФП.

 , , ,


1

2

«Изменяясь, оно остается неподвижным»

Гераклит.

На протяжении нескольких месяцев уже я пытаюсь понять ФП. И пока у меня 2 варианта. Либо я идиот, либо ФП имеет огромную концептуальную трещину в самом основании.

Древние говорили, что нельзя дважды войти в одну и ту же реку. Это значит, что река - это всегда река. Река постоянно меняется, но она остается все той же рекой, и о ней можно говорить как о реке. Что мы имеем в ФП:

(define river-state 1)
(define fu (let ((the-river-state river-state)) (lambda() the-river-state)))
(write (fu))
(define river-state 2)
(write (fu))
(define river-state 3)
(write (fu))
;111
Благодаря лексической области, мы не можем рассуждать о реке как просто о реке, мы (и вызывающий код) вынуждены говорить только о той реке, которая была и которая зафиксирована. У нас здесь вообще нет реки в обычном понимании. Здесь нет абстракции.

Дело тут даже не во времени. Мы вообще лишены возможности рассуждать о вещах в общем смысле. ФП снижает абстракцию. Абстргирование стремиться к нулю. Только ради компиляции мы вынуждены мириться с тем, что наш язык не дает нам возможности расуждать о вещах наиболее естественным путем.

PS Как выяснилось, многие не поняли о чем я говорю. Я говорю здесь о фиксации состояния внутри ф-ции. То что код примера императивен я в курсе, это было сделано преднамеренно, для демонстрации идеи. Не надо капитанствовать по этому поводу.



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

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

Угадал автора по названию топика.

вот если-бы ты НЕ угадал...

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

Мы могли бы называть реку рекой в обычном смысле. Программа САМА подставляла бы текущее состояние реки, нам не нужно было бы думать о состоянии.

ну тогда и не меняй состояние так, как это делаешь ты. Это же не Pure C.

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

Как написать это в ФП стиле?

никак. И ты сам объяснил — почему.

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

Там создается замыкание. На этом основана вся дрочка ФП. Нет замыканий - нет ФП.

прочитай ещё раз внимательно SICP про замыкания.

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

ну тогда и не меняй состояние так, как это делаешь ты

Что значит не меняй. С точки зрения функции, в императивном коде как вот тут

Концептуальная дыра ФП. (комментарий)

река (само понятие) не меняется, несмотря на то что состояние ее меняется. Нам нужна абстракция реки, а не река, которая была в прошлом, в момент создания ф-ции.

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

прочитай ещё раз внимательно SICP про замыкания.

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

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

ФП - замыкания служат для создания иммутабельных скопов ф-ций

Чего? Замыкания служат собственным определением?

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

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

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

Определение общепринятое, можешь подглядеть в википедии.

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

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

можешь подглядеть в википедии.

поглядел, и что?

функция, в теле которой присутствуют ссылки на переменные, объявленные вне тела этой функции и не в качестве её параметров (а в окружающем коде). Говоря другим языком, замыкание — функция, которая ссылается на свободные переменные в своём контексте.

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

Нам нужна абстракция реки, а не река, которая была в прошлом, в момент создания ф-ции.

Если тебе нужна река - то обращайся к реке. Зачем ты тогда обращаешься к прошлому состоянию?

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

река (само понятие) не меняется, несмотря на то что состояние ее меняется. Нам нужна абстракция реки, а не река, которая была в прошлом, в момент создания ф-ции.

в ФП нет «прошлого» и «будущего». Это не баг, а фича. Ещё читай SICP, и ты всё поймёшь.

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

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

и тебе тоже в SICP.

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

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

Вообще поразительно, конечно, - настолько при полном отсутствии какого либо понимания включить менторский тон и засирать топик своими неадекватными «разоблачениями». А потом, когда мокнули, резко перескочить на другую тему. Хоть ссы в глаза.

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

функция, в теле которой присутствуют ссылки на переменные, объявленные вне тела этой функции и не в качестве её параметров (а в окружающем коде)

только это НЕ ФП

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

Если тебе нужна река - то обращайся к реке. Зачем ты тогда обращаешься к прошлому состоянию?

Покажи мне, как я не отступая от парадигмы чистого ФП могу это сделать.

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

Я не профессионал, и не обязан использовать то, что дядя хочет

Не хочешь - не используй. В мире программирования много разных инструментов.

Сразу учить ЯП - это все равно, что сразу нступить в говно, а потом думать правильно ли ты сделал что наступил туда

Только в отличии от говна, опыт «наступания» в язык, который тебе не нравится не несет в себе ничего отрицательного, а наоборот, расширяет кругозор. Мне вот, например, на perl неудобно писать, но я не кричу, что перл говно. Я просто на нем не пишу и не жалею потраченного на изучение perl времени. Оно было полезно.

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

Смотри, единички:

(let ((a 1))
  (let ((b a))
    (format t "~s " b)
    (let ((a 2))
      (format t "~s~%" b))))

(defparameter *a* 1)
(defparameter *b* *a*)
(format t "~s " *b*)
(defparameter *a* 2)
(format t "~s~%" *b*)

(let ((a 1))
  (flet ((b () a))
    (format t "~s " (b))
    (let ((a 2))
      (format t "~s~%" (b)))))

первые два — затенение имён в скопах, никакой связи между ними нет, третий — тоже затенение, но есть замыкание со ссылкой, есть связь, (тут роли не играет).

Вообще лямбда это всё равно что ленивое значение — при вызове оно будет смотреть в «a» и находить там новые значения, хотя просто затенение новым let-ом создаёт новый скоп и на старый «a» мы не воздействуем.

Теперь 1-ца и 2-ка на выходе:

(let ((a 1))
  (flet ((b () a))
    (format t "~s " (b))
    (setf a 2)
    (let ((a 2))
      (format t "~s~%" (b)))))

(defparameter *a* 1)
(defun b () *a*)
(format t "~s " (b))
(defparameter *a* 2)
(format t "~s~%" (b))

первый — тут мы воздействуем на старый «a» присваиванием, что проявляется при вызове лямбды/функции/замыкания b, которая ссылается на эту «a», второе — узаконенный способ делать такое через специальные переменные, плюс для них создание скопа не происходит, производится изменение старой «реки»:

(defparameter *a* 1)

(let ((*a* 0))
  (format t "~s " *a*)
  (let ((*a* 1))
    (format t "~s~%" *a*)))

пишет 0 и 1.

http://www.gigamonkeys.com/book/variables.html

Я говорю о стиле фп, о подходе к решению задач, а не о конкретном ЯП.

Ты говоришь о лисповых заморочках с именами/символами (которые мутабельные ссылки) и разными областями видимости.

Возьми C++, Scala или Haskell и попробуй там поискать таких проблем (вот в хаскеле вообще без вариантов — единственный способ вызова, всё неявное явное — эффекты, ссылки и т.п.).

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

Что ты написал? Этот код ничем не отличается.

(define fu (lambda() the-river-state))
Только буков больше. Какое это нахрен чистое ФП.

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

И тот который ниже то же. И что? Ты вставил лишний ненужный слой и тем самым изменил императив на фп?

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

Мне надоело, такое ощущение что ты первоклассник. Там нет ни муттабельности не иммутабельности. Это ортагональные вещи.

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

это слишком просто - ТС'а можно узнать только по одной точке в заголовке:)

ага,

-я угадаю ТС с семи букв

-а я угадаю ТС с трех букв

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

Нет, я просто показал тебе, как обратиться к реке, а не к состоянию реки. Ты же этого хотел?

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

Ты же этого хотел?

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

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

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

Дыра — она в голове. Не путать с ошибкой, которая в днк.

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

Я просил тебя показать, как решить это в рамках чистого ФП.

Я решил это в рамках чистого ФП. Если хочешь обращаться к состоянию реки - обращаешься к состоянию реки. Хочешь обращаться к реке - обращаешься к реке. Способы обращения и к тому и к другому тебе известны. В чем проблема?

anonymous
()

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

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

А теперь уходи.

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

Я решил это в рамках чистого ФП

Нет. В рамках чистого ФП ты не имеешь права обращаться к изменяемым переменным. Если ты не имеешь возможности изменятять rever-state твой код не имеет никакого смысла.

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

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

это не важно. Замыканий в смысле вики/анона быть не должно. Это костыль. Не нужный костыль.

Что ты сказать-то хотел?

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

Покажи мне, как я не отступая от парадигмы чистого ФП могу это сделать.

покажи мне, как в целых числах делить на ноль.

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

Я изначально как раз и говорил о том, что ФП - это кастрированный императив. То, что можно сделать в ФП всегда можно решить императивно. Но не наоборот.

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

То, что можно сделать в ФП всегда можно решить императивно. Но не наоборот.

А можно пример? Что императивное не делается на ФП?

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

Я изначально как раз и говорил о том, что ФП - это кастрированный императив. То, что можно сделать в ФП всегда можно решить императивно. Но не наоборот.

ну ВНЕЗАПНО: ты прав. Всякие гонки и TIME PARADOX в принципе невозможны в ФП. Как и всякий говнокод вроде x-- - --x;.

Вот как раз по этой причине ФП ещё окончательно не издох — некоторые сложные вещи на нём реализуются проще.

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

Да ты чо спишь штолэ? Река - это и есть пример. По большому счету, в рамках чистого ФП вообще не решается ни одна реальная задача. Там у них есть «грязные» штучки, которые принято не замечать. Как если бы у тебя лежал кусок говна посреди квартиры, и ты бы на нем написал «dirty shit IO», твоя квартира осталась бы чистой, несмотря на гавно, потому что на говне наклеена соответствующяя табличка. Просто по-ночам, тайно, ты будешь его нюхать, ведь тебе это нужно. Но об этом никто не знает.

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

То ли дело у императивщиков — говно размазано тонким слоем по всей квартире и на нём постоянно поскальзываешься.

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

Да ты чо спишь штолэ? Река - это и есть пример.

Пример чего? Что должна делать программа и чего нельзя сделать в фп?

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

Он в своей долбанутой манере пытался сформулировать, что в ФП не самым очевидным образом реализуется IO.

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