Scala:SeqT monad变压器?

时间:2017-08-29 13:13:57

标签: scala scalaz scala-cats

如果我们有这两个功能......

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

...然后我们可以使用猫OptionT monad变换器轻松地编写for-comprehension:

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

1 个答案:

答案 0 :(得分:2)

猫,从1.0.0-MF到1.0都没有。这在their FAQ解释:

  

ListT的幼稚实施受到关联性问题的困扰;有关示例,请参阅this gist。可以创建一个没有这些问题的ListT,但它往往效率很低。对于许多用例,可以使用Nested来获得所需的结果。

Scalaz,从7.2.15开始有StreamTListT,虽然后者有has个相关性问题。