Home

Ангэ · Эсэф

Свежие записи · Архив · Друзья · Личная информация

* * *
Сегодняшняя встреча SpB Haskell user group прошла просто замечательно - услышал много нового и интересного, да и сам что-то хорошее рассказал :)

В программе было три доклада:

  • "Комбинаторы сериализации" (слайды) - мой доклад.

  • "Свободные теоремы" (или "Теоремы нахаляву" - вольный перевод Theorems for free) (слайды) - доклад [info]deni_ok

  • "Функциональные структуры данных (часть вторая)" (слайды) - доклад [info]antilamer

(чуть позже возможно появятся фотографии и аудиозапись)

Я получил свой первый опыт чтения докладов широкой (да ещё и весьма интеллектуальной) публике, получив при этом массу fun-a. Смею надеяться - первый блин не вышел комом :)

Остальные доклады тоже весьма порадовали - и интересные результаты, получающиеся в результате вывода этих самых "халявных" теорем, и полезные и интересные техники, описанные Женей, вместе с его замечательными иллюстрациями :) и последующая мини-лекция о realtime-вычислениях и проблемах, с этим связанных, рассказанная Иваном Тарасовым ([info]_navi_), так сказать, в кулуарах.

Что же, с нетерпением жду следующих встреч! :)

Метки: , ,

Настроение:
artistic artistic
Музыка:
The Velvet Underground
* * *
Вчера, с подачи [info]antilamer (спасибо за вдохновляющий поток эмоций! :)), поразбирался с QuickCheck - средством для тестирования функционального кода, которое основывается на проверках неких свойств, которые задаются относительно определённых функций и проверяются на случайно сгенерированных данных.

Классический пример: есть функция reverse для обращения списков. Тогда можно придумать такие достаточно ярко её характеризующие свойства:

propReverseUnit x       = reverse [x] == [x]                             
-- (то есть, обращая список из одного элемента - получаем тот же список)

propReverseAppend xs ys = reverse (xs++ys) == reverse ys ++ reverse xs
-- (обращая конкатенацию списков, получаем конкатенацию обращений частей 
-- в обратном порядке)

propReverseReverse xs   = reverse (reverse xs) == xs
-- (обращая обращение списка - получаем тот же список)

Теперь из-под ghci запускаем QuickCheck:
Main> quickCkeck propReverseReverse
OK, 100 tests passed

и - вот он, момент истины! - QuickCheck сгенерил 100 случайных списков, на которых проверил данное свойство и поскольку оно всегда выполнилось - выдал OK.

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

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

На предстоящей встрече Spb Haskell User Group , как раз ожидается доклад по QuickCheck от Дмитрия Тимофеева ([info]dtim), который, думаю, будет весьма интересно послушать, при этом уточнив пока неясные для меня моменты.

В общем, весьма любопытная штука и немного необычный (по крайней мере для меня) подход к тестированию, который отлично работает в условиях отсутствия побочных эффектов и превращает процесс тестирования в весьма увлекательный процесс размышления над свойствами своей программы. Изначально QuickCheck был написан для Haskell и активно там используется, но поиск в гугле выдал и порт для Erlang .

Метки: , ,

Настроение:
geeky geeky
* * *
Что же, в прошлый раз мы вспомнили формы записи операторов и рассмотрели написание простого вычислителя постфиксных выражений на Haskell. Следующим шагом является создание транслятора выражений из инфиксной формы - в префиксную. Однако, перед этим нам необходимо улучшить разбор выражения на токены, поэтому в данной статье мы рассмотрим монадические комбинаторные парсеры на примере модуля Parsec, а также использование их на практике.

Haskell postfix: часть вторая. Комбинаторные парсеры Parsec. )

Метки: , ,

* * *
Недавно я встретил упоминание ещё об одном сайте, предлагающем разные математические и программистские задачи. Это Sphere Online Judge (http://spoj.pl). От популярного нынче "Проекта Эйлера" (http://projecteuler.net) отличается тем, что вводятся не ответы на задачи, а на сервер загружается сам код, который там компилируется и запускается на тестовых примерах. Решение одной из задач этого контеста привело к довольно интересным для меня результатам, о которых я решил написать небольшой цикл статей.

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

Содержание статей будет примерно таким:
1. Формы записи операторов (инфиксная, префиксная, постфиксная). Реализация на языке Haskell простого вычислителя арифметических выражений, записанных в постфиксной форме.
2. Преобразование инфиксной формы в постфиксную. Алгоритм "сортировочная станция" Дейкстры. Транслятор на Haskell. Использование комбинаторных парсеров Parsec для разбора выражения.
3. Реализация более полного эвалуатора, вычисляющего как арифметические выражения, так и функции.
4. Переход от вычисления значения выражения к вычислению типа выражения. Последствия в виде использования в реальной жизни для вывода типов выражения в ActionScript 3.

Тех, кому интересно - прошу к прочтению первой части :)

Haskell Postfix: часть первая. Операторы. Вычислитель постфиксных выражений на Haskell. )

Метки: , ,

* * *

Реклама