【问题标题】:Why does Doobie use free monad?为什么 Doobie 使用免费的 monad?
【发布时间】:2019-07-11 23:34:36
【问题描述】:

好像很简单

type Db[F[_], A] = Kleisli[F, Connection, A]
type Transactor[DB[_], F[_]] = DB ~> F

Сan 也可用于构建功能性 JDBC 层

【问题讨论】:

  • 这是一个非常有趣的问题,但是它可能会被关闭,因为它主要是基于意见的,唯一能给出客观答案的人是罗伯·诺里斯本人。无论如何,我冒昧地在 Scala Gitter 频道中交叉发布了这个。 Rob 和 Fabio Labella 确实回答了:“Free 表示的优点是不能混合连接(意外),缺点是不能混合连接(故意,例如从一个 Db 流式传输到另一个 Db)” - 法比奥。
  • “doobie 的早期版本是这样的具体 Kleisli,而当前默认的免费解释器会解释为 Kleisli。正如 Fabio 所指出的,您不能泄露与 Free 的连接,因为没有连接。这是使用 Free 的动机。这是对 Slick(3.0 之前)的回应,这使得泄漏连接变得非常容易“ - Rob。
  • 另外,他们两人都确认会有 tagless 版本的 doobie。显然有一个分支已经这样做了,并且可能下一个版本将完全 tagless。我所有“说”的来源:gitter.im/scala/scala?at=5cfe6505bf4cbd167c619960
  • @LuisMiguelMejíaSuárez 感谢您的努力!

标签: scala doobie


【解决方案1】:

总结自@SystemFw 和@tpolecat 来自https://gitter.im/scala/scala?at=5cfe6505bf4cbd167c619960 的答案

Free Monad 的优点:

  • 客户端代码无权访问 Connection 实例,因此不能泄露它
  • 没有用户的F[_],所以不能在事务边界内使用不当(异步)效果。这很重要,因为大多数 JDBC 驱动程序都将 java.sql.Connection 实现设计为单线程。

Free Monad 的缺点:

  • 客户端代码无法访问 Connection,因此无法使用替代 ORM(如 JOOQ)
  • 没有用户的F[_],因此您不能在事务中嵌套特定效果。

Doobie 未来会有无标签版本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-03
    • 1970-01-01
    • 2018-07-08
    • 1970-01-01
    • 2021-11-17
    • 1970-01-01
    • 2017-05-30
    • 1970-01-01
    相关资源
    最近更新 更多