【发布时间】: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