为什么 Doobie 使用免费的 monad?
Why does Doobie use free monad?
好像很简单
type Db[F[_], A] = Kleisli[F, Connection, A]
type Transactor[DB[_], F[_]] = DB ~> F
也可用于构建功能性 JDBC 层
总结自@SystemFw 和@tpolecat 的回答https://gitter.im/scala/scala?at=5cfe6505bf4cbd167c619960
免费 Monad 的优点:
- 客户端代码无法访问 Connection 实例,因此无法泄露它
- 没有用户的
F[_]
,因此不能在事务边界内使用不正确的(异步)效果。这很重要,因为大多数 JDBC 驱动程序已将 java.sql.Connection
实现设计为 single-threaded。
免费 Monad 的缺点:
- 客户端代码无法访问 Connection,因此无法使用替代 ORM(如 JOOQ)
- 没有用户的
F[_]
,因此您不能在事务中嵌套特定效果。
Doobie以后会有无标签版本
好像很简单
type Db[F[_], A] = Kleisli[F, Connection, A]
type Transactor[DB[_], F[_]] = DB ~> F
也可用于构建功能性 JDBC 层
总结自@SystemFw 和@tpolecat 的回答https://gitter.im/scala/scala?at=5cfe6505bf4cbd167c619960
免费 Monad 的优点:
- 客户端代码无法访问 Connection 实例,因此无法泄露它
- 没有用户的
F[_]
,因此不能在事务边界内使用不正确的(异步)效果。这很重要,因为大多数 JDBC 驱动程序已将java.sql.Connection
实现设计为 single-threaded。
免费 Monad 的缺点:
- 客户端代码无法访问 Connection,因此无法使用替代 ORM(如 JOOQ)
- 没有用户的
F[_]
,因此您不能在事务中嵌套特定效果。
Doobie以后会有无标签版本