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

Scala向右映射或向左返回

通飞尘
2023-03-14

是否可以以与选项类似的方式处理任一选项?在选项中,我有一个getOrElse函数,在中,我想返回左或处理右。我正在寻找最快的方法来完成这项工作,而不需要任何样板文件,如:

val myEither:Either[String, Object] = Right(new Object())
myEither match {
    case Left(leftValue) => value
    case Right(righValue) => 
        "Success"
}

共有3个答案

贾俊喆
2023-03-14

cchantep和Marth都是解决您眼前问题的好方法。但更广泛地说,很难将两者视为完全类似于选项的东西,尤其是在让您表达可能失败的计算序列以便于理解方面。两者都有一个投影API(在cchantep的解决方案中使用),但它有点不完整。(任何一个的投影都可以通过保护、模式匹配或变量赋值进行理解。)

FWIW,我写了一个库来解决这个问题。它通过此API增强了两者之一。你给自己定义了一个“偏见”。“右偏移”是指普通流(map、get等)由右对象表示,而左对象表示某种问题。(右偏移是常规的,但如果愿意,也可以定义左偏移。)然后,您可以将视为选项;它提供了一个完全类似的API。

import com.mchange.leftright.BiasedEither

import BiasedEither.RightBias._

val myEither:Either[String, Object] = ...
val o = myEither.getOrElse( "Substitute" )

更有用的是,您现在可以像对待真正的scala单子一样对待这两个单子,即使用flatMap、map、filter和进行理解:

val myEither : Either[String, Point] = ???
val nextEither = myEither.map( _.x ) // Either[String,Int]

val myEither : Either[String, Point] = ???
def findGalaxyAtPoint( p : Point ) : Either[String,Galaxy] = ???

val locPopPair : Either[String, (Point, Long)] = {
  for { 
    p <- myEither    
    g <- findGalaxyAtPoint( p )
  } yield {
    (p, g.population)
  }
}

如果所有处理步骤都成功,则locPopPair将是右[长]。如果出现任何错误,它将是遇到的第一个左[字符串]

这稍微复杂一些,但定义一个空标记是个好主意。让我们看看上面的理解方法的一个细微变化:

val locPopPair : Either[String, (Point, Long)] = {
  for { 
    p <- myEither    
    g <- findGalaxyAtPoint( p ) if p.x > 1000
  } yield {
    (p, g.population)
  }
}

如果测试p. x会发生什么

import com.mchange.leftright.BiasedEither

val RightBias = BiasedEither.RightBias.withEmptyToken[String]("EMPTY")
import RightBias._

val myEither : Either[String, Point] = ???
def findGalaxyAtPoint( p : Point ) : Either[String,Galaxy] = ???

val locPopPair : Either[String, (Point, Long)] = {
  for { 
    p <- myEither    
    g <- findGalaxyAtPoint( p ) if p.x > 1000
  } yield {
    (p, g.population)
  }
}

现在,如果

岳均
2023-03-14

您可以使用X, fb: B=>X): X"rel="norefrer">. fold

scala> val r: Either[Int, String] = Right("hello")
r: Either[Int,String] = Right(hello)

scala> r.fold(_ => "got a left", _ => "Success")
res7: String = Success

scala> val l: Either[Int, String] = Left(1)
l: Either[Int,String] = Left(1)

scala> l.fold(_ => "got a left", _ => "Success")
res8: String = got a left

编辑:

重新阅读您的问题,我不清楚您是要返回左边的值,还是要返回另一个值(在别处定义)
如果是前者,您可以将身份传递给。折叠,但这可能会将返回类型更改为任意:

scala> r.fold(identity, _ => "Success")
res9: Any = Success

皇甫学海
2023-03-14

在Scala 2.12中,

要么是右偏的,这意味着右被假定为要操作的默认情况。如果它是左,则map、平面图等操作...返回左值不变

所以你可以

myEither.map(_ => "Success").merge

如果您发现它比折叠更可读。

 类似资料:
  • 我试图将元组向量转换为向量[人],但上面的代码会导致强制转换异常,即使存在隐式的元组-人转换函数? 线程“main”java中出现异常。lang.ClassCastException:scala。Tuple2无法转换为示例。例如,测试$人。测试$$anonfun$2$$anonfun$应用$1。在scala应用(测试scala:19)。收集迭代器$类。scala上的foreach(迭代器。scal

  • 问题内容: 我所看到的和jQuery的。左右滑动的功能/方式如何? 问题答案: 您可以使用jQueryUI中的其他效果来执行此操作: 快速示例:

  • Framework7 完全支持从右向左的语言。你只需要增加一个额外的CSS文件即可: <!DOCTYPE html> <html> <head> ... <title>My App</title> <!-- Path to Framework7 Library CSS--> <link rel="stylesheet" href="path/to/framewo

  • 问题内容: 我有以下XML: 我的部分Java代码: 我遇到的问题。 按下布局以获取其特定部分的坐标时(如果我一直向左或向右按​​下/拖动),则我的应用程序FC。我在下面添加LogCat: 01-25 01:13:21.059:E / AndroidRuntime(13345):致命例外:主要01-25 01:13:21.059:E / AndroidRuntime(13345):java.lan

  • 下面的例子中,我有一个单独的域层和一个单独的持久层。我使用Mapstruct进行映射,当从域映射到实体或从实体映射到域时,会出现堆栈溢出,因为双向引用总是被调用- 用于映射的类非常基本

  • 我有两张桌子。后 和喜欢 在这些对象之间进行hibernate注释映射,以便在类似于Post bean的。。。。 就像豆子一样 问题 该关联是否由Post{@OneToOne}和like{@ManyToOne}正确? 获取类型是Lazy,但仍然得到依赖循环。为什么? 尝试 要删除依赖关系循环,我尝试了 {@xmltransive} {@JsonIgnore} {@JsonManagedRefere