Форум программистов, компьютерный форум, киберфорум
Haskell
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.67/21: Рейтинг темы: голосов - 21, средняя оценка - 4.67
2 / 2 / 0
Регистрация: 11.12.2013
Сообщений: 58

Монады, чистые/грязные функции

06.09.2015, 18:36. Показов 5009. Ответов 24
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
я только начал разбираться в этих вещах и не совсем понимаю как мне реализовать те функции которые так легко реализуются в императивных языках

как я понял если я считываю что-то из файла, и возвращаю это из функции то получу String обернутый в IO, ковыряясь в гугле, вычитал, что от IO избавиться вообще никак нельзя. А что если мне просто надо считать из файла допустим список слов? Я пытался делать вот так:
Haskell
1
2
3
4
5
6
readThis encode name = do 
    h <- openFile name ReadMode
    hSetEncoding h encode
    hGetContents h
 
readFromFile = readThis utf8 "file.txt"
позже выполняю вот так
Haskell
1
let t = readFromFile
и если я правильно понимаю мне возвращается тут просто String обернутый в IO, я хочу избавиться хоть как нибудь от IO и пытаюсь просто написать какую-нибудь функцию которая бы мне возвращала лист строк
Haskell
1
2
3
4
someAction x = do
    xs <- x
    let t = lines xs
    ...
если я правильно понимаю, то переменная t сейчас имеет тип [String].
Здесь вместо точек я поначалу писал return t но потом, почитав различных статей, понял что return оборачивает все в монаду...

Так каким же образом мне просто получить из файла список строк (просто вернуть из функции [String], ну или более грубо: как считать из файла список строк, так чтобы с ним можно было работать как с обычным списком а не как с какой то монадой (вообще мне нужно считать словарь из файла, а потом с ним работать))?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
06.09.2015, 18:36
Ответы с готовыми решениями:

Чистые функции – теория
«Въезжаю» в функциональное программирование, хотелось бы обсудить с знатоками ФП чистые функции. Хотелось бы изложить некоторые...

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

Палиндромы и монады
Добрый вечер, уважаемые пользователи. У меня такая задача: &quot;Ввести строку символов. Вывести в файл все палиндромы строки (использовать...

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
Кто считает и что значит "самый правильный"?
Сужу по величине ажиотажа.
Насколько понял, это концепция заимствования (borrowing) в языке Rust.
Год возникновения Clean – 1987, Rust – 2010. Вот и думай, кто у кого и что заимствовал.
Кроме монад IO и ST в Haskell существует множество других монад, в том числе список тоже монада.
Мне кажется, что те проблемы, которые решает монада MayBe, можно решить без притягивания концепции монад. Это вопрос дизайна языка. Взять, к примеру, операцию деления. Результат операции — MayBe Float (иногда она выдаёт ошибку — когда делят на ноль). Операция деления не оказывает побочных эффектов. Она детерминирована, т.*е. при одинаковых входных данных даёт одинаковые выходные. Ну и зачем это делать через монады? Пусть эта операция выдавала бы тип Float, а вот обработку ошибки сделать по другому. Пользоваться типом Float удобнее, нежели MayBe Float. Кстати, я тут выше писал:
Haskell
1
get_string >>= return clean_fun >>= put_string
Наверняка тут ошибка. Потому что «return» превращает, допустим Integer, в IO Integer. А тут хотелось бы обратное преобразование: IO Integer в Integer.
0
Модератор
 Аватар для Curry
5171 / 3537 / 536
Регистрация: 01.06.2013
Сообщений: 7,700
Записей в блоге: 9
11.04.2018, 15:33
Цитата Сообщение от communicay Посмотреть сообщение
Вот и думай, кто у кого и что заимствовал.
Ещё раз. Концепция заимствования (borrowing) в языке Rust. Я не написал что клин взяли что то из раст.
Цитата Сообщение от communicay Посмотреть сообщение
Взять, к примеру, операцию деления. Результат операции — MayBe Float
О чём вы? Результат функций (/) и div тот же что и у их аргументов.
Maybe как монаду удобно использовать если есть функции a -> Maybe b, мы эти функции вызываем последовательно, передавая результат в следующую, а если какая то функция вернёт Nothing, то оставшиеся функции не вызываются.
Haskell
1
foo >>= bar >>= baz
В цепочку можно включить и функцию вида a -> b (без монады).
Haskell
1
foo >>= return . bar >>= baz
Цитата Сообщение от communicay Посмотреть сообщение
Наверняка тут ошибка
Точка после return нужна. Например
Haskell
1
main = getLine >>= return . head >>= print
1
Эксперт функциональных языков программированияЭксперт по математике/физике
4316 / 2107 / 432
Регистрация: 19.07.2009
Сообщений: 3,227
Записей в блоге: 24
11.04.2018, 20:17
Влезаю в беседу, как запахло холиваром. Впрочем, хороший повод высказать своё мнение и начать знакомство.

Мне в целом очень нравится, что пишет dsorokin. А вопрошающий не слушает. Взять хотя бы:
Цитата Сообщение от dsorokin Посмотреть сообщение
Предлагаю на время забыть про чистоту совсем. Она только путает. Скажу, что в haskell все функции являются формально чистыми.
Вообще, в рассматриваемом вопросе я бы это утверждение возвёл в качестве первого догмата.

Однажды мы с 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
Модератор
 Аватар для Curry
5171 / 3537 / 536
Регистрация: 01.06.2013
Сообщений: 7,700
Записей в блоге: 9
11.04.2018, 22:02
Цитата Сообщение от Mysterious Light Посмотреть сообщение
в самописной реализации деления по-хорошему нельзя делить на ноль, а потому там будет Maybe
Мы в разделе Haskell, а в Haskell, по стандарту, функции деления имеют сигнатуру a -> a -> a и никаких Maybe, в случае деления на ноль выбрасывается ArithException.

Не по теме:

Всё остальное холивар, да.

1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.04.2018, 22:02

Чистые витруальные функции
Доброго всем времени суток! В процессе изучения C++ натолкнулся на проблему касательно абстрактных классов и виртуальных функций. Вот...

Абстрактные классы и чистые виртуальные функции
У Р. Лафоре написано: И вот, есть такой пример из его книги: #include &lt;iostream&gt; #include &quot;msoftcon.h&quot; using...

Наследование: Чистые Виртуальные функции и Абстрактные классы
Добрый вечер помогите пожалуйста вывести на экран то что мы вводим с клавиатуры ( int s , char d ) #include...

грязные методы сео
Читая форум, последнее время все чаще стал задумываться... О том что на форуме о продвижении в интернет (есть клиент сайт и запрос, надо...

C++ libpq select грязные транзакции
добрый вечер делаю приложение в асинхронном режиме и после insert выполняется select, но новой строки не видит (хотя пару раз...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
25
Ответ Создать тему
Новые блоги и статьи
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. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru