Как стать автором
Обновить
59
0

Пользователь

Отправить сообщение

SublimeHaskell

Время на прочтение2 мин
Количество просмотров12K
В рамках знакомства с плагинами Sublime Text 2, добавил в SublimeHaskell несколько новых возможностей и багфиксов. Автор пока занят, поэтому pull request в подвешенном состоянии, забрать можно на гитхабе.


Читать дальше →
Всего голосов 25: ↑23 и ↓2+21
Комментарии53

Меню для Yi

Время на прочтение5 мин
Количество просмотров1.6K
Недавно я всё же решил сесть и разобраться с Yi — текстовым редактором наподобие Vim и Emacs, но написанном на Haskell. В комплекте даже есть Vim и Emacs симуляция.
Из-за отстутствия опыта с Vim или Emacs, мне подошла лишь Cua-симуляция. Хоткеев там мало, но зато они привычные для меня. Поэтому я решил начать с него и написать настройку для себя.
В обычных графических редакторах мне кажется удобным способ использования меню. Нажимаешь alt, открывается меню, где у каждого элемента подчёркнута буква, нажав которую, мы этот элемент выберем.
Таким образом не надо запоминать все команды сразу, а можно начинать пользоваться, подглядывая в меню, постепенно доводя до автоматизма.
Нечто подобное я решил прикрутить и в Yi.

image
Заглядываем под капот Yi
Всего голосов 12: ↑12 и ↓0+12
Комментарии11

Пример асинхронной монады

Время на прочтение12 мин
Количество просмотров2.1K
Предположим, две программы общаются друг с другом по сети, но не изволят дожидаться ответа, поэтому ответы приходят в произвольном порядке. Чтобы разобраться, что к чему, с сообщением посылается номер, а в ответе шлется номер исходного (на которое отвечаем) сообщения и номер ответа для последующей коммуникации.

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

Как бы в коде на вашем предпочитаемом языке выглядел, например, такой диалог, с учётом того, что в любой момент (между любыми из этих пунктов) могут прийти какие-то другие запросы, которые тоже надо обработать, но не впутать случайно в этот диалог:
1. Посылаем число
2. Приходит число в ответ
3. Посылаем число из п.2 в квадрате
4. В ответ опять число
5. Выводим на консоль сумму чисел п.2 и п.4

Вот как это будет выглядеть на Haskell (функция example, разумеется, неблокирующая):
example :: Int -> AIO ()<br>
example v = do<br>
    x <- request v<br>
    y <- request (* x)<br>
    io $ print (+ y)<br>

Сравните это с блокирующей похожей функцией, которая, к примеру, запрашивает ответ у пользователя:
example :: Int -> IO ()<br>
example v = do<br>
    x <- request v<br>
    y <- request (* x)<br>
    print (+ y)<br>

Расковырять монаду!
Всего голосов 42: ↑38 и ↓4+34
Комментарии8

Пытаемся сделать PDF-книгу из веб-комикса при помощи Haskell на примере xkcd

Время на прочтение7 мин
Количество просмотров2.2K
Прочитав статью решил проверить, насколько пригоден для этого Haskell. Сразу скажу, сам Haskell пригоден весьма неплохо, но вот, пробежавшись по hackage.haskell.org, я сразу обнаружил проблемы с библиотеками для работы с PDF, что и поставило крест на полноценной реализации.
Но я решил всё же проделать часть работы, дабы показать, как та же задача могла бы быть сделана на Haskell, если бы да кабы…
Читать дальше →
Всего голосов 36: ↑32 и ↓4+28
Комментарии17

WebSocket сервер на Haskell

Время на прочтение6 мин
Количество просмотров4.1K
Как-то раз от нечего делать я решил написать WebSocket сервер, а написав, подумал, что кому-то может оказаться интересным, чем же тут может помочь ленивость, функциональная чистота и прочие лямбды.
Читать дальше →
Всего голосов 47: ↑45 и ↓2+43
Комментарии21

Zipper — производная от типа

Время на прочтение5 мин
Количество просмотров3K
Zipper — способ представления типа данных, позволяющий проходить по структуре и изменять отдельные элементы, несмотря на функциональную чистоту. Например, если по списку мы можем только пробежаться вперёд, делая что-либо с элементами, то с зиппером мы сможем «находиться» в определённом элементе, перемещаться вперёд-назад и менять текущий элемент.
Интересно то, что зиппер для некоторого типа можно получить буквально взяв его производную.
Читать дальше →
Всего голосов 24: ↑23 и ↓1+22
Комментарии11

Классы типов, монады

Время на прочтение15 мин
Количество просмотров13K
Темой сегодняшней статьи будут классы типов, некоторые стандартные из них, синтаксический сахар с их использованием и класс монад.
Классы привносят динамический полиморфизм, как и интерфейсы в традиционных императивных языках, а также могут быть использованы как замены отсутствующей в Хаскеле перегрузки функций.
Я расскажу, как определить класс типов, его экземпляры (instance) и как это всё устроено внутри.

Предыдущие статьи:
Типы данных, паттернг матчинг и функции
Основы
Читать дальше →
Всего голосов 30: ↑29 и ↓1+28
Комментарии24

Типы данных, паттернг матчинг и функции

Время на прочтение5 мин
Количество просмотров9.8K
Сегодня, как обещал, вкратце расскажу про пользовательские типы данных, определения функций и сопоставления с образцом.

Предыдущие статьи:
Основы
Последующие статьи:
Классы типов, монады
Читать дальше →
Всего голосов 21: ↑19 и ↓2+17
Комментарии9

Основы

Время на прочтение8 мин
Количество просмотров13K
Сегодня я постараюсь рассказать самые основы, такие, как базовые типы данных, типы функций, ФВП, списки (в том числе и бесконечные).

Последующие статьи:
Типы данных, паттерн матчинг и функции
Классы типов, монады
Читать дальше →
Всего голосов 72: ↑69 и ↓3+66
Комментарии162

Вступление

Время на прочтение1 мин
Количество просмотров3.8K
Haskell достаточно необычный язык. Но, несмотря на немалое количество статей по нему, нередко можно столкнуться с мнением, что всё это помогает лишь в синтетических примерах. И действительно, на простых примерах всё выглядит просто, но куда сложнее представить себе хотя бы небольшую программу в таком стиле, а статьи зачастую рассматривают особенности языка. Поэтому я захотел написать серию статей, в течение которых мы изучим возможности языка и попробуем написать простой чат. Почему именно чат? Потому что там есть место и многопоточности, и GUI клиента, и БД сервера. Хотя я с удовольствием послушал бы и ваши предложения, так как мне самому интересно, насколько этот язык удобен для решения более сложных задач.
Так что, если вас это заинтересует, то я рискну.

Основы
Типы данных, паттерн матчинг и функции
Классы типов, монады
Всего голосов 68: ↑63 и ↓5+58
Комментарии54

Информация

В рейтинге
Не участвует
Откуда
Россия
Дата рождения
Зарегистрирован
Активность