LINUX.ORG.RU

Есть ли в ФП черный ящик?

 


1

2

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

Допустим, у нас есть функция, внутри которой содержится цикл. Если она даже ничего не меняет вовне, с точки зрения ФП такая реализация недопустима. А это значит, что вместо абстрагирования от внутреннего устройства, мы на нем наоборот фокусируемся. Отсюда можно сделать вывод, что в функциональном программировании определенно есть проблемы с барьерами абстракции. Что вы думаете по этому поводу, господа?



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

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

f1u77y ★★★★
()

у нас есть функция, внутри которой содержится цикл. Если она даже ничего не меняет из-вне, с точки зрения ФП такая реализация недопустима.

С чего бы? Ну и дальше по тексту всё под тем же вопросом

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

С чего бы?

с того что фанатичные адепты считают это плохим тоном.

f1u77y ★★★★
()

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

А как же хвостовая рекурсия?

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

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

f1u77y ★★★★
()

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

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

Это относится к внутренним вопросам оптимизации, на семантику это не влияет.

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

Круг-то когда будет? Хотя бы чёрный для начала.

hateyoufeel ★★★★★
()

Шизофреник, не забывай принимать таблетки.

anonymous
()

Астрологи объявили неделю anonimousа.

fmdw
()

Если она даже ничего не меняет вовне, с точки зрения ФП такая реализация недопустима.

Где ты это выкопал? Для чистого ФП пофиг, чего там происходит внутри функции, если сама функция чистая.

циклы в строгом ФП запрещены.

Кто тебе сказал?

ovk48 ★★★
()

Нельзя просто так взять и не объяснить анонимусу какой он дебил.

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

В LLVM IR тоже, к примеру, нет деструктивного приваиваиния для скаляров. Однако ж в него эта ваша сишка транслируется (см. clang), и из неё при этом циклы почему-то не изчезают. Как же объяснить этот чудесный феномен?

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

По определению. Циклы выходят за рамки подстановочной модели. Ты, оказывается, и не знаешь даже толком «учение» в которое веруешь. В ФП вместо циклов используется рекурсия.

fuckYankee
() автор топика
Ответ на: комментарий от fuckYankee
import Control.Monad
import Control.Monad.Trans.Writer

copies :: Int -> a -> [a]
copies i x = snd $ runWriter $ forM_ [1..i] $ \_ -> tell [x]
*Main Control.Monad.Trans.Writer> 10 `copies` "LOL"
["LOL","LOL","LOL","LOL","LOL","LOL","LOL","LOL","LOL","LOL"]

Тут всё - и чистая функция без _внешних_ эффектов, и цикл с состоянием внутри.

В любом случае, циклы в строгом ФП запрещены.

Кто запретил-то, кто посмел? Цикл - это всего лишь итеративный процесс, который легко порождается хвостовой рекурсией.

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

Цикл - это всего лишь итеративный процесс, который легко порождается хвостовой рекурсией.

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

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

Ну предложи, я с кашей в твоей голове разговаривать желания н имею.

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

Если она даже ничего не меняет вовне, с точки зрения ФП такая реализация недопустима.

С чего это вдруг? Можно говорить какие угодно глупости, от этого объективная реальность не поменяется.

Уже до ФП добрался?

Нужно понять одну простую вещь: правильное ФП это когда циклов нет вообще, а сама программа один большой цикл. Ага. Локальные fold, foreach не в счёт разумеется.

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

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

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

Ну и, да, если скатываться в подобный уровень, «чистого ФП», о котором ты тут говоришь, не существует в принципе - ячейки памяти же модифицируются, регистры там, ололо!

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

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

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

Да и регистров нет никаких, там только транзисторы и электросигналы.

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

Кстати, в SML есть кое-что для этого. Сигнатура - описание набора типов и функций для работы с ними, структура - этот самый набор. Строгое приписывание структуры к сигнатуре (оператором :>) приводит к тому, что все типы, объявленные в сигнатуре, скрываются и могут быть созданы и модифицированы только средствами структуры. Если не ошибаюсь.

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

В любом случае, циклы в строгом ФП запрещены.

Уже стотыщщпиццот раз объясняли. Ну не являются реализации типа Хаскеля/GHC, а уж тем более ML/SML/Ocaml/F# (ненужное зачеркнуть) ФП в строгом смысле. Не яв-ля-ют-ся!

Возьми любой пакет хаскеля, особенно ориентированный на массовое IO, копни чуть поглубже, и что же ты там увидишь? Правильно... Грязные Хаки. Тысячи их. Чем дальше «в глубь» — тем эпичнее и эпичнее, вплоть до языкового рантайма GHC, написанного на C.

Любая реализация (чего угодно) живёт в реальном мире. А в текущей реальности даже просто чтобы файл открыть нужно просить об этом ОС. Давным-давно счастливые времена int13 канули в Лету...

А ты про какие-то «циклы». Не смешно. Любой язык, прежде всего, должен предоставлять сервисы для взаимодействия с ОС. Начиная от примитивов языкового рантайма, заканчивая стандартной библиотекой.

Самое главное, *ты-то* что сказать хотел? Что конкретная реализация к которой по недоразумению прилепился дебильнейший термин ФП не является ФП? Ну, дык, а) это высказывание противоречит само себе; б) мы и так об этом знаем.

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

Любая реализация

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

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

Не спится, малышка? Одна сегодня осталась? :D

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

Я вопросы реализации не хотел бы тут затрагивать вообще.

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

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

Я имел в виду тему реализации языка.

А тогда — зачем вообще? Зачем поднимать тему, не имеющую никакого смысла вообще: обсуждать «сферическое ФП в вакууме» в вакууме? В любой теме должна быть хоть капля диалектики, здесь же вообще нихрена нет.

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

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

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

В ФП подходе содержится парадокс

Всё хорошо, только нет никакого ФП-подхода, а следовательно, и парадоксов.

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

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

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

Это похоже на то

Даже близко не похоже. Нож — реально существует. ФП — не существует. Я ещё раз повторяю: термин ФП приклеился к реализациям некоторых языков по недоразумению.

Macil ★★★★★
()

Если она даже ничего не меняет вовне, с точки зрения ФП такая реализация недопустима. А это значит, что вместо абстрагирования от внутреннего устройства, мы на нем наоборот фокусируемся.

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

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

В ФП подходе содержится парадокс.

Это только в абстрактном чистом ФП. А на практике достаточно иммутабельности по умолчанию и строгой типизации, вот и все ФП.

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

Наконец-то забанили!

Как будто это в первый раз и как будто это поможет =)

Waterlaz ★★★★★
()

Что вы думаете по этому поводу, господа?

Что тебе надо закусывать.

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