2015-07-29 04:06:38 +00:00
# Как познать Haskell
2015-08-07 08:47:46 +00:00
Этот документ — рекомендованный путь к изучению языка Haskell, основанный на опыте помощи другим.
2015-07-29 04:06:38 +00:00
2015-07-29 05:49:43 +00:00
## Это руководство доступно на других языках:
2015-07-29 04:06:38 +00:00
* [In English ](README.md )
* [Auf Deutsch ](guide-de.md )
<!-- * [Στην ελληνική ](guide-el.md ) -->
* [En Español ](guide-es.md )
* [En Français ](guide-fr.md )
* [In Italiano ](guide-it.md )
* [Em Português ](guide-pt.md )
* [繁體中文 ](guide-zh_tw.md )
2017-04-06 21:33:11 +00:00
* [Srpski ](guide-sr.md )
2019-01-12 19:24:05 +00:00
* [Sa Tagalog ](guide-tl.md )
2015-07-29 14:57:23 +00:00
#### *Н е мучайтесь над одним топиком, который вы не можете понять сразу*. Двигайтесь дальше!
2015-07-29 04:06:38 +00:00
## Сообщество
IRC канал `#haskell-beginners` на Freenode.
2015-08-07 08:47:46 +00:00
[IRC веб-клиент ](http://webchat.freenode.net/ ).
2015-07-29 04:06:38 +00:00
[Почтовые рассылки ](https://wiki.haskell.org/Mailing_lists ).
2015-07-29 05:49:43 +00:00
### Политика сообщества
2015-08-07 09:12:30 +00:00
[Смотрите пост про обучение от Криса Дона ](http://chrisdone.com/posts/teaching ).
2015-07-29 05:49:43 +00:00
Будьте дружелюбны и вежливы. Грубость и хамство испугает собеседника
2015-07-29 14:57:23 +00:00
и оттолкнет от участия в общении.
2015-07-29 05:49:43 +00:00
Слабая, неконструктивная критика удовлетворяет лишь
критикующего, но не помогает критикуемому.
2015-08-07 08:33:44 +00:00
Н е описывайте вещи как «легкие» или «тривиальные».
2015-07-29 05:49:43 +00:00
Вы заставляете людей чувствовать себя ужасно за то,
что они усердно и много работают ради своего прогресса.
2015-07-29 14:57:23 +00:00
Медленные в обучении люди зачастую самые дотошные,
2015-07-29 05:49:43 +00:00
этому наоборот надо радоваться!
Н е симулируйте удивление. Н е изображайте удивление, когда кто-либо
2015-07-29 14:57:23 +00:00
говорит, что он не знает что-то. Он будут чувствовать себя ужасно,
2015-07-29 05:49:43 +00:00
а вы не получите ничего, кроме резкости.
2015-08-07 08:47:46 +00:00
«Ну, на самом деле». Когда кто-либо говорит что-то почти — но не совсем — верное,
2015-08-07 08:33:44 +00:00
а вы говорите «ну, на самом деле...» и даете лишь мелкую правку.
2015-07-29 05:49:43 +00:00
Это особенно раздражает, когда поправка не относится к основной
теме разговора. Это не значит,
что этот канал не про поиск правды или что нам все равно на точность.
2015-08-07 08:33:44 +00:00
Просто почти все «ну, на самом деле» являются показухой, а не поиском правды.
2015-07-29 05:49:43 +00:00
Н е делайте всю работу за обучающегося.
2015-08-12 21:04:02 +00:00
Если вы видите, что человек работает над проблемой,
вы не должны немедленно выдавать советы или готовые решения.
2015-07-29 05:49:43 +00:00
Дайте ему поработать и поизучать,
пока он сам не попросит помощи.
2015-08-07 07:20:18 +00:00
Избегать помех — [одна из основных причин существования #haskell-beginners ](http://chrisdone.com/posts/teaching ).
2015-07-29 05:49:43 +00:00
Никаких -измов. Расизм, сексизм, гомофобия,
трансофобия и другие виды фобий не приветствуются и не будут приняты терпимо.
---
[Правила хорошего тона от Recurse Center ](https://www.recurse.com/manual ). Спасибо за их публикацию Recurse Center.
# Что такое Haskell, GHC и Cabal?
2015-08-07 07:20:18 +00:00
Haskell — это язык программирования, изложенный в спецификациях,
2015-07-29 14:57:23 +00:00
последняя версия которых опубликована в 2010 году.
2015-07-29 05:49:43 +00:00
Эта спецификация доступна как [онлайн-документ ](http://www.haskell.org/onlinereport/haskell2010/ ).
## GHC
2015-08-07 07:20:18 +00:00
[GHC ](http://www.haskell.org/ghc/ ) — это самый популярный способ работы с языком Haskell. Он включает в себя компилятор, REPL (интерпретатор), пакетный менеджер и другие полезные вещи.
2015-07-29 05:49:43 +00:00
## Cabal
2015-07-29 14:57:23 +00:00
[Cabal ](https://www.haskell.org/cabal/download.html ) позволяет управлять проектами и разрешает зависимости.
При помощи него вы устанавливаете и создаете проекты, обычно в песочницу (изолированное окружение).
2015-07-29 05:49:43 +00:00
Cabal аналогичен Bundler в Ruby, pip в Python, NPM в Node и так далее. GHC управляет пакетами сам, Cabal решает какие версии устанавливать.
2015-07-29 07:05:01 +00:00
# Установка Haskell
## Н Е УСТАНАВЛИВАЙТЕ HASKELL PLATFORM
Вместо следования инструкциям на Haskell.org, смотри инструкции ниже, как установить GHC и Cabal.
2015-07-29 05:49:43 +00:00
# Установка GHC и Cabal
## Ubuntu
2015-07-29 14:57:23 +00:00
[Этот PPA ](http://launchpad.net/~hvr/+archive/ghc ) лучший, и именно е г о я использую на
2015-07-29 05:49:43 +00:00
всех моих серверах и локальных машинах с Linux.
А именно:
```bash
$ sudo apt-get update
$ sudo apt-get install python-software-properties # v12.04 and below
$ sudo apt-get install software-properties-common # v12.10 and above
$ sudo add-apt-repository -y ppa:hvr/ghc
$ sudo apt-get update
$ sudo apt-get install cabal-install-1.22 ghc-7.8.4 happy-1.19.5 alex-3.1.4
```
2015-08-07 08:47:46 +00:00
После этого, добавьте следующие пути к вашему `$PATH` (bash\_profile, zshrc, bashrc, и т. п.):
2015-07-29 05:49:43 +00:00
```
export PATH=$PATH:~/.cabal/bin:/opt/cabal/1.22/bin:/opt/ghc/7.8.4/bin:/opt/happy/1.19.5/bin:/opt/alex/3.1.4/bin
```
*Опционально:* вы можете добавить также `.cabal-sandbox/bin` к вашему пути.
2015-07-29 14:57:23 +00:00
Код, который вы разрабатываете, будет доступен вам из командной строки.
2015-08-07 07:20:18 +00:00
Это работает только тогда, когда ваша текущая рабочая папка — песочница cabal.
2015-07-29 05:49:43 +00:00
2015-07-29 06:25:05 +00:00
## Debian
2015-07-29 05:49:43 +00:00
2015-07-29 06:25:05 +00:00
### Использование Ubuntu PPA
2015-07-29 05:49:43 +00:00
2015-08-12 21:04:02 +00:00
Если вы не используете стабильный дистрибутив, вы можете повторить все те же шаги,
2015-07-29 06:25:05 +00:00
что и для Ubuntu, но вам надо будет выполнить дополнительную команду.
Сразу после `sudo add-apt-repository -y ppa:hvr/ghc` выполните:
```bash
$ sudo sed -i s/jessie/trusty/g /etc/apt/sources.list.d/hvr-ghc-jessie.list
```
Для остальных версий Debian, просто замените все `jessie` именем вашей версии в команде выше.
Если по какой-то причине файл `/etc/apt/sources.list.d/hvr-ghc-jessie.list`
не существует, то `/etc/apt/sources.list` должен содержать строку с о ссылкой вроде этой:
deb http://ppa.launchpad.net/hvr/ghc/ubuntu jessie main
Замените `jessie` на `trusty` в этой строке.
### Сборка из исходников
Вы можете использовать
2017-04-20 14:22:51 +00:00
[это руководство ](http://www.davesquared.net/2014/05/platformless-haskell.html ), написанное для Mac OS X:
2015-07-29 06:25:05 +00:00
Замечания:
- Выставьте ваш префикс соответственно, когда конфигурируете ghc.
- Вместо того, чтобы забирать бинарник `cabal-install` , скачайте исходный код и запустите скрипт `bootstrap.sh` .
## Fedora 21
2015-08-12 21:04:02 +00:00
Чтобы установить Haskell 7.8.4 из неофициального репо (Fedora 22+ будут содержать е г о в официальном):
2015-07-29 06:25:05 +00:00
```bash
$ sudo yum-config-manager --add-repo \
> https://copr.fedoraproject.org/coprs/petersen/ghc-7.8.4/repo/fedora-21/petersen-ghc-7.8.4-fedora-21.repo
$ sudo yum install ghc cabal-install
```
Как указано на странице
[petersen/ghc-7.8.4 ](https://copr.fedoraproject.org/coprs/petersen/ghc-7.8.4/ )
этот ghc не может быть установлен вместе с Fedora/EPEL ghc.
## Arch Linux
Чтобы установить Haskell из официального репо на Arch Linux, выполните:
```bash
$ sudo pacman -S cabal-install ghc happy alex haddock
```
## Gentoo
Н а Gentoo вы можете установить индивидуальные компоненты Haskell Platform через Portage.
Если вы используете `ACCEPT_KEYWORDS=arch` (вместо `ACCEPT_KEYWORDS=~arch` ),
2022-01-25 17:35:54 +00:00
Portage установит древние версии различных компонент Haskell. Помня это, если вы используете `ACCEPT_KEYWORDS=arch` , добавьте следующие строки в `/etc/portage/package.accept_keywords` .
2015-07-29 06:25:05 +00:00
2022-01-25 17:35:54 +00:00
dev-haskell/cabal-install ~arch
dev-lang/ghc ~arch
2015-07-29 06:25:05 +00:00
Как только это сделано,
```bash
$ emerge -jav dev-lang/ghc dev-haskell/cabal-install
```
2015-08-07 08:47:46 +00:00
Gentoo хранит «стабильную» (читай «старую») версию `cabal-install` в дереве Portage, так что, если вы хотите использовать более современную версию `cabal-install` , выполните (заметьте, что слеши здесь нужны)
2015-07-29 06:25:05 +00:00
```bash
$ \cabal update # Слеши здесь
$ \cabal install cabal-install # нужны
```
Вы установили cabal глобально через Portage и локально в вашей домашней директории с `cabal-install` .
Следующий шаг, это убедиться, что когда вы запускаете `cabal` в вашем терминале,
ваша оболочка запускает последнюю версию в вашей домашней директории.
Вам нужно добавить следующие строки к конфигурационному файлу вашей оболочки.
```bash
PATH=$PATH:$HOME/.cabal/bin
alias cabal="$HOME/.cabal/bin/cabal"
```
2015-08-07 07:20:18 +00:00
Если вы не знаете, какая оболочка у вас используется, то скорее всего это Bash. Если это Bash, то файл, в который вам надо добавлять эти строки — `~/.bashrc` . Если вы используете Z-shell, то это `~/.zshrc` . Вы можете понять, какая оболочка у вас используется, запустив:
2015-07-29 06:25:05 +00:00
```bash
echo $SHELL | xargs basename
```
Я использую zsh, так что вывод этой команды у меня выглядит как `zsh` .
После всего этого вы захотите установить дополнительные инструменты `alex` и `happy` .
```bash
$ cabal install alex happy
```
Поздравляю! Теперь у вас рабочий Haskell!
## Mac OS X
### 10.9
Установите [GHC для Mac OS X ](http://ghcformacosx.github.io/ ) приложение,
2015-07-29 14:57:23 +00:00
которое включает в себя GHC и Cabal.
2015-07-29 06:25:05 +00:00
Оно предоставляет инструкции, как добавить GHC и Cabal в ваш путь,
после того как вы скопируете приложение `.app` куда-либо.
2015-08-07 09:12:30 +00:00
### 10.6—10.8
2015-07-29 06:25:05 +00:00
Выполните установку бинарников, которая описана ниже,
для [этого архива ](https://www.haskell.org/platform/download/2014.2.0.0/ghc-7.8.3-x86_64-apple-darwin-r3.tar.bz2 ).
## Windows
- [Минимальный установщик GHC для Windows ](http://neilmitchell.blogspot.com/2014/12/beta-testing-windows-minimal-ghc.html )
2015-08-07 08:47:46 +00:00
способен скомпилировать `network` и т. п. Технически, это бета версия,
2015-07-29 06:25:05 +00:00
но должна работать для тех, кто читает это руководство.
Н е забудьте запустить установщик как администратор, так как он захочет установить файлы в Program Files.
## Пользователям других Linux дистрибутивов
2015-08-07 09:12:30 +00:00
Скачайте последние бинарники Cabal и GHC:
2015-07-29 06:25:05 +00:00
- [GHC ](http://www.haskell.org/ghc/ ).
- [Cabal ](https://www.haskell.org/cabal/download.html ).
## Пользователям других Unix-подобных систем
Скачайте GHC и Cabal из вашего пакетного менеджера,
затем добавьте `~/.cabal/bin` в ваше `$PATH` .
2015-08-12 21:04:02 +00:00
После этого обновите `cabal` и установите дополнительные инструменты `alex` и `happy` .
2015-07-29 06:25:05 +00:00
```bash
$ cabal update
$ cabal install cabal-install alex happy
```
2015-07-29 07:05:01 +00:00
# Как я должен изучать Haskell?
Основная рекомендация, это читать лекции и выполнять все упражнения/домашние задания для Spring 13 версии курса cis194.
2018-05-11 01:26:05 +00:00
Затем то же для курса FP.
2015-07-29 07:05:01 +00:00
Н а о б а курса ссылки представлены ниже.
В с е остальное может быть рассмотрено как опциональное,
и вы просто будете знать куда смотреть по определенной теме.
## К у р с Yorgey cis194
> *Выполните е г о в первую очередь*, это лучший путь получить представление о Haskell
2021-09-29 05:14:09 +00:00
Доступен [онлайн ](https://www.seas.upenn.edu/~cis194/spring13/lectures.html ).
2015-07-29 07:05:01 +00:00
К у р с от [Brent Yorgey ](https://byorgey.wordpress.com ), это лучшее, что я пока нашел.
Этот курс ценен тем, что он не только научит вас писать базовый код на Haskell,
но и также поможет вам понять комбинаторы парсера.
Единственная причина, по которой вам не стоит начинать с курса cis194,
это если вы не программист или вы неопытный программист.
2021-09-29 05:14:09 +00:00
В этом случае, начинайте с [книги от Thompson ](https://www.haskellcraft.com/craft3e/Home.html )
2015-07-29 07:05:01 +00:00
и после этого уже курс cis194.
---
2018-05-11 01:26:05 +00:00
## К у р с FP
2015-07-29 07:05:01 +00:00
> Этот курс мы рекомендуем выполнять после курса Yorgey cis194.
2018-05-11 01:26:05 +00:00
[Доступен на Github ](https://github.com/bitemyapp/fp-course ).
2015-07-29 07:05:01 +00:00
Этот курс укрепит и добавит опыта реализации абстракций,
2015-08-12 21:04:02 +00:00
представленных в курсе cis194.
2015-07-29 07:05:01 +00:00
Эта практика *критически важна* для комфортного использования
2015-08-07 08:47:46 +00:00
в дальнейшем таких абстракций как Functor/Applicative/Monad/и т. п. в Haskell.
2018-05-11 01:26:05 +00:00
Выполнение cis194 и затем FP курсов представляет собой основную рекомендацию моего руководства и того, как научить любого языку Haskell.
2015-07-29 07:05:01 +00:00
---
2018-05-11 01:26:05 +00:00
## Дополнительный курс после cis194 и FP
2015-07-29 07:05:01 +00:00
> Предоставляет больше информации по продвинутым темам
cs240h доступен [онлайн ](http://www.scs.stanford.edu/14sp-cs240h/ ).
2015-08-07 09:12:30 +00:00
Это онлайн курс от [Bryan O’ Sullivan ](https://github.com/bos ), который он преподает в Стенфорде.
2015-07-29 07:17:20 +00:00
Если вы не знаете кто он такой, взгляните на половину библиотек,
от которых зависят все приложения на Haskell, и вы увидите е г о имя в их авторах.
Если вы уже закончили курс Yorgey, о с о б о г о внимания в этом курсе заслуживают разделы о фантомных типах, контроле потоков информации, расширениях языка, конкурентном выполнении, pipes и линзах.
---
# Специфичные топики Haskell
2015-07-29 08:34:29 +00:00
Эти источники не были проверены на учащихся так,
2018-05-11 01:26:05 +00:00
как cis194 и FP, но с их помощью вы поймете с чего начинать изучение определенной темы.
2015-07-29 08:34:29 +00:00
Они включают продвинутые и сложные темы и топики посвященные инструментам и текстовым редакторам.
2015-07-29 07:17:20 +00:00
2015-07-29 08:34:29 +00:00
### Что делает `<-` / `do` / синтаксический с а х а р включения списков?
Отличная [статья ](http://www.haskellforall.com/2014/10/how-to-desugar-haskell-code.html ).
### Для понимания списков и свертки
- [Explain List Folds to Yourself ](http://vimeo.com/64673035 )
### Для изучения некоторых из стандартных классов типов
Полезно для понимания `Functor` , `Applicative` , `Monad` , `Monoid` и других
классов типов в целом, а также немного специфичной для Haskell теории категорий:
- The [Typeclassopedia ](http://www.haskell.org/haskellwiki/Typeclassopedia )
### Понимание базовых сообщений о б ошибках в Haskell
- [Understanding basic error messages ](http://ics.p.lodz.pl/~stolarek/_media/pl:research:stolarek_understanding_basic_haskell_error_messages.pdf )
---
# Laziness, strictness, guarded recursion
- [Книга Marlow ](http://chimera.labs.oreilly.com/books/1230000000929/ch02.html )
про параллелизм и конкаренси содержит одно из лучших представлений laziness
и нормальных форм, которые я нашел. Используйте другие источники, если не поймете
сразу из этого.
- [More points for lazy evaluation ](http://augustss.blogspot.hu/2011/05/more-points-for-lazy-evaluation-in.html )
- [Oh my laziness! ](http://alpmestan.com/posts/2013-10-02-oh-my-laziness.html )
2021-09-29 05:14:09 +00:00
- Вопрос на Stack Overflow — [Does haskell have laziness? ](https://stackoverflow.com/questions/13042353/does-haskell-have-tail-recursive-optimization )
2015-07-29 08:34:29 +00:00
- Слайды [Johan Tibell ](https://github.com/tibbe ) из доклада
[reasoning about laziness ](http://www.slideshare.net/tibbe/reasoning-about-laziness ).
## Краткая демонстрация
```haskell
let a = 1 : a -- guarded recursion, (:) is lazy and can be pattern matched.
let (v : _) = a
> v
1
> head a -- head a == v
1
let a = 1 * a -- not guarded, (* ) is strict
> a
*** Exception: < < loop > >
```
# IO
- [Evaluation order and State tokens ](https://www.fpcomplete.com/user/snoyberg/general-haskell/advanced/evaluation-order-and-state-tokens )
- [Unraveling the mystery of the IO monad ](http://blog.ezyang.com/2011/05/unraveling-the-mystery-of-the-io-monad/ ).
2015-08-07 08:33:44 +00:00
- [First class “statements” ](http://blog.jle.im/entry/first-class-statements ).
2015-07-29 08:34:29 +00:00
- [Haddocks for System.IO.Unsafe.unsafePerformIO ](http://hackage.haskell.org/package/base-4.7.0.1/docs/System-IO-Unsafe.html#v:unsafePerformIO )
2015-07-29 14:57:23 +00:00
При прочтении, обратите внимание на реализацию unsafeDupablePerformIO
2015-07-29 08:34:29 +00:00
2015-07-29 13:33:37 +00:00
Комментарий с обсуждения на Reddit от `glaebhoerl`
Перевод:
2015-08-07 09:12:30 +00:00
<!-- TODO: I don’ t really understand this, so I can’ t translate properly -->
2015-08-12 21:04:02 +00:00
> Интересное замечание: GHC должен скрывать отображение токена статуса
2015-07-29 13:33:37 +00:00
> абстрактного типа IO, потому что токен статуса должен все время быть использован
> линейно (не быть дуплицирован или сброшен), но система типов не может принудительно
2019-06-06 10:52:56 +00:00
> этого делать. Clean, другой ленивый подобный Haskell язык, имеет типы, гарантирующие уникальность
2015-07-29 13:33:37 +00:00
> (которые подобны линейным типам и возможно отличаются, но я не знаю как), и они разкрывают
> передачу в Мир напрямую и предоставляют (не абстрактную) IO монаду только для соблюдения соглашения.
Оригинал:
2015-07-29 08:34:29 +00:00
> Interesting side note: GHC needs to hide the state token representation behind
> an abstract IO type because the state token must always be used linearly (not
2015-08-07 09:12:30 +00:00
> duplicated or dropped), but the type system can’ t enforce this. Clean, another
2015-07-29 08:34:29 +00:00
> lazy Haskell-like language, has uniqueness types (which are like linear types
2015-08-07 09:12:30 +00:00
> and possibly different in ways I’ m not aware of), and they expose the
2015-07-29 08:34:29 +00:00
> World-passing directly and provide a (non-abstract) IO monad only for
> convenience.
2015-07-29 13:33:37 +00:00
# Монады и трансформеры монад
2015-07-29 08:34:29 +00:00
2015-07-29 13:33:37 +00:00
> Н е делайте этого пока вы не поняли классы типов Monoid, Funcor и Applicative!
2015-07-29 08:34:29 +00:00
2015-07-29 13:33:37 +00:00
Реализуйте монады из стандартной библиотеки (List, Maybe, Cont, Error, Reader,
Writer, State) для себя, чтобы понять их лучше. Затем, может быть, напишите
2015-08-06 18:53:05 +00:00
монадный интерпретатор для маленького языка выражений используя документ
2015-07-29 08:34:29 +00:00
[Monad Transformers Step by Step ](http://catamorph.de/documents/Transformers.pdf )
2015-08-07 09:12:30 +00:00
(упомянут в «трансформеры монад» ниже).
2015-07-29 08:34:29 +00:00
2015-08-06 18:53:05 +00:00
Написание многих интерпретаторов просто изменяя монаду для изменения семантики
2015-07-29 13:33:37 +00:00
может помочь лучше понять, что происходит.
2015-07-29 08:34:29 +00:00
2015-08-07 07:20:18 +00:00
Также, реализуйте `Control.Monad` . Функции типа `mapM` или `sequence` — хорошая
2015-07-29 13:33:37 +00:00
возможность попрактиковаться в написании общего кода монад.
2015-07-29 08:34:29 +00:00
2018-05-11 01:26:05 +00:00
К у р с FP может быть использован как руководство для этого, он также включает написание
2015-07-29 13:33:37 +00:00
своего собственного Applicative.
2015-07-29 08:34:29 +00:00
2015-07-29 13:33:37 +00:00
Упоминания:
2015-07-29 08:34:29 +00:00
2021-09-29 05:14:09 +00:00
- [Комментарии ](https://www.reddit.com/r/haskell/comments/29eke6/basic_program_ideas_for_learning_about_monads/cik5aj6 ) на Reddit от htmltyp и Crandom.
2015-07-29 08:34:29 +00:00
2021-09-29 05:14:09 +00:00
- [Комментарий ](https://www.reddit.com/r/haskell/comments/29eke6/basic_program_ideas_for_learning_about_monads/cik5trg ) на Reddit от jozefg.
2015-07-29 08:34:29 +00:00
2015-07-29 13:33:37 +00:00
## Трансформеры монад
2015-07-29 08:34:29 +00:00
- [A gentle introduction to Monad Transformers ](https://github.com/kqr/gists/blob/master/articles/gentle-introduction-monad-transformers.md ).
- [Monad transformers step-by-step ](http://catamorph.de/documents/Transformers.pdf ).
2015-07-29 13:33:37 +00:00
# Тестирование, тесты, спеки, generative/property тестирование
2015-07-29 08:34:29 +00:00
2015-08-07 09:12:30 +00:00
- Это [руководство ](https://github.com/kazu-yamamoto/unit-test-example/blob/master/markdown/en/tutorial.md ) от Kazu Yamamoto — просто фа нта с тичecко е .
2015-07-29 08:34:29 +00:00
2015-07-29 13:33:37 +00:00
- [Simple-Conduit ](https://github.com/jwiegley/simple-conduit ): Хорошая простая
2015-07-29 14:57:23 +00:00
библиотека для изучения, как работает стриминг IO в целом, знания, применимые также
2015-07-29 13:33:37 +00:00
к таким библиотекам как Pipes и Conduit.
2015-07-29 08:34:29 +00:00
2015-07-29 13:33:37 +00:00
# Парсинг в Haskell
2015-07-29 08:34:29 +00:00
2015-07-29 13:33:37 +00:00
- [Руководство по Parser ко мб ина то р y ](https://github.com/JakeWheat/intro_to_parsing )
для Haskell с использованием Parsec
2015-07-29 08:34:29 +00:00
- [Writing your own micro-Parsec ](http://olenhad.me/articles/monadic-parsers/ )
2015-07-29 13:33:37 +00:00
## Парсинг и генерация JSON
2015-07-29 08:34:29 +00:00
2015-08-07 07:20:18 +00:00
Aeson — это стандартное решение для парсинга [JSON ](https://json.org ) в Haskell.
2015-07-29 13:33:37 +00:00
Доступно из [hackage ](https://hackage.haskell.org/package/aeson ) и
2015-07-29 08:34:29 +00:00
[github ](https://github.com/bos/aeson ).
- [Parsing JSON using Aeson ](http://blog.raynes.me/blog/2012/11/27/easy-json-parsing-in-haskell-with-aeson/ )
- [Aeson and user created types ](http://bitemyapp.com/posts/2014-04-11-aeson-and-user-created-types.html )
- [Parsing non-deterministic data with aeson and sum types ](http://bitemyapp.com/posts/2014-04-17-parsing-nondeterministic-data-with-aeson-and-sum-types.html )
- [Aeson tutorial ](https://www.fpcomplete.com/school/starting-with-haskell/libraries-and-frameworks/text-manipulation/json )
2015-07-29 13:33:37 +00:00
# Алгоритмы графов и структуры данных
2015-07-29 08:34:29 +00:00
2015-07-29 13:33:37 +00:00
- [Пакет fgl ](https://hackage.haskell.org/package/fgl ) частично чисто функциональный кратчайший путь
[algos ](http://hackage.haskell.org/package/fgl-5.4.2.2/docs/Data-Graph-Inductive-Query-SP.html ).
2015-07-29 08:34:29 +00:00
- [Inductive graphs and Functional Graph Algorithms ](http://web.engr.oregonstate.edu/~erwig/papers/abstracts.html#JFP01 ).
2015-08-07 07:20:18 +00:00
- [FGL/Haskell — A Functional Graph Library ](http://web.engr.oregonstate.edu/~erwig/fgl/haskell/old/fgl0103.pdf ).
2015-07-29 08:34:29 +00:00
- [Data.Graph source from Containers package ](http://hackage.haskell.org/package/containers-0.5.5.1/docs/Data-Graph.html ).
2015-07-29 13:33:37 +00:00
- [Пакет graphs ](https://hackage.haskell.org/package/graphs ).
2015-07-29 08:34:29 +00:00
2021-09-29 05:14:09 +00:00
- [SO вопрос про PHOAS ](https://stackoverflow.com/questions/24369954/separate-positive-and-negative-occurrences-of-phoas-variables-in-presence-of-rec )
2015-07-29 08:34:29 +00:00
2015-07-29 13:33:37 +00:00
- [PHOAS бесплатно ](https://www.fpcomplete.com/user/edwardk/phoas ).
2015-07-29 08:34:29 +00:00
- [Tying the Knot ](http://www.haskell.org/haskellwiki/Tying_the_Knot ).
- [Hackage: dag ](https://hackage.haskell.org/package/dag ).
2015-07-29 13:33:37 +00:00
# Окружение разработки
2015-07-29 08:34:29 +00:00
## Emacs
2015-08-07 09:12:30 +00:00
- [Alejandro Serras’ s tutorial ](https://github.com/serras/emacs-haskell-tutorial/blob/master/tutorial.md )
2015-07-29 08:34:29 +00:00
- [My dotfiles ](https://github.com/bitemyapp/dotfiles/ )
2015-08-07 09:12:30 +00:00
- [Chris Done’ s emacs config ](https://github.com/chrisdone/chrisdone-emacs )
2015-07-29 08:34:29 +00:00
## Vim
- [Vim page on haskellwiki ](http://www.haskell.org/haskellwiki/Vim )
- [Haskell-vim-now ](https://github.com/begriffs/haskell-vim-now )
- [GHC-Mod ](https://github.com/kazu-yamamoto/ghc-mod )
- [GHC-Mod vim plugin ](https://github.com/eagletmt/ghcmod-vim )
- [Hindent ](https://github.com/chrisdone/hindent )
## Sublime Text
- [SublimeHaskell ](https://github.com/SublimeHaskell/SublimeHaskell )
2015-07-29 13:33:37 +00:00
# Работа с Cabal
2015-07-29 08:34:29 +00:00
2015-07-29 13:33:37 +00:00
## Руководства по Cabal
2015-07-29 08:34:29 +00:00
2015-07-29 13:33:37 +00:00
Cabal Hell был проблемой для пользователей Haskell до появления песочниц (sandboxes).
Установка вне песочницы происходит в вашу пользовательскую базу данных пакетов.
2015-08-07 09:12:30 +00:00
Это *не очень* хорошая идея, за исключением основных пакетов, таких как Cabal, alex и happy.
2015-07-29 13:33:37 +00:00
Более ничто не должно быть установлено глобально или в пользовательскую базу данных пакетов,
если вы не уверены в том, что делаете.
2015-07-29 08:34:29 +00:00
2015-08-07 08:47:46 +00:00
[Советы ](http://softwaresimply.blogspot.com/2014/07/haskell-best-practices-for-avoiding.html ) как избежать cabal hell.
2015-07-29 08:34:29 +00:00
2015-07-29 13:33:37 +00:00
Для экспериментов с пакетом или в начале нового проекта, начните с команды
`cabal sandbox init` в новой папке.
2015-07-29 08:34:29 +00:00
2015-07-29 13:33:37 +00:00
Кратко:
2015-07-29 08:34:29 +00:00
2015-07-29 13:33:37 +00:00
- Всегда используйте песочницы для установки новых пакетов, создания новых проектов,
или для экспериментов.
2015-07-29 08:34:29 +00:00
2015-07-29 13:33:37 +00:00
- Используйте `cabal repl` для использования ghci внутри проекта.
2015-07-29 08:34:29 +00:00
2015-07-29 13:33:37 +00:00
Основанный на песочницах подход, который я советую, поможет избежать проблем с
зависимостями пакетов, но он не совместим с о способом, предоставляемым Haskell Platform для
2015-08-12 21:04:02 +00:00
собранных пакетов. Если вы все еще изучаете Haskell и не понимаете как ghc-pkg и Cabal
работает, *избегайте платформу* и вместо этого используйте инструкции по установке, описанные выше.
2015-07-29 08:34:29 +00:00
## Stackage
2015-07-29 13:33:37 +00:00
Для любых пользователей (обычно для пользователей Yesod), которые испытывают проблемы с о сборкой,
существует Stackage.
2015-07-29 08:34:29 +00:00
2015-08-07 08:47:46 +00:00
- [Хороший обзор Stackage ](https://www.fpcomplete.com/blog/2014/05/stackage-server ).
2015-07-29 08:34:29 +00:00
2015-07-29 13:33:37 +00:00
По мнению автора, Stackage обычно более полезен, чем `cabal freeze` .
2015-07-29 08:34:29 +00:00
2015-07-29 13:33:37 +00:00
# Hoogle и Haddock
2015-07-29 08:34:29 +00:00
2015-07-29 13:33:37 +00:00
## Поиск кода по сигнатуре типов
2015-07-29 08:34:29 +00:00
2015-07-29 13:33:37 +00:00
[Поисковый движок Hoogle ](http://www.haskell.org/hoogle/ ) может искать по типам.
2015-07-29 08:34:29 +00:00
2015-08-07 08:47:46 +00:00
Например, взгляните на результат поиска для [`(a -> b) -> [a] -> [b]`](http://www.haskell.org/hoogle/?hoogle=%28a+-%3E+b%29+-%3E+%5ba%5d+-%3E+%5bb%5d).
2015-07-29 08:34:29 +00:00
2015-08-07 08:47:46 +00:00
Так же он доступен [на fpcomplete ](https://www.fpcomplete.com/hoogle ).
2015-07-29 08:34:29 +00:00
2015-07-29 13:33:37 +00:00
Еще есть [Hayoo ](http://holumbus.fh-wedel.de/hayoo/hayoo.html ) (который включает все пакеты
hackage для поиска по дефолту).
2015-07-29 08:34:29 +00:00
2015-07-29 13:33:37 +00:00
## Разворачивание собственного локального Hoogle
2015-07-29 08:34:29 +00:00
2015-07-29 13:33:37 +00:00
Взгляните [сюда ](https://gist.github.com/bitemyapp/3e6a015760775e0679bf ).
2015-07-29 08:34:29 +00:00
## Haddock
1. [Fix your hackage documentation ](http://fuuzetsu.co.uk/blog/posts/2014-01-06-Fix-your-Hackage-documentation.html )
2. [Hackage documentation v2 ](http://fuuzetsu.co.uk/blog/posts/2014-01-06-Hackage-documentation-v2.html )
2015-07-29 14:57:23 +00:00
Заметьте, что эти публикации *слегка устарели* : например, теперь Hackage поддерживает
2015-07-29 13:33:37 +00:00
новую информацию с информацией о документации и статус сборки.
2015-07-29 08:34:29 +00:00
2015-07-29 13:33:37 +00:00
## Что вам правда нужно знать
2015-07-29 08:34:29 +00:00
2015-07-29 13:33:37 +00:00
Чтобы haddock включал документацию для зависимых пакетов, вам нужно выставить
`documentation: True` в вашем `~/.cabal/config` . Если это было выставлено по дефолту (`False`)
или выставлено непосредственно в `False` , вам нужно будет удалить все ваши пакеты
и переустановить перед генерацией haddock.
2015-07-29 08:34:29 +00:00
2015-07-29 13:33:37 +00:00
Другая вещь, о которой надо помнить, это то, что из-за способа, которым `$pkg` параметр
интерполируется *посредством* cabal, не вами, `html-location` и `content-location`
параметры *должны быть в одиночных кавычках* и набираться в оболочке или содержаться в
2015-08-12 21:04:02 +00:00
shell-скрипте. Они не будут работать в Makefile, потому что haddock будет думать, что они
2015-07-29 13:33:37 +00:00
являются переменными Make!
2015-07-29 08:34:29 +00:00
```bash
#! /usr/bin/env sh
2015-07-29 13:33:37 +00:00
# Вы можете набирать это одной строкой без обратных слешей
2015-07-29 08:34:29 +00:00
cabal haddock --hoogle --hyperlink-source \
--html-location='http://hackage.haskell.org/package/$pkg/docs' \
--contents-location='http://hackage.haskell.org/package/$pkg'
```
# TravisCI
2015-07-29 13:33:37 +00:00
Если вы такой же большой фанат [TravisCI ](https://travis-ci.org ) как я,
тогда *очень* рекомендую вам взглянуть на
[multi-ghc-travis ](https://github.com/hvr/multi-ghc-travis ) как основу для
`travis.yml` ваших Haskell проектов.
2015-07-29 08:34:29 +00:00
# Frontend/JavaScript
2015-07-29 13:33:37 +00:00
Мы обладаем огромными богатствами! Есть три основных вещи, которые я рекомендую:
2015-07-29 08:34:29 +00:00
2015-07-29 13:33:37 +00:00
* [Haste ](http://haste-lang.org/ ) компилятор Haskell в JavaScript
2015-08-07 09:17:31 +00:00
- [Компилятор ](https://github.com/valderman/haste-compiler ) на github
- [Отличное демо ](http://www.airpair.com/haskell/posts/haskell-tutorial-introduction-to-web-apps )
Haste с примером проекта
2015-07-29 08:34:29 +00:00
* [GHCJS ](https://github.com/ghcjs/ghcjs )
2015-08-07 09:12:30 +00:00
- [GHCJS Introduction ](http://weblog.luite.com/wordpress/?p=14 )
- [Functional Reactive Web Interfaces with GHCJS and Sodium ](http://weblog.luite.com/wordpress/?p=127 )
- [Writing Atom plugins in Haskell using ghcjs ](http://edsko.net/2015/02/14/atom-haskell/ )
2015-07-29 08:34:29 +00:00
* [PureScript ](http://www.purescript.org/ )
2015-08-07 09:17:31 +00:00
- Н е совсем Haskell как Haste или GHCJS, но популярный выбор многих пользователей Haskell.
- Написан и вдохновлен языком Haskell.
- Попробуйте [PureScript ](http://try.purescript.org/ ) в вашем браузере.
2018-07-22 21:04:19 +00:00
- Отличное руководство для [начала ](https://www.christopherbiscardi.com/2014/6/22/getting-started-with-purescript/ ).
2015-07-29 08:34:29 +00:00
2015-07-29 13:33:37 +00:00
## Какой фронтенд язык мне использовать?
2015-07-29 08:34:29 +00:00
2015-07-29 13:33:37 +00:00
GHCJS и Haste о б а являются полноценным Haskell. GHCJS будет работать с большим
числом пакетов, нежели Haste, но это не затрагивает большинство фронтенд проектов.
PureScript совсем не Haskell, так что использовать Haskell код из вашего бекенда совсем не получится.
2015-07-29 08:34:29 +00:00
2015-07-29 13:33:37 +00:00
GHCJS имеет самое быстрое время выполнение на уровне 100kb (luite работает на этом).
Haste и PureScript сравнимы.
2015-07-29 08:34:29 +00:00
2015-07-29 13:33:37 +00:00
PureScript имеет наилучшую интеграцию с JS инструментами (использует gulp/grunt/bower),
GHCJS и Haste интегрируются лучше с инструментами Haskell (Cabal).
2015-07-29 08:34:29 +00:00
2015-07-29 13:33:37 +00:00
В с е три являются отличным выбором и будут работать для большинства фронтэнд проектов.
2015-07-29 08:34:29 +00:00
2015-07-29 13:33:37 +00:00
# Для более глубокого понимания laziness, NF, WHNF
2015-07-29 08:34:29 +00:00
2015-08-07 09:12:30 +00:00
- [Notes on lambda calculus ](https://vec.io/posts/notes-on-lambda-calculus )
2015-07-29 08:34:29 +00:00
2015-07-29 13:33:37 +00:00
## Исследовательские документы про lazy lambda calculi
2015-07-29 08:34:29 +00:00
2015-08-07 09:12:30 +00:00
- [A call by need lambda calculus ](http://homepages.inf.ed.ac.uk/wadler/topics/call-by-need.html#need-journal )
2015-07-29 08:34:29 +00:00
- [Demonstrating Lambda Calculus Reduction ](http://www.itu.dk/~sestoft/papers/sestoft-lamreduce.pdf )
2015-08-07 09:12:30 +00:00
- [The lazy lambda calculus ](http://www.cs.ox.ac.uk/files/293/lazy.pdf )
2015-07-29 08:34:29 +00:00
- [Lazy evaluation of Haskell ](http://www.vex.net/~trebla/haskell/lazy.xhtml )
# Parallelism/Concurrency
2015-07-29 13:33:37 +00:00
- [Parallel and Concurrent Programming in Haskell ](http://chimera.labs.oreilly.com/books/1230000000929 ).
Эта книга от Simon Marlow, наверное лучшее, что я когда-либо читал о параллелизме и конкаренси.
2015-07-29 08:34:29 +00:00
2015-07-29 13:33:37 +00:00
- Хорошее [руководство ](http://kukuruku.co/hub/haskell/haskell-testing-a-multithread-application )
по тестированию и инкрементальной разработке многопоточного приложения в Haskell.
2015-07-29 08:34:29 +00:00
2015-08-07 09:12:30 +00:00
- [Functional Reactive Programming ](http://www.haskell.org/haskellwiki/Functional_Reactive_Programming ).
2015-07-29 08:34:29 +00:00
2015-07-29 13:33:37 +00:00
# Линзы и призмы
2015-07-29 08:34:29 +00:00
2015-08-12 21:04:02 +00:00
Как только вы почувствуете себя комфортно с Haskell, очень рекомендую изучить Lenses
2015-08-07 08:33:44 +00:00
и Prisms, даже лишь в качестве «пользователя». Вам не обязательно нужно понимать лежащую
2015-07-29 13:33:37 +00:00
в основе категорию для того, чтобы они были полезны.
2015-07-29 08:34:29 +00:00
2015-07-29 13:33:37 +00:00
Люди зачастую завышают сложность использования линз. В с е , кто комфортно чувствует
себя используя Functor/Foldable/Traversable (или даже если лишь первый) могут
начать использовать линзы и призмы для облегчения своей жизни.
2015-07-29 08:34:29 +00:00
2015-08-07 08:33:44 +00:00
Если вы когда-либо делали что-то вроде: `(fmap . fmap)` , вы уже «использовали линзы»
2015-07-29 13:33:37 +00:00
в своей голове.
2015-07-29 08:34:29 +00:00
2015-07-29 13:33:37 +00:00
Я рекомендую следующие два руководства:
2015-07-29 08:34:29 +00:00
- [A little lens starter tutorial ](https://www.fpcomplete.com/school/to-infinity-and-beyond/pick-of-the-week/a-little-lens-starter-tutorial )
- [Lens: Lenses, Folds and Traversals ](https://github.com/ekmett/lens#lens-lenses-folds-and-traversals )
2015-07-29 13:33:37 +00:00
З а дальнейшей информацией смотрите: [Lens package on hackage ](http://hackage.haskell.org/package/lens ).
2015-07-29 08:34:29 +00:00
2015-07-29 13:33:37 +00:00
# Схемы рекурсии
2015-07-29 08:34:29 +00:00
2015-07-29 13:33:37 +00:00
Некоторые сумасшедшие \*-morphism слова, которые вы могли слышать, на самом деле о рекурсии.
Н о перед тем как трогать этот материал, вы должны знать как реализовать
foldr для списков и хотя бы одну структуру данных, такую как дерево. (folds являются
catamorphisms). Знание о том, как реализовать unfold (anamorphism), также помогут в осознании этих вещей.
2015-07-29 08:34:29 +00:00
2015-07-29 13:33:37 +00:00
Этот материал согласуется с traversable и foldable.
2015-07-29 08:34:29 +00:00
- [An introduction to recursion schemes ](http://patrickthomson.ghost.io/an-introduction-to-recursion-schemes/ )
2015-08-07 09:12:30 +00:00
- [Don’ t fear the cat ](http://fho.f12n.de/posts/2014-05-07-dont-fear-the-cat.html ) — хорошая демонстрация того, как hylomorphism, это композиция из cata и ana
2015-07-29 08:34:29 +00:00
2015-08-07 07:20:18 +00:00
- [Recursion Schemes ](http://comonad.com/reader/2009/recursion-schemes/ ) — это
2015-07-29 13:33:37 +00:00
руководство просто замечательно!
2015-07-29 08:34:29 +00:00
- [Functional Programming with Bananas, Lenses, Envelopes and Barbed Wire ](http://eprints.eemcs.utwente.nl/7281/01/db-utwente-40501F46.pdf )
- [Catamorphisms ](https://www.fpcomplete.com/user/edwardk/recursion-schemes/catamorphisms )
2015-07-29 13:33:37 +00:00
# Ядро GHC и настройка производительности
2015-07-29 08:34:29 +00:00
- [Write Haskell as Fast as C ](write_haskell_as_fast_as_c.md )
2015-08-07 09:12:30 +00:00
- [GHC Wiki: CoreSyn Type ](https://ghc.haskell.org/trac/ghc/wiki/Commentary/Compiler/CoreSynType )
2015-07-29 08:34:29 +00:00
2015-08-07 09:12:30 +00:00
- [Hackage: GHC Core ](https://hackage.haskell.org/package/ghc-core )
2015-07-29 08:34:29 +00:00
2021-09-29 05:14:09 +00:00
- [SO Question: Reading GHC Core ](https://stackoverflow.com/questions/6121146/reading-ghc-core )
2015-07-29 08:34:29 +00:00
2015-08-07 09:12:30 +00:00
- [Haskell as fast as C ](http://donsbot.wordpress.com/2008/06/04/haskell-as-fast-as-c-working-at-a-high-altitude-for-low-level-performance/ )
2015-07-29 08:34:29 +00:00
2015-08-07 09:12:30 +00:00
- [Real World Haskell, Chapter 25: Profiling and Optimizations ](http://book.realworldhaskell.org/read/profiling-and-optimization.html )
2015-07-29 08:34:29 +00:00
2015-07-29 13:33:37 +00:00
# Тип и теория категорий
2015-07-29 08:34:29 +00:00
2015-07-29 13:33:37 +00:00
> *Н е * необходимо для работы с Haskell, просто для тех, кто интересуется!
2015-07-29 08:34:29 +00:00
2015-07-29 13:33:37 +00:00
Если вы хотите вникнуть в типы и теорию категорий:
2015-07-29 08:34:29 +00:00
2015-08-07 09:12:30 +00:00
- [Catster’ s Guide ](http://byorgey.wordpress.com/2014/01/14/catsters-guide/ ) и
[Catster’ s Guide 2 ](http://byorgey.wordpress.com/catsters-guide-2/ ).
2015-07-29 08:34:29 +00:00
2015-07-29 13:33:37 +00:00
- [Вики-книга haskell ](http://en.wikibooks.org/wiki/Haskell/Category_theory )
2015-08-12 21:04:02 +00:00
содержит неплохие диаграммы.
2015-07-29 08:34:29 +00:00
2015-07-29 13:33:37 +00:00
- [Category Theory ](http://www.haskell.org/haskellwiki/Category_theory )
2015-08-07 09:12:30 +00:00
на haskellwiki, также содержит хорошие ссылки.
2015-07-29 08:34:29 +00:00
2015-07-29 13:33:37 +00:00
- [Categories from scratch ](http://science.raphael.poss.name/categories-from-scratch.html ), содержит несколько практических примеров.
2015-07-29 08:34:29 +00:00
2015-07-29 13:33:37 +00:00
- Список Pierce [Great Works in PL ](http://www.cis.upenn.edu/~bcpierce/courses/670Fall04/GreatWorksInPL.shtml ).
2015-07-29 08:34:29 +00:00
2015-07-29 13:33:37 +00:00
## Книги
2015-07-29 08:34:29 +00:00
2015-07-29 13:33:37 +00:00
- Рекомендации Kmett: [Quora Question: What is the best textbook for category theory? ](http://www.quora.com/Category-Theory/What-is-the-best-textbook-for-Category-theory?share=1 )
2015-07-29 08:34:29 +00:00
2015-07-29 13:33:37 +00:00
- [Awodey ](http://ukcatalogue.oup.com/product/9780199237180.do ) и
[MacLane ](http://www.amazon.com/Categories-Working-Mathematician-Graduate-Mathematics/dp/0387984038 ). Стандартные книги про теорию категорий.
2015-07-29 08:34:29 +00:00
2015-08-07 09:12:30 +00:00
- [Harper’ s Practical Foundations for Programming Languages ](http://www.cs.cmu.edu/~rwh/plbook/book.pdf )
2015-07-29 13:33:37 +00:00
лучшее PL интро к теории типов, которое я читал.
2015-07-29 08:34:29 +00:00
- [Type theory and Functional Programming ](http://www.cs.kent.ac.uk/people/staff/sjt/TTFP/ ).
2015-07-29 13:33:37 +00:00
# Другие веселые темы
2015-07-29 08:34:29 +00:00
## Parametricity, ad-hoc vs. parametric polymorphism, free theorems
- [Parametricity ](tony_parametricity.pdf ).
2015-07-29 13:33:37 +00:00
- [Исходники в TeX ](https://github.com/tonymorris/parametricity/ ) для доклада выше.
2015-07-29 08:34:29 +00:00
- [Making ad-hoc polymorphism less ad-hoc ](http://swizec.com/blog/week-20-making-ad-hoc-polymorphism-less-ad-hoc/swizec/6564 ).
2015-08-07 09:12:30 +00:00
- [Theorems for Free! ](http://ttic.uchicago.edu/~dreyer/course/papers/wadler.pdf )
2015-07-29 08:34:29 +00:00
## Initial and Final, DSLs, Finally Tagless
- [Final Encodings, Part 1: A Quick Demonstration ](http://creativelad.wordpress.com/2013/11/28/final-encodings-part-1-a-quick-demonstration/ ).
- [Transforming Polymorphic Values ](http://martijn.van.steenbergen.nl/journal/2009/10/18/transforming-polymorphic-values/ ).
- [GADTs in Haskell 98 ](http://martijn.van.steenbergen.nl/journal/2009/11/12/gadts-in-haskell-98/ ).
- [Typed Tagless-Final Linear Lambda Calculus ](https://www.fpcomplete.com/user/mutjida/typed-tagless-final-linear-lambda-calculus ).
- [Typed tagless-final interpretations: Lecture notes ](http://okmij.org/ftp/tagless-final/course/course.html ).
- [Typed Tagless Final Interpreters ](http://okmij.org/ftp/tagless-final/course/lecture.pdf ).
2015-08-07 09:12:30 +00:00
- [The dog that didn’ t bark ](http://existentialtype.wordpress.com/2011/03/21/the-dog-that-didnt-bark/ ) less specifically relevant but interesting.
2015-07-29 08:34:29 +00:00
## Comonads
2015-08-07 09:12:30 +00:00
- [Comonads in Haskell ](https://speakerdeck.com/dmoverton/comonads-in-haskell )
2015-07-29 08:34:29 +00:00
2021-09-29 05:14:09 +00:00
- [SO question: Can a Monad be a Comonad ](https://stackoverflow.com/questions/16551734/can-a-monad-be-a-comonad )
2015-07-29 08:34:29 +00:00
## Yoneda / CoYoneda
2021-09-29 05:14:09 +00:00
- [SO question: Step-by-step explanation of coyoneda ](https://stackoverflow.com/questions/24000465/step-by-step-deep-explain-the-power-of-coyoneda-preferably-in-scala-throu ).
2015-07-29 08:34:29 +00:00
2015-07-29 13:33:37 +00:00
- Свободные монады для Less, серия из трех публикаций от Edward Kmett
2015-08-07 09:12:30 +00:00
* [Part 1: Codensity ](http://comonad.com/reader/2011/free-monads-for-less/ )
* [Part 2: Yoneda ](http://comonad.com/reader/2011/free-monads-for-less-2/ )
* [Part 3: Yielding IO ](http://comonad.com/reader/2011/free-monads-for-less-3/ )
2015-07-29 08:34:29 +00:00
## Propositions vs. Judgments (computation)
2015-08-07 09:12:30 +00:00
- [StackExchange question: What is the difference between propositions and judgements ](http://cstheory.stackexchange.com/questions/9826/what-is-the-difference-between-propositions-and-judgments )
2015-07-29 08:34:29 +00:00
- [Lecture notes from a short, three lecture course ](http://www.ae-info.org/attach/User/Martin-L%C3%B6f_Per/OtherInformation/article.pdf )
2015-07-29 13:33:37 +00:00
# Зависимая типизация
2015-07-29 08:34:29 +00:00
2015-08-07 09:12:30 +00:00
- [Grokking sum types, value constructors, and type constructors ](http://bitemyapp.com/posts/2014-04-05-grokking-sums-and-constructors.html ) squint hard
2015-07-29 08:34:29 +00:00
2015-08-07 09:12:30 +00:00
- [Lightweight Dependent-type Programming ](http://okmij.org/ftp/Computation/lightweight-dependent-typing.html )
2015-07-29 08:34:29 +00:00
2015-08-07 09:12:30 +00:00
- [Idris programming language ](http://www.idris-lang.org/ )
2015-07-29 08:34:29 +00:00
# Statically linking binaries
- [Static linking ](https://wiki.haskell.org/Web/Literature/Static_linking )
- [Static linking with GHC on Arch Linux ](http://www.edofic.com/posts/2014-05-03-ghc-arch-static.html )
2021-09-29 05:14:09 +00:00
- [Statically linking Linux binaries for ARM & MIPS ](https://stackoverflow.com/questions/14270177/ghc-statically-linking-linux-binaries-for-arm-mips-processors )
2015-07-29 08:34:29 +00:00
2021-09-29 05:14:09 +00:00
- [Statically link GMP using GHC and LLVM ](https://stackoverflow.com/questions/10539857/statically-link-gmp-to-an-haskell-application-using-ghc-llvm )
2015-07-29 07:17:20 +00:00
## Диалоги
2015-08-07 08:47:46 +00:00
> Хранятся в этом репозитории [в dialogues.md](dialogues.md).
2015-07-29 07:17:20 +00:00
Они на самом деле достаточно важны и полезны. Просмотрите для погружения в некоторые из тем.