问题标签 [cats-effect]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
426 浏览

scala - 猫的匹配器 EitherT 和效果

我是猫和函数式编程的新手,我正在努力单元测试函数数据类型,如EitherT. 有示例代码:

我想使用 Spec2 对其进行测试,但我不知道如何正确执行。尝试过这样的事情,但它不起作用:

我想要像这样非常简单的断言:

0 投票
1 回答
622 浏览

scala - 使用 fs2 将流值列表转换为值流

我想使用fs2 Streams、cats EitherTcats-effect IO 定义一个具有以下签名的函数。

它将每个值从 vs 映射到一个值流,并将所有这些值收集到一个新流中。

我试过类似的东西:

但似乎 Stream 没有隐含的定义。

0 投票
1 回答
193 浏览

scala - fs2.Stream[IO,Something] 不返回 take(1)

我有一个返回 fs2.Stream 的函数。

通常它是一个无限流,除非我给它传递一个测试标志,在这种情况下它应该输出一个值并停止。

无限流工作正常。它无限地给了我所有的测量值。测试流确实只给了我第一次测量,仅此而已。我遇到的问题是在最后一次测量之后 Stream 没有返回。它永远阻塞。我究竟做错了什么?

注意:我认为我抽象了基本代码,但有关更多上下文,请查看我的项目:https ://github.com/jkransen/fijnstof/blob/ZIO/src/main/scala/nl/kransen/fijnstof /Main.scala

0 投票
3 回答
1718 浏览

scala - Doobie - 将任意效果提升到 ConnectionIO

我正在尝试在与使用 Doobie 将用户插入数据库的同一事务中发送电子邮件。
我知道我可以通过使用where但是IO在 我的代码中我不操作,我使用约束,例如 所以我可以用我自己的 monad 替换进行测试。 ConnectionIOAsync[ConnectionIO].liftIO(catsIO)catsIO: IO[String]
IOFF[_]: AsyncF

F[String]是否可以在ConnectionIO[String]不直接使用类型的情况下以某种方式提升 in IO

这是我为 IO 类型找到的答案:Doobie and DB access composition within 1 transaction

0 投票
1 回答
744 浏览

scala - FS2 将资源(或效果)作为状态传递

我正在尝试实现一个控制相机的应用程序。相机命令表示为 CameraAction 对象流:

假设我有一个测试流,它发出“记录”并在 20 秒后发出“停止”,再过 20 秒后发出另一个“记录”消息,依此类推,输入流是无限的。

然后应用程序使用“记录”它应该创建一个 GStreamer 管道实例(即它是一种效果)并“运行”它,在“停止”时它“停止”管道并关闭它。然后在随后的“记录”中,使用新的 GStreamer 管道重复该模式。

问题是我需要在流事件的句柄之间传递一个不纯的可变对象的实例。

FS2 文档建议使用块来使流有状态,所以我尝试了

这段代码的问题是,实际录制不会发生在“录制”事件上,而是评估整个块的效果,即当“停止录制”消息到达时,相机会打开,然后立即再次关闭。

如何在不分块的情况下传递“状态”?或者有没有其他方法可以达到我需要的结果?

这可能类似于 带有 StateT[IO, _, _] 的 FS2 Stream,定期转储状态 ,但不同之处在于,在我的情况下,状态不是纯数据结构而是资源。

0 投票
1 回答
678 浏览

scala - 使用 scala 猫效应执行副作用

我正在尝试在 scala 中使用猫效果,并且在世界尽头我有以下类型: IO[Vector[IO[Vector[IO[Unit]]]]]

我发现只有一种方法可以运行它:

但它看起来很丑陋。请帮助我了解如何执行复杂的副作用。

更新:

1)首先IO- 我打开 excel 文件并获取行向量,即IO[Vector[Row]].

2)第二IO- 我对每一行的数据库执行查询。我不能用Vector[_],组成 IO monad

3)第三- 我使用DBIO为 excel 中的每一行创建 PDF 文件。Vector[Results]

所以我有这样的功能:

1)String=>IO[Vector[Row]]

2)Row=>IO[Vector[Results]]

3)Vector[Results] => IO[Unit]

0 投票
1 回答
1500 浏览

scala - Scala:找不到 ContextShift [cats.effect.IO] 的隐式值

我刚开始使用 scala 并想建立与我的数据库的连接。

(我的知识来自https://www.scala-exercises.org/上的 scala/doobie 教程)

现在这里是代码:

当我尝试构建我的代码时,我收到以下错误消息:

错误:(25, 53) 找不到 ContextShift[cats.effect.IO] 的隐式值:

  • 从效果库中导入 ContextShift[cats.effect.IO]

  • 如果使用 IO,请使用cats.effect.IOApp 或使用cats.effect.IO.contextShift xa <- HikariTransactor.newHikariTransactor[IO](

现在我有两个问题:

  1. 究竟是什么问题?
  2. 我如何解决它?
0 投票
1 回答
215 浏览

scala - ParTraverse 不是 NonEmptyList 的值

我按照 cat IO 网站上的说明并行运行一系列效果:

我的代码如下所示:

但我得到一个编译时错误说:

我已经导入了以下内容:

而且我还有以下暗示:

为什么我仍然遇到问题?

0 投票
0 回答
113 浏览

scala - 没有触发 Guava 缓存删除

我有一种情况,我需要跟踪的一些事件在特定超时 ( expiryTimeout) 后变得“陈旧”。过期后,我需要“删除”过期事件的引用,并通知外部服务该事件已过期。如果在到期之前接收到相同密钥的更新事件,则超时被“重置”(例如事件被“刷新”)。在这种情况下不需要发送通知。

我正在尝试使用番石榴缓存来实现上述目标并且不重新发明轮子,但我必须遗漏一些东西,因为似乎没有触发过期。

我有以下IO代码来创建“缓存”:

最值得注意的是,我使用 anval asyncRemovalListener = RemovalListeners.asynchronous(removalListener, evictionEs)来确保过期和删除是异步完成的,而不是作为其他缓存操作(读/写)的一部分。

我创建了以下示例应用程序来简单地测试事物:

然而,这可悲地未能做到我期望它做的事情。:) 当我运行它时,我得到了这些日志行,并且在几秒钟之后,应用程序终止(作为IO.sleep(6.seconds)终止并“赢得” race)。

我错过了什么?谢谢

0 投票
2 回答
895 浏览

scala - 将 Doobie 流从数据库保存到文件

Doobie select 返回一个fs2.Stream(doobie.ConnectionIO, String). 如果我们需要将其写入文件,显而易见的选择是调用stream.compile.toList.transact(transactor)然后将此列表保存到文件中。

有没有办法以流方式保存结果而不将其转换为列表?