使用Scala实现Either数据结构

【Scala】使用Option、Either和Try处理数据交互 Scala数据交互Scala使用一种函数式的方式来处理数据交互,包括入参及返回值。 Option: 解决null(空指针)问题 Either: 解决返回值不确定(返回两个值的其中一个)问题 Try: 解决函数可能会抛出异常问题 Option/Some/None的使用Option实际上有3个类型:Option、Some和None,Some和None都是Option的子类型,So 阅读详情

这个例子来源于scala圣经级教程《Functional Programming in Scala》,由于本人跟着书中的代码敲了一遍,然后写了点测试代码验证了一下正确性,所以就放在这做个备忘吧。贴出来只是为了方便自己得意,如果看不懂,但是又感兴趣的就去看原书吧偷笑偷笑偷笑。

package errorhandling
//hide std library `Either`, since we are writing our own
import scala.{Either => _}

sealed trait Either[+E, +A] {

  def map[B](f: A => B): Either[E, B] = this match {
    case Left(e) => Left(e)
    case Right(a) => Right(f(a))
  }

  def flatMap[EE >: E, B](f: A => Either[EE, B]): Either[EE, B] =
    this match {
      case Left(e) => Left(e)
      case Right(a) => f(a)
    }

  def orElse[EE >: E, AA >: A](b: => Either[EE, AA]): Either[EE, AA] =
    this match {
      case Left(_) => b
      case Right(a) => Right(a)
    }

  def map2[EE >: E, B, C](b: Either[EE, B])(f: (A, B) => C): Either[EE, C] =
    for {
      a <- this
      b1 <- b
    } yield f(a, b1)
}

case class Left[+E](get: E) extends Either[E, Nothing]
case class Right[+A](get: A) extends Either[Nothing, A]

object Either {

  def mean(xs: IndexedSeq[Double]): Either[String, Double] = if (xs.isEmpty) Left("empty list") else Right(xs.sum / xs.length)

  def Try[A](a: => A): Either[Exception, A] = try Right(a)  catch { case e: Exception => Left(e) }

  def safeDiv(x: Int, y: Int): Either[Exception, Int] = try Right(x / y) catch {case e: Exception => Left(e) }

  def traverse[E, A, B](es: List[A])(f: A => Either[E, B]): Either[E, List[B]] =
    es match {
      case Nil => Right(Nil)
      case h :: t => (f(h) map2 traverse(t)(f)) (_ :: _)
    }

  def traverse_1[E, A, B](es: List[A])(f: A => Either[E, B]): Either[E, List[B]] =
    es.foldRight[Either[E, List[B]]](Right(Nil))((a, b) => f(a).map2(b)(_ :: _))


  def sequence[E, A](es: List[Either[E, A]]): Either[E, List[A]] =
    traverse(es)(x => x)



  def main(args: Array[String]): Unit = {

    val f = (x: Int, y: Int) => x / y
    val e = Either.Try(f(4, 0))
    println(e)


    val r = Either.Try(f(16, 8))
    println(r)

    val res = Try(f(16, 8)).map2(Try(f(22, 11)))((a: Int, b: Int) => a * b)
    println(res)

    val res1 = Try(f(16, 8)).map2(Try(f(22, 0)))((a: Int, b: Int) => a * b)
    println(res1)

  }

}






上述代码的运行结果是:

Left(java.lang.ArithmeticException: / by zero)
Right(2)
Right(4)
Left(java.lang.ArithmeticException: / by zero)










Scala 03 —— Scala OOP Extension Scala OOP重点扩展 阅读详情

相关推荐

13、探索 Scala 内置效应:Either、Try 和 Future 的深入解析

本文深入解析了 Scala 中的三种内置效应类型:Either、Try 和 Future。通过详细讲解它们的创建方式、读取方法以及作为效应时的操作特性,帮助开发者更好地处理程序中的不同结果和异常情况。文章还提供了这些类型的对比分析及实际应用案例,展示了如何在业务逻辑中综合使用它们来构建健壮且高效的异步程序。

ik678901的博客 131

scala either_使用Either和Option处理功能错误

关于本系列 本系列旨在将您的观点重新定位为实用的心态,帮助您以新的方式看待常见问题并找到改善日常编码的方式。 它探讨了函数式编程的概念,允许在Java语言中进行函数式编程的框架,在JVM上运行的函数式编程语言以及语言设计的一些未来方向。 该系列面向那些了解Java及其抽象如何工作,但很少或没有使用功能语言经验的开发人员。 当您调查诸如函数式编程之类的深层主题时,有时会出现迷人的分支...

cusi77914的博客 789

powerdesigner导出sql将name放到comment注释上

【代码】powerdesigner导出sql将name放到comment注释上。

weixin_45947759的博客 1353

Scala教程之:Either

在之前的文章中我们提到了Option,scala中Option表示存在0或者1个元素,如果在处理异常的时候Option就会有很大的限制,因为Option如果返回None,那么我并不知道具体的异常到底是什么,这样scala引入了Either。 顾名思意,Either表示或者是这一个元素或者是那个元素。这样在异常处理的时候就非常有用了。 我们先看一下Either的定义: sealed abstract...

程序那些事 3494

Elasticsearch连接中断:深入解析Connection reset by peer问题及优化策略

本文深入解析Elasticsearch连接中断问题,特别是Connection reset by peer错误的成因与解决方案。从TCP层的心跳机制到客户端与服务端的配置差异,详细介绍了网络不稳定、防火墙拦截等常见原因,并提供了六种优化策略,包括KeepAlive调整、TCP参数调优和智能重试机制等,帮助提升Elasticsearch连接的稳定性。

weixin_42546392的博客 411

基于陀螺仪航向反馈的轮式机器人PID直线控制

航向角控制是移动机器人实现稳定直线运动的基础技术,其本质是通过实时感知机体朝向偏差并动态调节驱动输出,以抵消机械不对称、轮径误差等固有扰动。该方法依托陀螺仪测量角速度并积分解算航向角,结合离散化PID算法生成补偿性PWM指令,在嵌入式平台(如STM32)上构建低延迟闭环。相比依赖编码器的速度闭环,它规避了轮径标定与安装偏心等误差源,显著提升低成本平台的工程鲁棒性与部署效率。典型应用场景包括教育机器人直线循迹、AGV基础导航模块开发及IMU-PID融合控制原型验证。

web39explorer的博客 1110

Scala中的Either的用法

在 Scala 中,Either 是一种表示两种可能值的数据类型。它可以用来处理函数可能返回的两种不同类型的结果,通常用于错误处理或者结果分支情况。Either 有两个子类:Left 和 Right,其中 Left 通常用于表示错误或异常情况,而 Right 用于表示正常的结果。下面是一个使用 Either 模拟承载当校验结果可能出现多个错误的情况时,如何来处理这些情况。注意:Either[String, User],左边的值类型代表出现异常时的返回数据类型,右边是正常情况下的返回值类型。

三劫散仙 978

关于StartAI本地部署相关问题解答

很多小伙伴们都有接入自己本地SD的需求,对此小编整理了一些相关问题~

HDJ9387的博客 940

Scala学习笔记18: Either 类型

Either类型为 Scala 开发者提供了一种更优雅、更安全的方式来处理可能失败的操作;它鼓励开发在代码中显式地处理成功和失败两种情况, 从而提高代码的健壮性和可读性 .

Taerge0110的博客 782

Modelsim安装教程以及管理员身份运行patch_dll.bat时找不到文件mgls.dll的解决

Modesim安装教程 Modesim版本有很多,但是安装方式大都相同,我们以modesim.10.5为例,电脑使用的是win10 64位,讲一下安装过程中的步骤以及出现问题的解决方法 一 安装 1.首先解压安装包,在解压的安装包内选择应用程序,右键选择管理员运行。 2.稍等一会,有的电脑会弹出是否允许modesim进行更改,选择 是 即可,然后出现下面的界面,点击下一步。 3.弹出此界面选择安装路径,选择安装路径,我是在D盘新建的文件夹,直接把文件夹中的路径复制在框内。文件夹名称切记不要带中文 4.

weixin_48564372的博客 1万+

泛微ecology9二次开发-附件上传接口实战:从表单创建到数据库存储解析

本文详细解析了泛微ecology9二次开发中的附件上传接口实战,从测试环境搭建、数据库表结构解析到接口代码实现,提供了全面的开发指南。重点介绍了文件上传的核心逻辑、常见问题排查及高级应用场景,帮助开发者高效实现附件上传功能并优化系统性能。

weixin_30836759的博客 478

67.scala编程思想笔记——使用Either

67.scala编程思想笔记——使用Either 欢迎转载,转载请标明出处: 源码下载连接请见第一篇笔记。          如果将每个错误都当做异常处理会使代码变得过于凌乱,scala引入了不相交并集来从方法中返回结果。          最初实验称为Either的并集,将left和right组合在一起。Left表示错误,Right携带成功的返回信息。          Either是

badman250的专栏 3万+

大语言模型(LLM)在组合优化中的新突破:LLM-LNS与FunSearch性能对比

本文深入探讨了大语言模型(LLM)在组合优化中的创新应用,重点对比了LLM-LNS与FunSearch两种方法的性能差异。研究表明,LLM-LNS在物流路径规划、资源调度等场景中展现出显著优势,其双层自演化架构能有效平衡探索与利用,相比传统方法提升效率约43%。文章还提供了实践选择指南,帮助开发者根据具体需求选用合适的技术方案。

weixin_42526415的博客 408

Scala Either, Left And Right

Scala中的Either是一个有趣的类,它代表两个可能的类型的其中一个类型的值。这两个值之间没有交集。 Either是抽象类,有两个具体的实现类:Left和Right。 Either可以作为scala.Option的替换,可以用scala.util.Left替换scala.None,用scala.Right替换scala.Some。 一般在时实践中使用scala.util.Left作为Failure,而scala.util.Right作为成功的值。 另一个类似的类是scala.util.Try 举个例.

liwenbluesky的专栏 777

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Olares CLI 用户密码强制重置指南:`olares-cli user reset-password` 命令详解

`user reset-password` 是 Olares CLI 中面向运维与管理员的核心用户管理子命令,它通过集群内的认证提供方(auth-provider)**强制重置**指定用户的登录密码,无需用户本人配合或输入旧密码。本文以该命令为线索,完整讲解其语法、参数、实战示例,并结合当前仓库源码剖析其底层实现链路(kubeconfig 加载、ServiceAccount Token 签发、认证

gitblog_01155的博客 621

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Scala中Either两个子类Left/Right

Scala中有Left,Right两个类,继承于Either,主要用途是表示两个可能不同的类型(它们之间没有交集),Left主要是表示Failure,Right表示有,跟Some类型有点类似。 案例: object EitherLeftRightExample extends App { /** * A simple method to demonstrate how to d...

LINBE_blazers的博客 1160

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Scala新手指南中文版 -第七篇 The Either type(Either类型)

译者注:原文出处http://danielwestheide.com/blog/2013/01/02/the-neophytes-guide-to-scala-part-7-the-either-type.html,翻译:Thomas   在前一篇中,我们讨论了用Try来进行函数式的错误处理,我也提到了另一个方案的存在,那就是我们这一章要讲到的Either类型。在这里你会学到如何使用它,何

thomassuns的专栏 1155

Scala语言的数据结构

Scala是一门支持面向对象和函数式编程的现代编程语言,它在JVM上运行,具有强大的类型系统和丰富的标准库。Scala中的数据结构是其编程的重要组成部分,合理使用数据结构可以让代码更加简洁高效。本文将详细介绍Scala中常用的数据结构,包括集合、元组、Option、Either等,并分析它们的使用场景和优势。

2501_90199875的博客 1061

67 scala编程思想笔记——使用Either

67 scala编程思想笔记——使用Either

ugghhj的博客 147

如何用Scala Either实现无异常编程?资深架构师亲授6步法

掌握Scala要么类型,实现无异常编程。本文分享资深架构师总结的6步法,涵盖错误处理、函数组合与实际应用场景,提升代码健壮性与可读性。利用Either优雅替代异常,值得收藏。

QuickCode的博客 747

Scala中Either类型实战指南(从入门到高阶用法大公开)

掌握Scala要么类型核心技巧,解决函数式错误处理难题。详解Either类型在异常处理、数据验证等场景的应用,结合模式匹配与for推导提升代码健壮性。深入浅出讲解左值右值操作及高阶用法,值得收藏。

ByteVein的博客 774

scala 系列 ----使用Option、Either和Try处理数据交互

Scala数据交互 Scala使用一种函数式的方式来处理数据交互,包括入参及返回值。 Option: 解决null(空指针)问题 Either: 解决返回值不确定(返回两个值的其中一个)问题 Try: 解决函数可能会抛出异常问题 Option/Some/None的使用 Option实际上有3个类型:Option、Some和None,Some和None都是Option的子类型,Some和None。Option表示可选的值,它的返回类型是scala.Some或scala.None。Some代表返回

mojolang 788

Scala Either Left Right

Either 官网Either 代表两个可能类型的值,两个之间没有交集 是scala.util.Left or scala.util.Right 的实现类 可以做scala.option的替换 ,scala.util.Left 替换scala.None,scala.util.Right替换scala.Some 时实践中使用scala.util.Left作为Failure scala.util.Right作为成功的值 官方demo object EitherDemo { def main(args:

花木兰 584

优雅的错误处理:如何在Scala中使用Either处理函数的双重返回值

EitherLeft:通常用于表示错误或异常情况Right:通常用于表示成功或正确的结果// 模拟数据库查询if (id <= 0) Left(ValidationError(s"无效的用户ID:id"))else Right(User(id, "测试用户", 30))约定俗成:通常使用Left表示错误,Right表示成功类型别名:为常用类型定义别名,如具体错误类型:使用密封特质(sealed trait)定义领域特定的错误类型组合使用:利用for推导式组合多个Either操作转换边界。

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 2094

彻底搞懂Scala Either:3个关键技巧让你代码健壮性提升80%

掌握Scala要么类型处理新思路,3个技巧高效避免空值异常。详解Either在错误处理、函数返回中的实战应用,结合模式匹配与for推导提升代码健壮性。清晰示例带你理解左右值使用场景,值得收藏。

DeepNest的博客 690
上一篇: 使用Scala实现Option数据结构
下一篇: 用Scala实现Stream(一个惰性的链表)数据结构
lhever_
博客等级 码龄14年 213粉丝 130原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值