首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何在猫的WriterT列表上折叠

如何在猫的WriterT列表上折叠
EN

Stack Overflow用户
提问于 2020-09-23 05:01:28
回答 2查看 81关注 0票数 1

我希望把作家Monad的列表从猫到一个大作家,而不是运行它们。例如:

代码语言:javascript
代码运行次数:0
运行
复制
import cats.data.Writer
import cats.instances.vector._
import cats.instances.list._
import cats.instances.tuple._
import cats.Foldable

val result = for {
  i <- Writer(Vector("hello"), Vector(1))
  j <- Writer(Vector("bye"), Vector(2))
} yield j

val result2 = for {
  x <- Writer(Vector("hi"), Vector(33))
  y <- Writer(Vector("ciao"), Vector(55))
} yield y

val l = List(result, result2)

val result3 = for {
  t <- result
  z <- result2
} yield z // Success !!!

val l = List(result, result2)

// Logically:
// val result3 = for {
//   r <- l
//   o <- r
// } yield o
// But will not compile without Monad Transformer


// With run
val l1: List[(Vector[String], Vector[Int])] = l.map(_.run)

val result5 = Foldable[List].combineAll(l1)

我相信,在不运行Writers的情况下,必须有用于这种组合的功能构造

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-09-23 09:17:41

您可以通过使用Vector直接跳到result5,这样您就拥有了相同的容器类型,然后使用l.sequence.map(_.flatten)检查遍历类型类,因为正如俗语所说,“它总是遍历”。

代码语言:javascript
代码运行次数:0
运行
复制
import cats.data.{Writer, WriterT}
import cats.instances.vector._
import cats.instances.list._
import cats.instances.tuple._
import cats.{Foldable, Id}
import cats.implicits._

val result = for {
  i <- Writer(Vector("hello"), Vector(1))
  j <- Writer(Vector("bye"), Vector(2))
} yield j

val result2 = for {
  x <- Writer(Vector("hi"), Vector(33))
  y <- Writer(Vector("ciao"), Vector(55))
} yield y

val l = Vector(result, result2)

val result3 = for {
  t <- result
  z <- result2
} yield z // Success !!!

// val l = List(result, result2) -- this is a duplicate

val result5: WriterT[Id, Vector[String], Vector[Int]] = l.sequence.map(_.flatten)

result5将具有以下值:

代码语言:javascript
代码运行次数:0
运行
复制
WriterT((Vector(hello, bye, hi, ciao),Vector(2, 55)))
票数 1
EN

Stack Overflow用户

发布于 2020-09-23 14:45:52

感谢@NigelBeans回答。我将在这里发布工作解决方案,因为我在使用答案中的确切导入时遇到了一些隐含的冲突:

代码语言:javascript
代码运行次数:0
运行
复制
import cats.data.Writer
import cats.instances.vector._
import cats.instances.list._
import cats.instances.tuple._
import cats.Foldable
import cats.syntax.traverse._

val result1 = for {
  i <- Writer(Vector("hello"), Vector(1))
  j <- Writer(Vector("bye"), Vector(2))
} yield j

val result2 = for {
  x <- Writer(Vector("hi"), Vector(33))
  y <- Writer(Vector("ciao"), Vector(55))
} yield y

val l = Vector(result1, result2)

val result3 = l.flatSequence

println(result3.run) // (Vector(hello, bye, hi, ciao),Vector(2, 55))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64017608

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档