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)
Ответ на: комментарий от jerk-of-all-trades

опиши требуемое русским языком с учетом всех значимых деталей.

Значимая деталь тут одна. Я смотрю на небо. Оно всегда разное. Я хочу чтобы мои функциональные объекты могли возвращать небо в общем смысле, а вызывающий код получал текущее состояние неба. Когда я говорю Вам «посмотри на небо», я говорю просто о небе, а когда вы смотрите на небо, Вы видите текущее состояние неба. В фп, когда мы спрашиваем функцию о небе, она нам говорит о состояние неба, которое было на момент ее создания, она говорит о конкретном небе, которое было в прошлом, а не о небе вообще, и не о текущем ее состоянии.

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

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

Вот так будет правильно. Но ФП тут ни при чем.

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

То есть тебе нужно:

(define fu (lambda() (get-current-sky-state-via-dirty-io my-eyes)))
Зачем же писать что-то иное?

jerk-of-all-trades
()
Ответ на: комментарий от jerk-of-all-trades

Зачем же писать что-то иное?

Фактически, просто императивный код решает эту задачу как нельзя лучше и естественней.


(define river-state 1)
(define fu (lambda() river-state ))
(write (fu))
(define river-state 2)
(write (fu))
(define river-state 3)
(write (fu))
;123

Это очень простая и естественная абстракция, которая получается «сама-собой». Получается: за что боролись на то и напоролись.

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

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

императивный код решает эту задачу

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

jerk-of-all-trades
()
Ответ на: комментарий от jerk-of-all-trades

Я говорю о том, что здесь river-state - это как раз и есть абстракция реки, это река в общем смысле. Конкретное состояние реки получается само-сабой, как в жизни. Как если бы мы спросили : как погода, а нам ответили - дождливо. Чтобы выражать это, не нужно никаких ФП костылей, это очень просто. А зачем нужно ФП вообще, если не говорить в контексте оптимизаций? Покажите код, где построение абстракций на ФП лаконичней и выразительней.

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

здесь river-state - это как раз и есть абстракция реки, это река в общем смысле

Но это утверждение ошибочно. Это не абстракция реки, это абстракция бумажки с описанием реки. Осиль уже операционную семантику.

jerk-of-all-trades
()
Ответ на: комментарий от anonimous

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

А что, с твоей точки зрения, сделает код в ООП стиле? Думаешь будет разница?

Norgat ★★★★★
()
Последнее исправление: Norgat (всего исправлений: 1)
Ответ на: комментарий от jerk-of-all-trades

запомни это состояние

C чего вы взяли? При любом изменении состояния реки ф-ция будет возвращать текущее состояние реки. Концептуально эта ф-ция ничего не запоминает. Она знает, что ее просят вернуть просто реку, но состоние реки динамически меняется, и ей не надо «думать» о состонии, вычислять его, она просто возвращает «реку», а состояние уже записано в пер-нной.

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

А что, с твоей точки зрения, сделает код в ООП стиле?

Смотря какое. Клдассовое ооп, в целом, действует также как ФП, я думаю. Прототипное же ООП, динамично по своей природе. Хотя, там уже на уровне реализации свои хаки, но в целом, как-то так, я думаю. Класс-ООП - это лексические замыкания.

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

C чего вы взяли?

Вот с этого:

(define river-state 1)

При любом изменении состояния реки ф-ция будет возвращать текущее состояние реки

Нет же. Функция не будет смотреть на реку в этом коде. Функция будем смотреть на бумажку, где записан river-state.

jerk-of-all-trades
()
Ответ на: комментарий от jerk-of-all-trades

Функция будем смотреть на бумажку, где записан river-state.

Ну и что? Это не важно, детали реализации. Главное, что код воплощает идею рассуждений о реке, как просто о реке. а не той реке, которая была.

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

Класс-ООП - это лексические замыкания.

Правильно рассуждаешь.

Прототипное же ООП, динамично по своей природе.

А вот тут ошибка. Почему? Подумай о однопоточности исполнения команд процессором и проблемах многопоточности. Собака там зарыта. Для лучшего понимания смотри Erlang, а не haskell & co.

P.S. А ещё стоит подумать о том, что всё, что ты видишь и чувствуешь отражает лишь прошлое состояние систем.

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

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

Если требуется рассуждать о реке, надо требовать от кода обращаться к реке. В данном примере этого не сделано.

jerk-of-all-trades
()
Ответ на: комментарий от Norgat

Спасибо огромное за наводки, Вы наверное, единственный, кто понял о чем я говорю:).

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

могли возвращать небо в общем смысле

передовай через «имена» которые некоторые укурки монадами обозвали.

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

передовай через «имена» которые некоторые укурки монадами обозвали.

Я не спорю, но это все усложнет на порядок, однако.:)

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

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

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

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