当前位置: 首页 > 知识库问答 >
问题:

Scala:用于理解,带保护内部阅读器

薄鸿远
2023-03-14

下面是代码示例:

  type FailFast[A] = Either[List[String], A]
  import cats.instances.either._
  def f1:ReaderT[FailFast, Map[String,String], Boolean] = ReaderT(_ => Right(true))
  def f2:ReaderT[FailFast, Map[String,String], Boolean] = ReaderT(_ => Right(true))

  def fc:ReaderT[FailFast, Map[String,String], Boolean] =
    for {
      b1 <- f1
      if (b1)
      b2 <- f2
    } yield b2

错误是:

错误:(17,13)value withFilter不是cats的成员。数据ReaderT[测试q.this.FailFast,映射[字符串,字符串],布尔值]b1

如何使用f2组合f1。f2必须仅在f1返回右(true)时应用。我通过以下方式解决了它:

  def fc2:ReaderT[FailFast, Map[String,String], Boolean] =
    f1.flatMap( b1 => {
      if (b1)
        f2
      else ReaderT(_ => Right(true))
    })

但我希望有一个更优雅的解决方案。

共有1个答案

柯建修
2023-03-14
  1. 巨大的ReaderT[FailFast, Map[String, String], Boolean]类型很烦人。我将其替换为ConfFF-快捷方式(“map-配置的失败-快速”);您可能可以找到一个更好的名称。
  2. 如果需要,您仍然可以使用for-理解语法。
  3. 不需要写出所有的_=

因此,您的fc2变为:

  def fc3: ConfFF[Boolean] =
    for {
      b1 <- f1
      b2 <- if (b1) f2 else true.pure[ConfFF]
    } yield b2

完整代码:

import scala.util.{Either, Left, Right}
import cats.instances.either._
import cats.data.ReaderT
import cats.syntax.applicative._

object ReaderTEitherListExample {

  type FailFast[A] = Either[List[String], A]
  /** Shortcut "configured fail-fast" */
  type ConfFF[A] = ReaderT[FailFast, Map[String, String], A]

  def f1: ConfFF[Boolean] = ReaderT(_ => Right(true))
  def f2: ConfFF[Boolean] = ReaderT(_ => Right(true))

  def fc3: ConfFF[Boolean] =
    for {
      b1 <- f1
      b2 <- if (b1) f2 else true.pure[ConfFF]
    } yield b2
}

 类似资料:
  • 在下面的示例中,我得到异常 当检查< code>if( i == 2 )失败时,我希望得到结果< code>Future( Test2 )。我如何在一个处理组合未来的for理解中处理filter/if? 下面是一个在Scala REPL中工作的简化示例。 代码:

  • 我想创建一个独立的scala代码,使用自定义设置在MongoDB网站上使用该代码从MongoDB读取。 当我运行SBT包时,我会遇到一些错误。我猜这与SparkSession的错误创作方法有关。你能给我一个提示来修理它吗? 我的内容 Firstapp.scala代码 以及运行后的错误 编辑1: 我尝试了这个解决方案,但没有正确编译。内容同上。我改变了转换为: 汇编结果如下: 编辑2: 我添加了to

  • 我正在尝试在Scala中构建一个理解,但是当我尝试使用更复杂的过滤器时遇到了一些问题。 我知道理解过滤的基础: 但是,我想构建一个具有更复杂的过滤语句的for理解。例如,这里有一个我正在尝试做的说明性版本: 基本上,如果您想使用一些更复杂的需求进行筛选,这会变得很尴尬,因为for理解不允许在filter语句中声明变量,否则您必须将所有这些都适合一行。 另一种选择是根本不使用过滤机制,只生成一些(e

  • 问题内容: 有人可以给我解释一下/ 内部 类有什么区别吗? 我知道内部类应尽可能避免(如本文所述)。 但是据我所知,使用或修饰符之间没有区别。 看一下这个例子: … … 所有这些都可以编译,并且无论我声明 还是都有效。 我想念什么?请指出一个使用或有所不同的情况。 谢谢。 问题答案: 该访问修饰符将限制从比在同一个包及其子类之外的其他类的访问。 在所示的示例中,和和将具有相同的效果,因为它们位于同

  • 任务是实现递归方法,返回 Future 并且由于这一部分("在其他递归(结果::: res,尝试1)")代码失败与错误,因为它期望未来[Seq[结果]],但实际上返回未来[对象]。 据我所知,问题在于yield块内的表达式必须返回Seq[Result],以便将来由Monad进行后续包装。但是“递归(结果::res,尝试1)”将返回未来。因此,不是预期的Seq[Result]收益率,而是包含未来的[

  • 我试图连接到我的本地机器上的Kafka(2.1),并在Flink(1.7.2)附带的scalashell中读取。 下面是我正在做的: 之后,最后一条语句我得到了以下错误: 我已经创建了一个名为“topic”的主题,我能够通过另一个客户端正确地生成和读取来自它的消息。我正在使用java版本1.8.0\u 201,并遵循https://ci.apache.org/projects/flink/flin