В этой статье мы попытаемся рассмотреть всё разнообразие Алгебраических Типов Данных.
Надо сказать, задача это достаточно неподъёмная, и понять человеку, если он ранее с Алгебраическими Типами не имел дело — не очень просто.
АТД были впервые использованы в языке Hope, но основную популярность они приобрели благодаря языкам ML, такими как Standart ML, OCaml, F#, и языку Haskell.
Ныне АТД в той или иной мере поддерживаются в значительно большем количестве языков: Scala, Rust, Nemerle, Racket,…
АТД называются алгебраическими, потому что их можно представить как некую алгебраическую композицию типов. Это знание даёт своё преимущество: понимая свойства алгебраической композиции, можно посчитать какой тип необходим для построения тех или иных данных.
Будем рассматривать типы на основе языка Haskell, однако подобного с лёгкими изменениями можно добиться в других языках с поддержкой АТД.
Читать полностью »
Рубрика «haskell» - 15
Зоопарк Алгебрaических Типов Данных
2014-01-16 в 0:08, admin, рубрики: adt, haskell, АТД, Программирование, функциональное программирование, метки: adt, АТДОдиннадцатый выпуск электронного журнала Pragmatic Perl
2014-01-06 в 20:49, admin, рубрики: haskell, perl, pragmatic perl, Raspberry Pi, метки: haskell, perl, pragmatic perl, Raspberry PiПредставлен первый в этом году выпуск русскоязычного журнала Pragmatic Perl. Какими интересными событиями в мире Perl запомнился прошлый год и что важного произошло в русскоязычном Perl-сообществе? Как ведётся разработка на Perl под Raspberry PI и сравнение функционального программирования на Haskell и Perl. Это и многое другое доступно на страницах свежего одиннадцатого номера.
Traffic Jam — как решить задачу на языке Haskell
2013-12-23 в 3:38, admin, рубрики: haskell, конкурс, ФП(ФП), я пиарюсь, метки: haskell, конкурс, ФП(ФП)Прошло два месяца с момента моей предыдущей публикации о конкурсах по функциональному программированию, и я спешу порадовать заинтересованных читателей новым отчётом о проведённом конкурсе. На этот раз, в декабре, я немного сплоховал, из-за чего конкурс получился смазанным, скомканным. Хотя, по свидетельству одного из участников, задача была интересной, несмотря на то, что это опять поиск по дереву состояний. Но у меня на работе была сдача одного из проектов, поэтому я опубликовал заготовленную задолго заготовку, а прорекламировать конкурс и позабыл. В итоге приняло участие только два человека. Ну и вы сами можете всё это изучить: условие, результат.
В качестве задачи участникам была сформулирована необходимость реализовать решатель для игр типы Rush Hour или Traffic Jam — на квадратной парковке при помощи использования свободных мест для разгребания заблокированного пути необходимо освободить «красную» машину — своеобразные «расширенные пятнашки». В общем, я думаю, большинство читателей понимает, о чём речь.
Собственно, на конкурс было представлено два решения — одно на языке программирования Clojure, а второй — на JS. В честь того, что конкурс был заключительным в этом году, призы уже получили все участники. Ну а я традиционно представлю решение конкурсной задачи на языке программирования Haskell. Так что если кому-то интересно —
Haskell, как что-то очень близкое, или получаем комиты из github api
2013-12-12 в 15:35, admin, рубрики: github, haskell, метки: githubToo late — 'cause I got it now
there are monads all around
IO, State and lists abound
It's easy, like those people say
but my program got abstracted all away!
Maybe — o o o,
It's a monad too, I know
Why should I use another language at all?
Снова безумный адепт Haskell, и еще одна попытка доказать его практичность. Нестареющая классика.
Я постараюсь рассказать шикарную историю (не ведитесь на пафосную рекламу), в которой будут все необходимые компоненты блокбастера (я серьезно, не ведитесь) — знакомые герои, хорошо продуманная вселенная и открытая концовка (ну что ж...).
Читать полностью »
Классы типов на C++
2013-12-10 в 8:58, admin, рубрики: c++, haskell, scala, монады, ненормальное программирование, метки: c++, haskell, scala, монады
Уже было описано как реализовать монады на C++ без классов типов. Я же хочу показать, как можно реализовать классы типов, использую в качестве примера монады.
Этот прием широко применяется в языке Scala, но может быть использован и в C++. Кратко я его описал в качестве иллюстрации трудностей унифицированного описания библиотек, сейчас же продемонстрирую его реализацию.
Нужно отметить что классы типов применяются не только в декларативных языках, как Haskell и Mercurry, но о нашли свое отражение в достаточно классических Go и Rust.
Этот прием так же подходит для реализации мультиметодов из Common Lisp и Clojure.
C++ я не брал в руки уже лет шесть, так что код может быть не идеоматичным и не использовать новые (полезные) фичи.
Кроме того, я полностью игнорирую проблему управления памятью — практикующие C++ справятся с этим лучше меня.
Работоспособность кода проверялась на gcc 4.7.3.
Конспекты лекций «Haskell как первый язык программирования». Часть2
2013-12-02 в 17:43, admin, рубрики: haskell, функциональное программирование, метки: haskell, функциональное программированиеПривет Habr! Сегодня мы поговорим о полиморфизме функций, операторах и карринге. Напоминаю, что лекции рассчитаны на новичков, а конспект предпологает сжатую форму изложения. Если все еще интересно… Читать полностью »
Конспекты лекций «Haskell как первый язык программирования». Часть1
2013-11-28 в 17:48, admin, рубрики: haskell, функциональное программирование, метки: haskell, функциональное программирование
Привет Habr! Сегодня я достал свои старые лекции по курсу «Haskell как первый язык программирования» Сергея Михайловича Абрамова и попробую максимально доходчиво и с примерами рассказать об этом замечательном языке тем, кто с ним еще не знаком. Рассказ ориентирован на неподготовленного читателя. Так что, даже если вы впервые услышали слово Haskell… Читать полностью »
Прелюдия или как полюбить Haskell
2013-11-26 в 11:45, admin, рубрики: haskell, функциональное программирование, метки: haskell, функциональное программирование Добрый дня, уважаемыее. Всегда трудно начинать. Трудно начать писать статью, трудно начать отношения с человеком. Очень трудно, бывает, начать изучать новый язык программирования, особенно, если этот язык рушит все представления и устои, которые у вас были, если он противоречит привычной картине мира и пытается сломать вам мозг. Пример такого языка — Haskell.
Читать полностью »
Rocket Science for Fun and Fun. Запускаем космические корабли
2013-11-13 в 3:19, admin, рубрики: haskell, конкурс, я пиарюсь, метки: haskell, конкурсКак обычно, по чётным месяцам 2013 года проводятся конкурсы по функциональному программированию. Октябрь не стал исключением, и непосредственно на первой неделе был объявлен октябрьский конкурс, который на этот раз был подготовлен великолепным Дмитрием Поповым. Конкурс касался космонавтики — для интересной игры Kerbal Space Program надо было подготовить программное средство для расчёта космических аппаратов. Так что на этот раз конкурс являл собой не только интересное, но и крайне полезное как для ума, так и для прикладного космического искусства дело.
Автор конкурса добавил несколько ограничений — разработанная программа должна находить решение по введённым исходным данным не более, чем за две минуты. Победитель выявлялся на этот раз не просто по скорости публикации решения, но по сумме результатов, которые выдавала программа. Минимальная сумма выявила победителя. И он, кстати, получил, как обычно, памятный приз.
В конкурсе приняли участие четыре конкурсанта, которые успешно написали свои «специализированные калькуляторы». В качестве языков программирования использовались — Clojure, Java, Haskell и Python (перечислены в порядке расположения по занятым местам). В общем, с итогами конкурса всякий может ознакомиться здесь. А мы, пожалуй, перейдём к описанию авторского решения, которое, как обычно, выполнено на языке программирования Haskell.
Haskell — невозможное возможно?
2013-11-08 в 18:55, admin, рубрики: haskell, магия, невозможное возможно, функциональное программирование, метки: haskell, магия, невозможное возможно Известно, что задача определения того, истинна ли некоторая функция Integer -> Bool
хотя бы для одного числа вычислительно неразрешима. Однако, нечто, на первый взгляд кажущееся как раз таким оракулом (а именно, функцией (Integer -> Bool) -> Maybe Integer
) будет описано в этой статье.
Для начала, зададим свой тип натуральных чисел, практически дословно следуя их обычному математическому определению (почему это нужно будет видно в дальнейшем):
data Nat = Zero | Succ Nat (Eq, Ord, Show)
Другими словами, натуральное число — это либо ноль, либо некоторое натуральное число, увеличенное на единицу (Succ
от слова successor).
Также, для удобства, определим основные операции (сложение, умножение, конвертация из Integer
) над числами в таком представлении:
instance Num Nat where
Zero + y = y
Succ x + y = Succ (x + y)
Zero * y = Zero
Succ x * y = y + (x * y)
fromInteger 0 = Zero
fromInteger n = Succ (fromInteger (n-1))