авторефераты диссертаций БЕСПЛАТНАЯ БИБЛИОТЕКА РОССИИ

КОНФЕРЕНЦИИ, КНИГИ, ПОСОБИЯ, НАУЧНЫЕ ИЗДАНИЯ

<< ГЛАВНАЯ
АГРОИНЖЕНЕРИЯ
АСТРОНОМИЯ
БЕЗОПАСНОСТЬ
БИОЛОГИЯ
ЗЕМЛЯ
ИНФОРМАТИКА
ИСКУССТВОВЕДЕНИЕ
ИСТОРИЯ
КУЛЬТУРОЛОГИЯ
МАШИНОСТРОЕНИЕ
МЕДИЦИНА
МЕТАЛЛУРГИЯ
МЕХАНИКА
ПЕДАГОГИКА
ПОЛИТИКА
ПРИБОРОСТРОЕНИЕ
ПРОДОВОЛЬСТВИЕ
ПСИХОЛОГИЯ
РАДИОТЕХНИКА
СЕЛЬСКОЕ ХОЗЯЙСТВО
СОЦИОЛОГИЯ
СТРОИТЕЛЬСТВО
ТЕХНИЧЕСКИЕ НАУКИ
ТРАНСПОРТ
ФАРМАЦЕВТИКА
ФИЗИКА
ФИЗИОЛОГИЯ
ФИЛОЛОГИЯ
ФИЛОСОФИЯ
ХИМИЯ
ЭКОНОМИКА
ЭЛЕКТРОТЕХНИКА
ЭНЕРГЕТИКА
ЮРИСПРУДЕНЦИЯ
ЯЗЫКОЗНАНИЕ
РАЗНОЕ
КОНТАКТЫ


Pages:     | 1 |   ...   | 9 | 10 ||

«Учебник по Haskell Антон Холомьёв Книга зарегистрирована под лицензией Creative Commons Attribution-NonCommercial-NoDerivs 3.0 Generic license (CC BY-NC-ND 3.0), 2012 год. Вы можете ...»

-- [ Страница 11 ] --

*Main out $ instr 15 $ hn x Сыграем канон. Канон это когда одна и та же мелодия ведётся в разных голосах с запаздыванием. Сыграем двухголосный канон:

*Main out $ instr 80 (loop 3 x) =:= delay 2 (instr 65 $ low $ loop 3 x) Номера инструментов можно посмотреть по справке к протоколу General Midi. Это дополнение к прото колу midi определяет какие номера каким инструментам должны соответствовать. Звучит ужасно, но звучит!

21.5 Пример Опираясь на примитивы композиции, которые мы определил в модуле Score, мы можем написать мело дию. Ниже приведён небольшой пример. Инструменты:

closedHiHat = drum 42;

rideCymbal = drum 59;

cabasa = drum 69;

maracas = drum 70;

tom = drum 45;

flute = instr 73;

piano = instr 0;

Ударная секция:

b1 = bam b0 = bam drums1 = loop 80 $ chord [ tom $ line [qn b1, qn b0, hnr], maracas $ line [hnr, hn b0] ] drums2 = quieter 20 $ cabasa $ loop 120 $ en $ line [b1, b0, b0, b0, b0] drums3 = closedHiHat $ loop 50 $ en (line [b1, loop 12 wnr]) drums = drums1 =:= drums2 =:= drums Уже сейчас мы можем загрузить эту партию в интерпретатор и послушать, вызвав out drums. Аккорды к мелодии:

c7 = chord [c, e, b] gs7 = chord [low af, c, g] g7 = chord [low g, low bf, f] harmony = piano $ loop 12 $ lower 1 $ bn $ line [bn c7, gs7, g7] Мелодия:

ac = louder mel1 = bn $ line [bnr, subMel, ac $ stretch (1+1/8) e, c, subMel, enr] where subMel = line [g, stretch 1.5 $ qn g, qn f, qn g] mel2 = loop 2 $ qn $ line [subMel, ac $ bn ds, c, d, ac $ bn c, c, c, wnr, subMel, ac $ bn g, f, ds, ac $ bn f, ds, ac $ bn c] where subMel = line [ac ds, c, d, ac $ bn c, c, c] mel3 = loop 2 $ line [pat1 (high c) as g, pat1 g f d] where pat1 a b c = line [pat a, loop 3 qnr, wnr, pat b, qnr, hnr, pat c, qnr, hnr] pat x = en (x +:+ x) mel = flute $ line [mel1, mel2, mel3] Пример | Добавим в конце звук тарелки:

cha = delay (dur mel1 + dur mel2) $ loop 10 $ rideCymbal $ delay 1 b Соберём всё вместе и послушаем:

res = chord [ drums, harmony, high mel, louder 40 cha, rest 0] main = out res В конце стоит фиктивный элемент rest 0 для того чтобы было удобно глушить инструменты комменти рованием.

21.6 Эффективное представление музыкальной нотации Реализация, которую мы рассмотрели не эффективна, Мы могли бы определить тип Track и по-другому.

Мы очень часто пользуемся операцией delay через операцию line. Так в выражении:

q = line [s1, s2, line [loop 2 s3, s4], s5] Мы будем несколько раз обходить элемент s3 для каждого применения line. К примеру сначала мы смести все элементы на 3, потом сместим на 5, потом на 10, но вместо этого мы могли бы сразу сместить все элементы на 18 за один проход. Для этого мы можем закодировать преобразования событий во времени в типе Track:

data Track t a = Track { trackDur :: t, trackEvents :: TList t a data TList t a = Empty | Single a | Append (TList t a) (TList t a) | TFun (Tfm t) (TList t a) data Tfm t = Tfm !t !t Тип TList позволяет проводить быстрое объединение списков. Дополнительный конструктор TFun обо значает линейное преобразование списка во времени. Линейное преобразование кодируется двумя числами, это масштаб и смещение. Мы считаем, что события в конструкторе Single начинаются в момент времени и длятся 1 единицу времени. Так например событие, которое произошло на 2 единице времени и длилось единицы можно представить так:

TFun (4 2) (Single a) Значение Tfm k d обозначает линейную функцию f (x) = kx + d Для того чтобы получить настоящие отсчёты по времени мы применяем её к временным координатам “не преобразованного” события, то есть события Event 0 1 a.

Единственное, что нам нужно для того чтобы встроить этот вариант в библиотеку это написать функцию:

fromTList :: TList t a - [Event t a] И конечно переопределить все функции композиции. Но все сложные функции, которые отвечают за перевод из Track в Midi останутся прежними.

21.7 Краткое содержание В этой главе мы построили секвенсор для создания midi-файлов. Мы воспользовались библиотекой HCodecs и создали над ней небольшую надстройку.

В нашей библиотеке примитивными конструкциями были события, параллельная композиция (одновре менное воспроизведение) и преобразование событий во времени (сдвиг и масштабирование). Все остальные операции выражались через эти простейшие операции. Отметим, что есть и другие подходы. Например в биб лиотеках Haskore и Euterpea примитивными конструкциями является единичное событие (без отметок во времени) и параллельная и последовательная композиции. Подход, который мы рассмотрели в более общем виде реализован в библиотеках temporal-music-notation и temporal-music-notation-demo.

318 | Глава 21: Музыкальный пример 21.8 Упражнения • Попробуйте написать какую-нибудь мелодию.

• Подумайте каких операций не хватает. Например было бы удобно иметь возможность вырезать из ме лодии куски. Так в примере у нас остались хвосты от ударной секции, определите операцию, которая позволяет убрать лишнее.

Упражнения | Приложения 320 | Приложения Начало работы с Haskell Компилятор Для программирования в Haskell нам понадобится компилятор. Мы будем пользоваться наиболее разви тым компилятором – GHC. Лучше всего устанавливать его вместе с Haskell Platform:

http://hackage.haskell.org/platform/ Haskell Platform содержит стабильную версию компилятора и много хороших, проверенных временем библиотек. Если по каким-то причинам установить Haskell Platform не удалось. Не отчаивайтесь, можно загрузить компилятор с сайта GHC:

http://www.haskell.org/ghc/ И далее установить все необходимые библиотеки с Hackage с помощью cabal (устанавливается отдельно с http://www.haskell.org/cabal/).

Среда разработки Для Haskell существует очень мало сред разработки. Обычно на Haskell программируют в каких-нибудь продвинутых текстовых редакторах (vim, Emacs, scite, kate, notepad++). Отметим всё же среду разработки Leksah (http://leksah.org/), она написана на Haskell и её можно установить с Hackage.

Если вы не хотите разбираться с новым текстовым редактором или средой разработки, и вам нужна лишь подсветка синтаксиса можно воспользоваться gedit. Пишем код в gedit, сохраняем, переключаемся на ghci, пробуем, обновляем, пробуем, при случае компилируем или собираем в пакет. Всё это можно делать и в gedit.

Начало работы с Haskell | Литература О Haskell написано много интересных книг и статей, но все они на английском. На русском языке выходит электронный журнал “Практика функционального программирования” (). Пока в нём доминируют два языка – это Erlang и Haskell.

Я бы хотел рассказать о тех книгах и статьях, которые мне помогли. Все они приняли активное участие в создании этой книги.

Книги • Miran Lipovaca. Learn You A Haskell For A Great Good.

Очень хорошая книга для начинающих, Haskell в картинках. Весёлая и познавательная книга http://learnyouahaskell.com/ • Hal Daume III. Yet Another Haskell Tutorial.

Ещё одна очень хорошая книга для начинающих. Без картинок, но всё по делу.

• Paul Hudak. Haskell School of Expression.

Книга, которая иллюстрирует основные принципы функционального программирования на примере Haskell. Главные достоинства – много текста об общих принципах и интересные приложения, картинки, музыка, анимация, управление роботами и всё это на Haskell.

• Paul Hudak. Haskell School of Music.

Пол Хьюдак увлекается не только Haskell, но и музыкой. Он написал книгу, которая целиком посвящена описанию музыки в Haskell:

http://www.cs.yale.edu/homes/hudak/Papers/HSoM.pdf http://haskell.cs.yale.edu/ • Bryan O’Sullivan, Don Stewart, John Goerzen. Real World Haskell.

Очень полезная книга в помощь тем, кто хочет научиться писать настоящие, серьёзные программы.

Авторы подробно изучают вопросы, связанные с применением Haskell на практике.

http://book.realworldhaskell.org/ • Готовится к выходу к книга Саймона Марлоу о параллельных вычислениях в Haskell. Обещает быть очень интересной, уже известно, что книга будет доступна в интернете.

Тематический сборник Основы • John Hughes. Why Functional Programming Matters.

• Paul Hudak, John Hughes, Simon Peyton Jones, Philip Wadler. A History of Haskell: Being Lazy With Class.

• Mark P. Jones. Functional Programming with Overloading and Higher-Order Polymorphism.

• Евгений Кирпичев. Элементы функциональных языков программирования, журнал Практика функци онального программирования.

• Simon Thompson. Programming It in Haskell.

• Justin Bailey. Haskell Cheat Sheet.

Разработка программ сверху-вниз • Дмитрий Астапов. Давно не брал я в руки шашек, журнал Практика функционального программиро вания.

Обновление: книга переведена на русский, вышла в издательстве ДМК Пресс.

322 | Приложения Функторы и монады • Conor McBride, Ross Paterson. Applicative programming with effects. Статья об аппликативных функторах.

• Philip Wadler. The Essence of Functional Programming.

Статья, в которой впервые зашла речь о применении монад в Haskell.

• Tarmo Uustalu, Varmo Vene. The Essence of Dataflow Programming.

Статья о комонадах, но есть много интересного и о монадах.

• Bulat Ziganshin. Haskell I/O inside: Down the Rabbit’s Hole. Статья на HaskellWiki.

• John Launchbury, Simon Peyton Jones. Lazy functional state threads.

Статья о типе ST.

• Simon Peyton Jones. Tackling the Awkward Squad: monadic input/output, concurrency, exceptions, and foreign-language calls in Haskell.

Ленивые вычисления • Douglas McIlroy. Power Series, Power Serious.

• Дмитрий Астапов. Реурсия+мемоизация=динамическое программирование, журнал Практика функ ционального программирования.

• Сергей Зефиров. Лень бояться, журнал Практика функционального программирования.

• Jerzy Karczmarczuk. Specific “scientific” data structures, and their processing.

Структурная рекурсия • Graham Hutton. A tutorial on the universality and expressiveness of fold • Jeremy Gibbons. Origami Programming.

• Jeremy Gibbons, Geraint Jones. The Under-Appreciated Unfold.

Лямбда-исчисление и функциональное программирование • Шалак В.И. Шейнфинкель и комбинаторная логика.

• Paul Hudak: Conception, Evolution, and Application of Functional Programming Languages.

Длинная статья о развитии функциональных языков. Там есть главы о лямбда-исчислении.

• Бенджамин Пирс. Типы в языках программирования.

Большая книга о теории типов.

http://newstar.rinet.ru/~goga/tapl/ • Денис Москвин. Системы типизации лямбда-исчисления.

Курс видео-лекций.

http://www.lektorium.tv/course/?id= • John Harrison. Introduction to Functional Programming.

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

• А. Филд, П. Харрисон, Функциональное программирование, Москва “Мир”, 1993.

Большая книга для читателей, всерьёз заинтересовавшихся функциональным программированием.

Прочитав её, вы сможете не только пользоваться ФП-языками но и написать такой язык самостоя тельно.

• Rinus Plasmeijer and Marko van Eekelen. Functional Programming and Parallel Graph Rewriting.

В этой книге исследуются вопросы распараллеливания функциональных программ, построение ком пиляторов для функциональных языков.

Литература | Теория категорий Две очень хорошие книги для начинающих:

• Maarten M. Fokkinga. Gentle Introduction to Category Theory.

Также где-то в сети есть и перевод на русский.

• Steve Awodey. Category Theory.

• Eugenia Cheng, Simon Willerton aka TheCatsters. Курс видео-лекций на youtube.

http://www.scss.tcd.ie/Edsko.de.Vries/ct/catsters/linear.php http://www.youtube.com/user/TheCatsters Статьи по категориальным типам:

• Varmo Vene. Categorical Programming with Inductive and Coinductive Types. Phd-диссертация.

• Erik Meijer, Graham Hutton. Bananas in Space: Extending Fold and Unfold to Exponential Types.

• Martin Erwig. Categorical Programming with Abstract Data Types.

• Martin Erwig. Metamorphic Programming: Structured Recursion for Abstract Data Types.

Практика • Conal Elliott. Denotational design with type class morphisms.

• Johan Tibell. High Performance Haskell. Слайды с выступления.

• Johan Tibel. Faster persistent data structures through hashing. Слайды с выступления.

• Simon Marlow. Parallel and Concurrent Programming in Haskell.

• Edward Z. Yang. Блог о Haskell в картинках. Много полезной информации о лени и устройстве ghc.

http://blog.ezyang.com/about/ • Oleg Kiselyov. Блог в том числе и о Haskell. Много решений интересных и нетривиальных задач. http:

//okmij.org/ftp/ Как работает GHC • Документация GHC:

http://hackage.haskell.org/trac/ghc/wiki/Commentary • Don Stewart. Multi-paradigm Just-In-Time Compilation. BS Thesis, 2002.

Автор пробует компилировать Haskell-код в Java-код. При этом очень доступно объясняются внутрен ности STG.

• Simon Marlow, Simon Peyton Jones. The Glasgow Haskell Compiler. The Architecture of Open Source Application, Volume 2, 2012.

• Simon Marlow, Simon Peyton Jones. Making a Fast Curry: Push/Enter vs. Eval/Apply for Higher-order Languages. ICFP’04.

• Simon Peyton Jones. Implementing lazy functional languages on stock hardware: the Spineless Tagless G machine.

• Simon Marlow, Tim Harris, Roshan P. James, Simon Peyton Jones. Parallel Generational-Copying Garbage Collection with a Block-Structured Heap. ISMM’08.

• Simon Peyton Jones, Andre Santos. A transformation-based optimizer for Haskell. Science of computer programming, 1998.

324 | Приложения • Simon Peyton Jones, John Launchbury. Unboxed values as first citizens in a non-strict functional programming language. 1991.

• Simon Marlow, Simon Peyton Jones. Secrets of Glasgow Haskell Compiler inliner. Статья о тонкостях реализации прагмы INLINE.

• Simon Peyton Jones, Andrew Tolmach, Tony Hoare. Playing by the Rules, ICFP Статья о прагме RULES.

Встроенные проблемно-ориентированные языки (EDSL) • Oleg Kiselyov. Implementing Explicit and Finding Implicit Sharing in EDSLs.

Чистое решение проблемы поиска дублирующих подвыражений.

• Andy Gill. Type-Safe Observable Sharing in Haskell.

Решение проблемы поиска дублирующих подвыражений с помощью расширения GHC, позволяющего проводить сравнение термов по указателям.

• Conal Elliott, Sigbjorn Finne, Oege de Moor. Compiling Embedded Languages.

Отчёт о построении EDSL для анимации.

• Bruno C.d.S. Oliveira, Andres Loh. Abstract Syntax Graphs for Domain Specific Languages.

Применение графов для кодирования дублирующих подвыражений в EDSL.

• Jacques Carette, Oleg Kiselyov and Chung-chieh Shan. Finally Tagless, Partially Evaluated. Tagless Staged Interpreters for Simpler Typed Languages.

Построение расширяемого синтаксиса с помощью классов типов.

• Wouter Sweistra. Data types a la carte.

Построение расширяемых типов. В этой статье и выше под словом “расширяемый” понимается возмож ность добавления к типу новых конструкторов без перекомпиляции старых.

И все-все-все Если вдруг у вас возникли вопросы по Haskell, и рядом с вами не оказалось того, кто мог бы на них ответить, и в книгах нет ответа, вы можете спросить у сообщества Haskell, в haskell-cafe, там вам быстро и с радостью ответят:

http://www.haskell.org/mailman/listinfo/haskell-cafe Сообщество Haskell славится радушием и терпимостью к начинающим. Там много информации о выпус ках новых библиотек, конференциях, обучающих программах и просто разговоры о том-о-сём.

Также стоит отметить журнал Monad.Reader:


http://themonadreader.wordpress.com/ Литература | Обзор Hackage Число пакетов, загруженных на Hackage, уже перевалило за 2000. В Hackage легко заблудиться. Очень часто не разберёшься какой из пакетов выбрать. К тому же многие из них заброшены или просто не подходят для использования в серьёзных приложениях. Но среди них есть и очень хорошие пакеты. Некоторые из них включены в Haskell Platform. Ниже приведён тематический обзор наиболее популярных пакетов.

Стандартные библиотеки Все приведённые в этом подразделе библиотеки включены в Haskell Platform.

Полный список библиотек для Haskell Platform можно посмотреть на сайте http://lambda.haskell.

org/hp-tmp/docs.

• Начало-всех-начал: base Библиотека включает в себя все стандартные определения, например модули Prelude, Data.List, Control.Monad и многие другие.

• Стандартные монады: transformers, mtl Включает монады State, Writer, Reader и другие.

• Контейнеры: containers Ассоциативные массивы, множества, последовательности, деревья.

• Массивы: array • Графы: fgl • Архиваторы: zlib • Вычисление по значению: deepseq Обычная функция seq, позволяет привести данное выражение к слабой заголовочной нормальной фор ме, если нам всё же необходимо вычислить значение полностью, мы можем воспользоваться функцией deepseq из одноимённой библиотеки.

• Параллельное программирование: stm и parallel • Временная арифметика, календарь: time • Парсинг: parsec • Регулярные выражения: regex-base, regex-posix • Построение структурированного текста: pretty • Тестирование программ: HUnit, QuickCheck • Управление файловой системой: directory • Работа с путями к файлам/директориям: filepath • Сетевые библиотеки: network, HTTP, cgi.

• 3д Графика: OpenGL, GLUT.

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

326 | Приложения Эффективные типы данных • Списки: dlist – эффективное объединение списков.

Если вы часто пользуетесь операцией ++, то необходимо заботиться о том, чтобы скобки всегда группи ровались вправо. Как в a++(b++(c++d)). Иначе время объединения из линейного превратится в квад ратичное. Библиотека dlist предоставляет специальный тип списков, для которых не важно как груп пируются скобки при объединении. Время объединения всегда будет линейным.

• Строки: bytestring Если ваша программа загружена обработкой строк, и работает слишком медленно, рассмотрите вари ант перехода со стандартных строк на тип ByteString, это может увеличить быстродействие на поря док.

• Текст: text или utf8-string Работа с текстом в формате Unicode. Часто проблемы возникают при необходимости обработки рус ского текста закодированного в Unicode. Для решения этой проблемы можно воспользоваться одной из этих библиотек.

• Двоичные данные: binary или cereal – Сериализация/десериализация данных.

• Случайные числа: mersenne-random-pure Эффективный генератор случайных чисел.

• Ввод-вывод: iteratee Эффективная реализация ввода-вывода. Если вам нужно читать или писать данные из большого числа файлов, эта библиотека может существенно помочь.

• Контейнеры: unordered-containers Альтернатива стандартной библиотеке containers. Эффективные типы Map и Set.

• Последовательности: fingertree, seq Используются для работы с очередями различного типа.

• Массивы: vector Эффективный тип для представления массивов. Замена стандартному типу Data.Array.

• Самые эффективные изменяемые хэш-таблицы: hashtables • Матрицы: hmatrix, repa Разработка программ • Тестирование, проверка инвариантов: QuickCheck • Оценка быстродействия: criterion • Просмотр Core в человеческом виде: ghc-core • Настройка сборки мусора: ghc-gc-tune • Трассировка программ: hat И все-все-все • Парсинг: parsec или attoparsec • Языки разметки: pandoc, xhtml, tagsoup, blaze-html, html • XML: xml, HaXml • JSON: json, aeson • Web: happstack, snap, yesod, hakyll • Сетевые библиотеки: network, HTTP, cgi, curl • Графика: diagrams, gnuplot, SDL Обзор Hackage | • 3д графика: OpenGL, GLFW, GLUT • Базы данных: HDBC • Встраиваемые приложения реального времени с жёсткими ограничениями: atom • GUI: wxHaskell, gtk2hs • Оценка производительности программ: criterion • Статистика: statistics • Парсинг и генерация кода Haskell: haskell-src-exts • FRP: reactive, reactive-banana, yampa • Линейная алгебра: vector-space, hmatrix 328 | Приложения Места Где культивируется Haskell?

Университеты Посмотрим на университеты, в которых Haskell преподают, развивают и применяют:

• Британия: Эдинбург, Ноттингем, Оксфорд (лаборатория информатики), Глазго.

• Америка: Йельский, Коннектикут, Техас, Оклахома, Портлэнд, Канзас • Нидерланды: Утрехт • Швеция: Технологический Чалмерса, Гёттинген.

• Австралия: Новый Южный Уэльс, Западной Австралии • и другие, полный список на http://www.haskell.org/haskellwiki/Haskell_in_education.

Компании • Microsoft Research – разрабатывают GHC.

• Galios – ведут исследования и решают практические задачи на ФП-языках, особенно на Haskell.

• Well-Typed – решают практические задачи, консультируют и всё на Haskell. Также занимаются органи зацией Haskell-слётов, поддержкой стандартных библиотек.

• и другие, полный список на http://www.haskell.org/haskellwiki/Haskell_in_industry Места |

Pages:     | 1 |   ...   | 9 | 10 ||
 





 
© 2013 www.libed.ru - «Бесплатная библиотека научно-практических конференций»

Материалы этого сайта размещены для ознакомления, все права принадлежат их авторам.
Если Вы не согласны с тем, что Ваш материал размещён на этом сайте, пожалуйста, напишите нам, мы в течении 1-2 рабочих дней удалим его.