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

(define river-state 1)
...
(define river-state 2)

Ты действительно думаешь, что это ФП?

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

anonymous ()

И пока у меня 2 варианта.

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

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

Так он видимо наоборот говорит о том, что состояние не меняется...

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

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

anonimous ()

В общем пока время на редактирование топика не истекло, сформулируй вопрос нормально. А то какая-то херня про реки.

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

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

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

Ты вообще о чём? У тебя императивный код.

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

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

Сам же привёл цитату

нельзя дважды войти в одну и ту же реку.

Так вот в фп можно сказать именно такое поведение - то, что ты привык называть рекой (т.е. то, во что можно войти дважды) на самом деле лишь последовательность моментальных рек во времени.

anonymous ()

Лишп мультипарадигменный. Здесь у тебя императивный ДСЛ на лишпе. Лишп даже не функциональный, тащем-та. Он совершенно самобытный. Это метаязык, который позволяет клепать дсл под любую парадигму.

А ты просто, гм, совершенно не гасконец.

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

на самом деле лишь последовательность

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

anonimous ()

Аа, посмотрел на ник и стало все понятно.

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

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

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

anonimous ()

Ты уже обнаглел

Вот нахера люди, подписанные на теги «scheme» или «haskel» вынуждены читать твой бред? Не слишком ли много внимания ты к себе требуешь?

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

Ты бы почитал его откровения про СТО или даже про законы Ньютона. Там похлеще рек будет

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

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

(defun river ...

нутыпонел

anonymous ()
Ответ на: комментарий от 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 ()

Концептуальная дыра у тебя в голове.

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

Мы не можем естественным образом, рассуждать о реке как о реке в обычном смысле.

«обычный смысл» в твоем понимании совсем не обычен.

Вышел 2-й выпуск журнала «Практика функционального программирования» (комментарий)

r ★★★★★ ()
Последнее исправление: r (всего исправлений: 1)
Ответ на: комментарий от 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 ()
Ответ на: комментарий от yoghurt

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

Да, а если бы форум скрывал ник автора, на такие темы можно было бы делать ставки.

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

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

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

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

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

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

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

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

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

jerk-of-all-trades ()

Хватит засирать мне уведомления, клоун. Сделай себе отдельный тэг для своего бложика.

Deleted ()

ну длин почИтай классиков.

фп регулярно.

ты же считаеш прозрачность по ссылкам не важным и приплетаеш что то про снижение абстракции.

как раз таки прозрачностью по ссылкам конечно ограничивают себя - зато в этой(прозрачной по ссылкам) области абстрактный алгоритм ведёт себя только использую настолько малое число аксиом , что алгоритм оказывается универсальным .

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

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

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

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

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

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

Между прочим, я удивляюсь, что Вы кагбэ отмолчались в этом топипке, ведь речь идет об идеях смолтока, в частности. Боитесь навлечь на свою карму гнев ФП сектантов?:)

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

Я, если честно, так и не понял, что ты там хотел сказать со своей рекой на лиспе, при чём тут ФП и особенно Смолток.

Что ты подразумеваешь под вхождением в реку дваджы в этом случае?

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