Горячее
Лучшее
Свежее
Подписки
Сообщества
Блоги
Эксперты
Войти
Забыли пароль?
или продолжите с
Создать аккаунт
Регистрируясь, я даю согласие на обработку данных и условия почтовых рассылок.
или
Восстановление пароля
Восстановление пароля
Получить код в Telegram
Войти с Яндекс ID Войти через VK ID
ПромокодыРаботаКурсыРекламаИгрыПополнение Steam
Пикабу Игры +1000 бесплатных онлайн игр Погрузись в «Свидания с отличиями» — увлекательную романтическую игру в жанре «найди отличия», где ты знакомишься с обаятельными девушками, узнаешь их истории и организуешь незабываемые свидания. Тебя ждут десятки уровней, полных эмоций, и множество очаровательных спутниц!

Свидания с отличиями

Казуальные, Головоломки, Новеллы

Играть

Топ прошлой недели

  • solenakrivetka solenakrivetka 7 постов
  • Animalrescueed Animalrescueed 53 поста
  • ia.panorama ia.panorama 12 постов
Посмотреть весь топ

Лучшие посты недели

Рассылка Пикабу: отправляем самые рейтинговые материалы за 7 дней 🔥

Нажимая «Подписаться», я даю согласие на обработку данных и условия почтовых рассылок.

Спасибо, что подписались!
Пожалуйста, проверьте почту 😊

Помощь Кодекс Пикабу Команда Пикабу Моб. приложение
Правила соцсети О рекомендациях О компании
Промокоды Биг Гик Промокоды Lamoda Промокоды МВидео Промокоды Яндекс Маркет Промокоды Пятерочка Промокоды Aroma Butik Промокоды Яндекс Путешествия Промокоды Яндекс Еда Постила Футбол сегодня
0 просмотренных постов скрыто
3
Аноним
Аноним

Configurator: типобезопасные конфигурационные файлы для Haskell, которые не позволят собрать проект с ошибками⁠⁠

1 месяц назад

Кратко о проекте

Haskell славится своей системой типов и стремлением к безопасности на этапе компиляции. Однако что если ту же идею применить не только к логике программы, но и к ее конфигурации? Библиотека Configurator от разработчика C0dwiz предлагает именно такой подход - она проверяет корректность конфигурационных файлов еще до запуска программы

🧩 Что делает Configurator?

Configurator - это библиотека для типобезопасного парсинга конфигурационных файлов (YAML или JSON) на языке Haskell. Ее уникальность заключается в том, что проверка и валидация структуры конфигурации происходит до запуска программы. Если в конфиге отсутствует необходимое поле, тип данных не соответствует ожиданиям или вы допустили опечатку - проект не соберется. Компилятор сразу укажет на ошибку

⚙️ Немного под капотом

Configurator поддерживает форматы YAML и JSON, но главное - не в форматах, а в подходе. Он использует возможности Template Haskell и квази-квоты для загрузки конфига на этапе компиляции, проверки его структуры и встраивания данных в программу. Разработчик описывает схему конфигурации (обязательные и опциональные поля, значения по умолчанию), и Haskell гарантирует, что все компоненты будут соответствовать друг другу - код и конфиг не будут расходиться ни на шаг

✅ Преимущества

💡 Ошибки выявляются на этапе компиляции, что исключает ошибки типа «не найден ключ» в производстве

🔒 Типобезопасность: конфигурация становится неотъемлемой частью системы типов

📄 Поддержка YAML и JSON «из коробки»

🧠 Простой и выразительный API: минимум boilerplates, максимум пользы

⚠️ Что стоит учесть

🧱 Проект еще молодой, с небольшим сообществом и количеством звезд

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

🧾 Некоторые заявленные возможности (например, автогенерация документации из схемы) пока находятся на стадии идеи

🧠 Почему это важно

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

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

💬 Личное впечатление

Это очень «хаскелльский» проект - в хорошем смысле. Configurator демонстрирует, как систему типов можно применять к повседневным задачам: не ради красоты, а ради практической надежности. Он не стремится быть универсальным, а просто решает одну проблему - ошибки в конфигурации - изящно и с инженерной строгостью

Если вы пишете на Haskell и любите, когда компилятор защищает вас от глупых ошибок, - попробуйте эту библиотеку. Она небольшая, но ее польза ощутима

🔗 Полезные ссылки

📦 Репозиторий: github.com/C0dwiz/Configurator

Показать полностью
[моё] Haskell Библиотека Текст
2
51
Reglam
Reglam
IT-юмор

Мысль изречённая есть ложь⁠⁠

5 месяцев назад
Мысль изречённая есть ложь

https://panorama.pub/news/skolniki-kotoryh-s-1-klassa

Показать полностью 1
Fake News ИА Панорама IT юмор Haskell
31
1
thecodemedia
thecodemedia

Пояснительная бригада: мем про побочные эффекты⁠⁠

6 месяцев назад
Пояснительная бригада: мем про побочные эффекты

На картинке написано:

— Я прогаю на Haskell

— Это что значит?

— Это значит, что он боится побочных эффектов!

— Ничего подобного!

— printf («Hello world!"\n);

— Патрик, хорош, ты его перепугал!

Поясняет Паша Вавилин, наставник на курсе по Python.

В функциональном программировании есть понятие side-эффекта: это когда функция не только возвращает результат, но и делает что-то кроме. Например, вывести что-то на экран, записать в файл, поменять что-то внутри какой-то другой переменной в программе — это всё побочные эффекты (side effects).

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

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

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

Вот мы программируем себе и положили побочный эффект «Увеличить глобальный счётчик» в одну из функций. Вызвали её по делу. Она правильно всё посчитала и увеличила счётчик. Пока что ничего страшного.

Через полгода другой программист поддерживает за нас программу. Видит: «О, эта функция делает то, что мне нужно, вызову её». И он не знает, что, помимо своей основной работы, она ещё увеличивает глобальный счётчик (забыл про побочный эффект). Он её вызывает в цикле тысячу раз, и она тысячу раз увеличивает счётчик. А счётчик, в свою очередь, завязан на что-то другое в программе. И в итоге вся программа ломается.

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

Показать полностью 1
Программирование IT Разработка Программист Haskell Python Код
1
111
shakerdoto
IT-юмор

Разница⁠⁠

1 год назад
Показать полностью 2
Python Haskell Скриншот
31
1
Neurosonya
Neurosonya

Tabnine напишет код за вас⁠⁠

2 года назад
Перейти к видео

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

Сервис работает для Python, Java, Haskell и C++. Tabnine совместим с VS Code, Sublime Text, Atom, Vim и другими редакторами кода.

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

Показать полностью
Искусственный интеллект Нейронные сети Полезное Digital Код Программирование Технологии Инновации Будущее Программист Python Java C++ Haskell Видео Без звука
2
AlexErf

Примеры функционального программирование для новичков⁠⁠

2 года назад

Представь, что у тебя есть три волшебные машины: машина A, машина B и машина C. Каждая машина делает что-то особенное с предметами:

1. Машина A окрашивает вещи в зеленый цвет.

2. Машина B делает вещи в два раза больше.

3. Машина C превращает фрукты в овощи.

Теперь, используя язык программирования Haskell, мы можем создать код, который моделирует это поведение:

haskell

type Item = String

machineA :: Item -> Item

machineA item = "зеленый " ++ item

machineB :: Item -> Item

machineB item = "большой " ++ item

machineC :: Item -> Item

machineC "яблоко" = "маленькая красная морковка"

machineC item = item

transformItem :: (Item -> Item) -> (Item -> Item) -> (Item -> Item) -> Item -> Item

transformItem = (.) . (.)

В этом примере мы определяем тип Item для представления предметов. Мы также определяем функции machineA, machineB и machineC, которые соответствуют машинам A, B и C из нашего описания. Затем мы определяем функцию transformItem, которая позволяет нам применить три машины одна за другой к предмету.

haskell

main :: IO ()

main = do

let item = "яблоко"

let transformedItem = transformItem machineA machineB machineC item

putStrLn transformedItem

Здесь мы определяем item как "яблоко" и применяем функцию transformItem к нему, чтобы получить преобразованный предмет. Затем мы выводим результат на экран. В итоге, мы получим "большая зеленая морковка", как и ожидалось из нашего описания.

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

Больше примеров в https://t.me/Koding404

Показать полностью
Гайд Технологии Инструкция Программирование Haskell Разработка IT Инновации Обучение Текст
8
20
xfides
Лига программистов

Занятия с напарниками по Haskell (4)⁠⁠

3 года назад

Добрый день. Продолжаю делиться наблюдениями из нашей группы по изучению Haskell (

часть 1, часть 2, часть 3 ). Воскресенье, дел мало. Можно посидеть и посочинять что-то, или рассказать. Тем более давно была предыдущая часть.

(Оффтоп) Прикольно. Только что узнал, что абзацы в тексте в редакторе пикабу можно разделять не только через "enter", но и через специальную кнопку "текст". Подобные блоки текста можно перетаскивать в режиме drag-and-drop.

Занятия у нас продолжаются. Был небольшой перерыв в 2 недели. Один из участников был в отпуске. Он хорошо отдохнул. Природа, свежий воздух, все дела. Вернулся, и все стало по прежнему, но хотя бы не так душно (шутка). 4 занятия в неделю. Читаем книгу, общаемся, решаем задачки.

И начитали мы уже 300 страниц. Из 1200. Достижение =). Да, пусть еще не монады. Но и не сказать , что идем на расслабоне. Книжка хитрая. Идеально держит баланс между "легко заскучать" и "трудно, что легче забросить". За это ей большой респект. Ради интереса попробовал почитать знаменитую "Изучай хаскель во имя добра" - ну не то. Даже несмотря на перевод, картинки, красивое оформление - путь изучения идет через спотыкания. Но это лично мое мнение. Не надо делать на этом глобальные выводы =)

Проходили недавно рекурсию. Ох и злобная тема. Вроде логика простая. Задал базовое условие, и вызываешь фукнцию внутри определения другой. Но как пошли задачки с "переподвыпертами"  - так сразу надо думать. Дополнительные вспомогательные функции писать, совмещать их по типам. Зато сразу научился различать одинарные и двойные кавычки. В одинарных кавычках тип данных - Char, в двойных - [Char], то есть String. Просто на этом моменте чаще всего не сходились типы в задачках на рекурсию.

Сейчас изучаем списки. Забавно автор их подает. Через такие термины как "cons cell" и "spine". Знакомит с основами ленивых вычислений haskell. Например, length списка будет вычислять только хребет списка (spine), не заботясь о том, что лежит в ячейках (cons cell) самого списка. Не заботясь - значит не вычисляя выражение, оставляя его в виде thunk. А само выражение, допускающее внутри себя thunk-и, находится в weak head normal form

( https://wiki.haskell.org/Weak_head_normal_form ). Читатель скажет: "фигня какая-то". А это только введение =)

Ладно уж. Учимся и страдаем. Страдаем и учимся. Хорошо, что все-таки вместе, в группе. Потому что в одиночку неприязнь к подобным вещам наступает быстро. А так, не хочется сильно тупить на созвоне - так даже иногда заранее читаешь наперед.

Прикол даже появился. Как-то попалась нам задачка вычислить 10-милионный палиндром на целых числах. Не спрашивайте, откуда задачка взялась. Кто-то пришел, ноги с улицы не вытер, и занес нам это. Так эта задачка сильно раззадорила участника нашей группы. И чтобы её решить - он походу наперед весь хаскель уже выучил. И оптимизации, и массивы, и фиг еще знает что. А я что - а я дождусь, когда он её решит, и я поинтересуюсь решением. Да, такой вот я нахлебник в этом вопросе =)

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

Вот такие дела. Пора выводы делать. А они простые. Хорошо, что с пользой трачу время своего сна на haskell, хоть это и не всегда приятно по ощущениям. Радует, что что-то остается в голове. Стремлюсь к большему. Чего и вам, читатели, желаю =)

Показать полностью
[моё] Haskell Хаскель Программирование IT Обучение Текст
12
12
xfides
Лига программистов

Занятия с напарниками по Haskell (3)⁠⁠

3 года назад

Добрый вечер. Продолжаю делиться наблюдениями из нашей группы по изучению  Haskell (
часть 1,  часть 2  ). Скорее всего, пишу текст для себя, попутно повторяя \ вспоминая пройденный материал. Итак, поехали.

Прошли базовые функции для списков: head, tail, take, drop, !! . Отдельная благодарность автору книги в этом моменте, что он не стал подробно расписывать, какие же крутые это вещи, а просто обозначил их как API. Берите, пользуйтесь. Вы же не глупые: сможете различить, что значит взять голову списка, а что значит взять первые 5 элементов. Так что эту тему проскочили быстро.


А дальше начались базовые определения даже не столько языка Haskell, а  программирования в целом. Type, scope, local bindings, data structure, list... Хорошо, что у каждого из нас есть какой-никакой программистский бэкграунд. Поэтому именно эти определения у нас не вызвали затруднения. А вот следующие термины уже нас напрягли.


Data declaration (0), type constructor (1), data constructor (2). Вот в наших головах слово "конструктор" связано с  тем, что это функция, которая должна что-то создать. Конструктор может принимать аргументы. А когда мы пишем (0) data (1) Bool = (2) False | (2) True - тут вроде как ничего не создается в прошлом, привычном для нас понимании. Ну ок, допустим, что мы ввели новую сущность тип Bool. Да, он появился на свет, типа  создался. Но False, True - почему  их называем конструкторами? Это же значения, это данные, которые "населяют" наш Bool. Их не вызывают. Бесспорно , какие-то догадки есть. Кто-то наперед заглянул, кто-то гугл помучил. Но все равно очень непривычно. В этом моменте впервые столкнулись с тем, что наш предыдущий опыт скорее даже мешал, чем помогал в осознании текста книги.

Затем автор ввел понятие переменной типа (type variable). Заставил нас различать оператор ++ и функцию concat. Заставил прочувствовать разницу следующих сигнатур: 1) [a]->[a]->[a] и 2) [[a]] -> [a]. Признаюсь,  вроде бы такой простой пример, но у меня с ним трудности. До сих пор спотыкаюсь на различии этих видов конкатенации. И там, и тут возвращаются списки. А как они получились - мне не важно. Может, как станет важно, так и все станет легко и прозрачно.


Дальше нас начали знакомить с базовыми типами. Научились отличать смысл следующих слов: Integral, Int, Integer. Через пару страниц посмеялись, что, оказывается, в комплект входят Int8, Int16... Все познается в сравнении. JS, твой универсальный double на все времена по сравнению с зоопарком в Haskell кажется таким простым. А Integer от Haskell удивительно похож по своей задумке на BigInt в JS. Вот интересно,  а как можно считать бесконечно большие числа на компьютере, если не через биты памяти того же стандарта IEE-754? Переводить в строки, строить отдельный парсер... Кто знает, напиши в комментариях, в чем там фокус?

В итоге, мы научились чувствовать, что в Haskell есть отдельный уровень типизации, а есть отдельный уровень вычислений. Путать их нехорошо. Их надо держать под своим контролем в связке и согласованности. Еще попутно автор намекал, что нас ждут Type classes. Просил не расстраиваться. Сказал, что пока думайте о них как об интерфейсах в классических языках программирования про ООП. А потом, когда дойдем до этой темы, там все нам объяснит. Брр. Опять отсылка в будущее. Бесит.

А пока мы остановились на упражнениях по пройденному материалу: базовые операции над числами, строками, списками. Думается, что раз мы честно проходили материал и не позволяли халявить друг другу, то проблем с решением этих упражнений у нас не будет. Ну а если будут... - предлагайте ваши варианты =)

Показать полностью
[моё] Haskell Хаскель Программирование IT Обучение Текст
5
Посты не найдены
О нас
О Пикабу Контакты Реклама Сообщить об ошибке Сообщить о нарушении законодательства Отзывы и предложения Новости Пикабу Мобильное приложение RSS
Информация
Помощь Кодекс Пикабу Команда Пикабу Конфиденциальность Правила соцсети О рекомендациях О компании
Наши проекты
Блоги Работа Промокоды Игры Курсы
Партнёры
Промокоды Биг Гик Промокоды Lamoda Промокоды Мвидео Промокоды Яндекс Маркет Промокоды Пятерочка Промокоды Aroma Butik Промокоды Яндекс Путешествия Промокоды Яндекс Еда Постила Футбол сегодня
На информационном ресурсе Pikabu.ru применяются рекомендательные технологии