Как лучше всего взаимодействовать с базой данных с помощью Haskell? Я привык использовать какую-то ORM (ORM Django, спящий режим и т. д.), И что-то подобное было бы неплохо при создании приложений с HAppS.
Редактировать: Я хотел бы иметь возможность свободно выбирать из Postgresql MySql и SQLite, что касается фактических баз данных.

Вы просматривали сопоставление базы данных и пакеты доступа на http://hackage.haskell.org/packages/archive/pkg-list.html#cat:Database
Я ими не пользовался, поэтому не могу рекомендовать какой-то конкретный. Я также не знаю, какие базы данных вы планируете использовать.
Библиотека, которую я имею в виду, не является ORM, но она может делать то, что вы хотите.
Если вы хотите что-то, что делает доступ к вашей базе данных безопасным, при этом хорошо интегрируя вещи в вашу программу, попробуйте HaskellDB. Он в основном смотрит на вашу схему, генерирует некоторые структуры данных, а затем дает вам безопасные способы запроса. Он существует довольно давно, и по мнению сообщества, он хороший и стабильный.
Чтобы использовать его, вам понадобится некоторая базовая библиотека Haskell DB, такая как HSQL.
Удачи!
Документ HaskellDB: www.cs.chalmers.se/~bringert/publ/haskelldb/haskelldb-db-200 5.pdf
Проблема HaskellDB заключается в том, что в настоящее время он не собирается с последними версиями GHC (6.8 или 6.10).
@ErikHesselink HaskellDB (github) теперь поддерживает GHC 7.10.
На самом деле мне очень нравится подход HAppS (HAppS-Состояние), который позволяет вам забыть о маршалинге / демаршаллинге ORM и позволяет вам просто использовать типы данных Haskell.
Причина, по которой существуют библиотеки ORM, заключается в том, что существует относительная большая разница между объектами в C# или Java и тем, что вы храните в базе данных. В Haskell это не проблема, потому что:
Я использую SqlAlchemy в Python, потому что он упрощает сборку / повторное использование операторов SQL без непосредственного манипулирования строками. Есть ли что-то подобное для Haskell?
«Объект» в ORM не соответствует конкретно объектно-ориентированному программированию, а также применяется к значениям Haskell. и хотя сопротивление между реляционными и объектно-ориентированными моделями больше, чем у алгебраических моделей Haskell, все же существует некоторое трение (круговые или графовые типы могут быть естественно представлены в RDBMS, но не в Haskell), а также множество надоедливых шаблонов .
Лично я использовал только База данных.HDBC, рекомендованный "Real World Haskell": http://book.realworldhaskell.org/read/using-databases.html
Но я согласен с тем, что определенно имеет смысл использовать уровень доступа к БД более высокого уровня, и я, вероятно, попробую перейти к такой модели для будущих проектов. По этой теме я нашел этот пост 2012 года, в котором представлена история и сравнение таких решений для Haskell: http://www.yesodweb.com/blog/2012/03/history-of-persistence
Из этого я понимаю, что Persistent (документация) и Groundhog (некоторая документация, Примеры) являются наиболее многообещающими библиотеками в этой области. Обе библиотеки поддерживают упомянутые вами базы данных; для сурка это не написано в этом посте, но в этом объявлении вы можете видеть, что он поддерживает именно те БД, которые вас интересуют.
Также обратите внимание на эта ветка на Haskell-новичках, в котором Эскелетто упоминается как лучший выбор для операций обновления.
Обратите внимание, что Persistent поставляется с Yesod, и поэтому у них может быть больше поклонников.
Persistent довольно удобен в использовании и позволяет полагаться на вывод типа при определении таблицы, к которой относится ваш запрос. Например, если в моем файле "модели" есть следующее:
User
name Text
age Int
Login
user UserId
login Text
passwd Text
Тогда я мог бы сделать это:
Just (Entity uid _) <- selectFirst [ UserName ==. "exampleUser" ] []
Just (Entity lid Login {..}) <- selectFirst [ LoginUser ==. uid ] []
И он будет знать, какие таблицы я имел в виду. Конечно, вы, вероятно, не захотите писать подобный частичный код, но я хотел выделить только запросы.
Обновлен вопрос, чтобы перечислить базы данных, которые меня интересуют, но это не должно быть большим критерием фильтрации. Раньше я уже немного просматривал хакерские программы, но мне, наверное, стоит снова их просканировать. Я бы хотел услышать мнение людей с личным опытом.