用于数据库抽象的Idiomatic haskell

Mas*_*sse 9 database haskell

在OOP语言我可以写一个数据库的包装,它封装数据库连接,管理模式,并提供一些核心业务,如exec,query,prepare_and_execute.我甚至可能有一个单独的数据库助手类来处理数据库模式,只留下数据库抽象来处理连接.然后,模型包装器/工厂将使用它,它使用数据库抽象类来创建模型类的实例.像这个UML图一样的东西:

在惯用的haskell中设计这样一个系统的首选方法是什么?

sas*_*nin 5

Haskell中最常用的数据库抽象库是HDBC.这意味着查询只是String用占位符表示为s.更少的人使用HaskellDB,它提供了一种类型安全的方法来构建查询.没有什么禁止用户数据类型来表示常见查询和自定义函数来构建它们.

Haskell中的值是不可变的,这意味着拥有与数据库中的记录对应的可变对象是没有用的.相反,我认为定义用户数据类型和函数更为常见,这些类型和函数可以对这些类型的数据进行编组和推/拉.

每当需要更新数据库时,它们很可能会在某些有状态的monad下运行IO.例如,这将允许保持连接打开,或者在请求之间执行某些操作.

最后,函数是第一类的,因此可以动态构造所有函数.因此,函数本身可以封装您想要的任何信息.

所以,我认为,通常的Haskell方法包括

  • 用于表示实际数据的代数数据类型(作为不可变值)
  • 应用程序的其余部分来转换这些值
  • 生成查询的函数(封装模式细节,向/从Haskell数据类型编组数据)
  • (可选)运行查询的有状态monad(隐藏数据库访问的详细信息)
  • 运行查询的函数(隐藏数据库访问的详细信息)