Метка «haskell» - 2

Traffic Jam — как решить задачу на языке HaskellПрошло два месяца с момента моей предыдущей публикации о конкурсах по функциональному программированию, и я спешу порадовать заинтересованных читателей новым отчётом о проведённом конкурсе. На этот раз, в декабре, я немного сплоховал, из-за чего конкурс получился смазанным, скомканным. Хотя, по свидетельству одного из участников, задача была интересной, несмотря на то, что это опять поиск по дереву состояний. Но у меня на работе была сдача одного из проектов, поэтому я опубликовал заготовленную задолго заготовку, а прорекламировать конкурс и позабыл. В итоге приняло участие только два человека. Ну и вы сами можете всё это изучить: условие, результат.

В качестве задачи участникам была сформулирована необходимость реализовать решатель для игр типы Rush Hour или Traffic Jam — на квадратной парковке при помощи использования свободных мест для разгребания заблокированного пути необходимо освободить «красную» машину — своеобразные «расширенные пятнашки». В общем, я думаю, большинство читателей понимает, о чём речь.

Собственно, на конкурс было представлено два решения — одно на языке программирования Clojure, а второй — на JS. В честь того, что конкурс был заключительным в этом году, призы уже получили все участники. Ну а я традиционно представлю решение конкурсной задачи на языке программирования Haskell. Так что если кому-то интересно —

Читать полностью »

Классы типов на C++
Уже было описано как реализовать монады на C++ без классов типов. Я же хочу показать, как можно реализовать классы типов, использую в качестве примера монады.
Этот прием широко применяется в языке Scala, но может быть использован и в C++. Кратко я его описал в качестве иллюстрации трудностей унифицированного описания библиотек, сейчас же продемонстрирую его реализацию.
Нужно отметить что классы типов применяются не только в декларативных языках, как Haskell и Mercurry, но о нашли свое отражение в достаточно классических Go и Rust.
Этот прием так же подходит для реализации мультиметодов из Common Lisp и Clojure.

C++ я не брал в руки уже лет шесть, так что код может быть не идеоматичным и не использовать новые (полезные) фичи.
Кроме того, я полностью игнорирую проблему управления памятью — практикующие C++ справятся с этим лучше меня.
Работоспособность кода проверялась на gcc 4.7.3.

Читать полностью »

Привет Habr! Сегодня мы поговорим о полиморфизме функций, операторах и карринге. Напоминаю, что лекции рассчитаны на новичков, а конспект предпологает сжатую форму изложения. Если все еще интересно… Читать полностью »

image
Привет Habr! Сегодня я достал свои старые лекции по курсу «Haskell как первый язык программирования» Сергея Михайловича Абрамова и попробую максимально доходчиво и с примерами рассказать об этом замечательном языке тем, кто с ним еще не знаком. Рассказ ориентирован на неподготовленного читателя. Так что, даже если вы впервые услышали слово Haskell… Читать полностью »

Добрый дня, уважаемыее. Всегда трудно начинать. Трудно начать писать статью, трудно начать отношения с человеком. Очень трудно, бывает, начать изучать новый язык программирования, особенно, если этот язык рушит все представления и устои, которые у вас были, если он противоречит привычной картине мира и пытается сломать вам мозг. Пример такого языка — Haskell.
Читать полностью »

Rocket Science for Fun and Fun. Запускаем космические кораблиКак обычно, по чётным месяцам 2013 года проводятся конкурсы по функциональному программированию. Октябрь не стал исключением, и непосредственно на первой неделе был объявлен октябрьский конкурс, который на этот раз был подготовлен великолепным Дмитрием Поповым. Конкурс касался космонавтики — для интересной игры Kerbal Space Program надо было подготовить программное средство для расчёта космических аппаратов. Так что на этот раз конкурс являл собой не только интересное, но и крайне полезное как для ума, так и для прикладного космического искусства дело.

Автор конкурса добавил несколько ограничений — разработанная программа должна находить решение по введённым исходным данным не более, чем за две минуты. Победитель выявлялся на этот раз не просто по скорости публикации решения, но по сумме результатов, которые выдавала программа. Минимальная сумма выявила победителя. И он, кстати, получил, как обычно, памятный приз.

В конкурсе приняли участие четыре конкурсанта, которые успешно написали свои «специализированные калькуляторы». В качестве языков программирования использовались — Clojure, Java, Haskell и Python (перечислены в порядке расположения по занятым местам). В общем, с итогами конкурса всякий может ознакомиться здесь. А мы, пожалуй, перейдём к описанию авторского решения, которое, как обычно, выполнено на языке программирования 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))

Читать полностью »

Добрый день, уважаемые читатели Хабра. Как часто вы смотрите за актуальностью той или иной платформы? Если вы хороший специалист, то, наверное, всегда. Если же нечасто – пожалуй, пора начать это делать. Мы подготовили перевод исследования американского блогера Бена Подгурски (Ben Podgursky), позволяющего понять уровень оплаты программистов, в зависимости от языков программирования. Бен использовал в качестве источника данные пользователей на GitHub. Данный пост набрал большой рейтинг на Hacker News.

image

Стереотипов о разработчиках различных языков очень много, но мне было любопытно, насколько они соответствуют действительности.
Читать полностью »

Игра Wordament — реализация помощника на языке HaskellКак обычно с опозданием в месяц или даже полтора я публикую отчёт о проведённом в начале августа конкурсе по функциональному программированию под эгидой Фонда Поддержки Функционального Программирования ФП(ФП). Задачей конкурса было разработать программное решение для игры Wordament, которая заключается в поиске на квадратном поле 4х4 из букв запрятанных в нём слов. Слова могут быть в любой форме, каждая буква может быть использована в слове только один раз. Переходить от буквы к букве можно по горизонтали, вертикали или диагонали, поэтому иногда слова запрятаны в поле очень мудрёным способом.

Задача осложнялась тем, что один раунд игры длится ровно две минуты, а потому необходимо было реализовать очень быстрое решение — загрузка словаря в память, ввод исходных данных, поиск слов и вывод найденных слов на экран в порядке, отсортированном по возрастанию стоимости слов — всё это надо было сделать очень быстро, чтобы у игрока оставалось время на ввод слов в игру для получения большого количества очков. Скажем, что на экране слова должны были появиться не позднее, чем через 15 секунд после ввода исходных данных.

В конкурсе приняли участие четыре человека, которые написали свои решения на следующих языках программирования: Clojure, Nemerle, Python и Haskell. На основе последнего решения и написана данная краткая заметка.

Так что ежели кто интересуется алгоритмом поиска слов в поле, то добро пожаловать под кат.

Читать полностью »

Да-да, все правильно — теперь под iOS можно писать на Haskell! Вот сообщение одного из создателей этого чуда (оригинал):

Привет всем!
Мы со Stephen Blackheath безумно рады сообщить, что на данный момент в GHC появилась возможность компилировать в нативный код, поддерживаемый iOS устройствами, а также iOS симулятором. Все, что нужно, вы найдете здесь: ghc.haskell.org/trac/ghc/wiki/Building/CrossCompiling/iOS
Если коротко, то вы можете использовать «ghc-ios myFiles.hs» для получения универсальных ARMv7/ARMv7s/i386 библиотек и подключать их к проекту в Xcode.
Сейчас Стивен работает над чудесными FRP-powered играми, я тружусь над проектом SpaceTime, который скоро анонсирую, а вы все просто обязаны бежать к компьютеру и начинать писать под iOS на лучшем в мире языке:)

Читать полностью »


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js