【问题标题】:Scala: SeqT monad transformer?Scala:SeqT monad 转换器?
【发布时间】:2018-02-06 23:18:37
【问题描述】:

如果我们有这样两个函数...

def findUserById(id: Long): Future[Option[User]] = ???
def findAddressByUser(user: User): Future[Option[Address]] = ???

...那么我们可以使用猫OptionT monad 转换器轻松地用它们编写理解:

for {
  user    <- OptionT(findUserById(id))
  address <- OptionT(findAddressByUser(user))
} ...

我想用这种方式组成序列的未来,像这样:

def findUsersBySomeField(value: FieldValue): Future[Seq[User]] = ???
def findAddressesByUser(user: User): Future[Seq[Address]] = ???

for {
  user    <- SeqT(findUsersBySomeField(value))
  address <- SeqT(findAddressesByUser(user))
} ...

但我在 Cats 或 Scalaz 中找不到任何 SeqT 实现。是否存在这种 monad 转换器的一些实现,或者我需要自己编写 monad 转换器?不是太难,只是不想重新发明轮子。

(我问题开头的例子来自this article)

【问题讨论】:

  • Scalaz 有ListT。上次我检查时猫没有这样的东西(当时是 0.9.0)
  • @LukaJacobowitz,链接的问题是关于来自 Haskell 标准库的 monad 转换器。我的问题是关于 Scala 的。这个链接对我有什么帮助?
  • @OlegPyzhcov 谢谢,它有帮助!您可以将其发布为答案。
  • Haskell 中的相同问题也适用于 Scala。这是scalaz repo中问题的链接:github.com/scalaz/scalaz/issues/921

标签: scala scalaz scala-cats


【解决方案1】:

从 1.0.0-MF 开始,猫什么都没有。 their FAQ 对此进行了解释:

ListT 的幼稚实现存在关联性问题;有关示例,请参见 this gist。可以创建一个没有这些问题的ListT,但它往往效率很低。对于许多用例,Nested 可用于实现所需的结果。

Scalaz,截至 7.2.15 有 StreamT 和 ListT,尽管后者有 has 关联性问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-01
    • 2021-11-27
    • 2013-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多