|
2 / 2 / 0
Регистрация: 11.12.2013
Сообщений: 58
|
||||||||||||||||
Монады, чистые/грязные функции06.09.2015, 18:36. Показов 5009. Ответов 24
Метки нет (Все метки)
я только начал разбираться в этих вещах и не совсем понимаю как мне реализовать те функции которые так легко реализуются в императивных языках
как я понял если я считываю что-то из файла, и возвращаю это из функции то получу String обернутый в IO, ковыряясь в гугле, вычитал, что от IO избавиться вообще никак нельзя. А что если мне просто надо считать из файла допустим список слов? Я пытался делать вот так:
Здесь вместо точек я поначалу писал return t но потом, почитав различных статей, понял что return оборачивает все в монаду... Так каким же образом мне просто получить из файла список строк (просто вернуть из функции [String], ну или более грубо: как считать из файла список строк, так чтобы с ним можно было работать как с обычным списком а не как с какой то монадой (вообще мне нужно считать словарь из файла, а потом с ним работать))?
0
|
||||||||||||||||
| 06.09.2015, 18:36 | |
|
Ответы с готовыми решениями:
24
Чистые функции – теория Монады Палиндромы и монады |
|
64 / 49 / 1
Регистрация: 25.06.2015
Сообщений: 80
|
|
| 11.04.2018, 14:48 | |
|
Теперь понятно, почему вы так фиксируете себя на чистоте. Нет, в haskell иначе.
Представим, что вы написали монадический трансформер. По вашему определению он будет чистым. Теперь параметризуем его монадой IO. И что получается? Чистый трансформер внезапно превращается в грязный?! В haskell почти все функции чистые. Нет, даже не так. Почти все функции ссылочно-прозрачные. А ссылочная прозрачность является достаточным условием для чистоты. Если по простому, то ссылочная прозрачность позволяет вставлять тело функции где угодно и когда угодно его вычислять. Чистота же значит, что вывод функции зависит только от входных параметров. Если функция не является ссылочно-прозрачной, то мы обязаны добавить прагму NOINLINE. Вот берем некий побочный эффект. Пусть это будет значение IO (). По факту это только некоторая функция, скрытая за фасадом вычисления IO. Она вполне может зависеть только от входных параметров. И это так. Все чисто. Побочный эффект появляется при применении этой функции во время вычисления main. Но в haskell часто говорят о некотором значении с типом Double как о чистом значении. IO Double - это уже вычисление вещественного числа. Оно как бы чистым не называется, но это уже другая трактовка многозначного термина чистоты. При программировании лучше избегать сложных вложенных типов. Лучше определить Double, чем IO Double, но это не всегда возможно. Вот, собственно, отсюда идет идея о том, чтобы как можно больше писать так называемых «чистых функций». Нужно различать контекст, где какой смысл вкладывается в понятие чистоты.
0
|
|
|
1 / 1 / 0
Регистрация: 19.12.2012
Сообщений: 12
|
|||||||||
| 11.04.2018, 15:10 | |||||||||
0
|
|||||||||
|
Модератор
|
|||||||||||||||||||
| 11.04.2018, 15:33 | |||||||||||||||||||
|
Maybe как монаду удобно использовать если есть функции a -> Maybe b, мы эти функции вызываем последовательно, передавая результат в следующую, а если какая то функция вернёт Nothing, то оставшиеся функции не вызываются.
1
|
|||||||||||||||||||
|
|
||
| 11.04.2018, 20:17 | ||
|
Влезаю в беседу, как запахло холиваром. Впрочем, хороший повод высказать своё мнение и начать знакомство.
Мне в целом очень нравится, что пишет dsorokin. А вопрошающий не слушает. Взять хотя бы: Однажды мы с KolodeznyDiver участвовали в обсуждении чистоты в Хаскелль. Тема ушла в холивары. Так вот, там я пытался аргументировать, что понятие чистой функции возникло в программировании в протиповес понятию функции, используемом в том же программировании. При этом понятие функции в программировании отличается от понятия функции во всех остальных областях человеческой деятельности, где под словом "функция" как раз понимается чистая функция, а иных нет. В тех ЯП, где можно делать присваивания, изменения глобального состояния и т.п., функциями с сигнатурой A -> B называются те подпрограммы, которые в начале принимают объект типа A, а в конце возвращают (т.е. оставляют в памяти) объект типа B. В математике же под функциями понимается однозначное соответствие объекта B объекту A, и ничего сверх этого. В чисто функциональных ЯП все функции чистые, т.е. все функции являются функциями в строго математическом (и общечеловеческом, за исключением программистов) понимании. Однако, уже имеется устойчивая традиция в программировании, в т.ч. в употреблении терминов. Поэтому теперь всякий раз, когда мы говорим "функция", мы должны уточнять, что функция чистая, имея в виду то, что она возвращает результат, однозначно определяемый аргументом. Также в традиции программистов рассматривается, например, функция чтения строки get_string как нечистая функция с сигнатурой () -> String. В чисто функциональных ЯП get_string является чистой (других здесь нет) функцией с другим типом, например, () -> IO String. Если бы от меня зависело, как употреблять термины, которые, объективно говоря, сейчас употребляются непоследовательно, я бы предложил следующее: чистая функция типа A -> B — ... m-грязная функция A -> B — это чистая функция типа A -> m B грязная функция — это IO-грязная функция. То есть предлагаю понятие нечистой (грязной) функции обыграть через категорию Клейсли. P.S. KolodeznyDiver, речь идёт о том, что в самописной реализации деления по-хорошему нельзя делить на ноль, а потому там будет Maybe. Стандартная реализация при делении на ноль кидает исключение, то есть _|_.
1
|
||
|
Модератор
|
||
| 11.04.2018, 22:02 | ||
|
Не по теме: Всё остальное холивар, да.
1
|
||
| 11.04.2018, 22:02 | |
|
Чистые витруальные функции Абстрактные классы и чистые виртуальные функции Наследование: Чистые Виртуальные функции и Абстрактные классы грязные методы сео C++ libpq select грязные транзакции Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
GitHub Copilot в JetBrains: модель по умолчанию, Fix и контроль MCP
and_y87 12.10.2026
10 октября 2026 года GitHub обновил Copilot для JetBrains: добавил настройки стартовой модели, исправления из диагностики и управление автозапуском MCP. Поддержка IDE 2025. 1 прекращена — требуется. . .
|
День 5 из 28: Codex подсказывает следующий запрос
and_y87 12.10.2026
9 октября 2026 года OpenAI запустила бету Composer predictions — подсказок следующего сообщения в текущем диалоге Codex. Это помощь с формулировкой запроса, а не автоматическое продолжение задачи.
. . .
|
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет!
За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
|
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык.
Возвращает он вот это:
https:/ / i. **********/ vqBWLe2. png
Нужную строчку в 3й колонке просто выдумал. .
Это. . .
|
|
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor.
Это. . .
|
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js.
В помощники взял Яндекс-Алису.
Было создано три зала на разные интересы.
исторические и ретро
сериал Хичкок. . .
|
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
|
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#.
Название изменил на ColorStep.
Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
|