美文网首页
不是用异常来处理错误(2)

不是用异常来处理错误(2)

作者: 吐思圈 | 来源:发表于2018-02-22 23:21 被阅读0次

Option不会告诉我们在异常条件下发生了什么错误,它只是给我们一个None,表示没有可用的值。但是有时候我们想知道更多,比如想要一个字符串给出更多的信息或者异常发生时想知道实际错误是什么。这时候我们需要Either数据类型。
Either数据类型

sealed trait Either[+E, +A] {

}

case class Left[+E](e: E) extends Either[E, Nothing]

case class Right[+A](a: A) extends Either[Nothing, A]

练习 4.6
实现Either版的map、flatMap、orElse和map2函数

 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, B >: A](b: => Either[EE, B]): Either[EE, B] = this match {
    case Left(e) => b
    case _ => this
  }

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

练习 4.7
对Either实现sequence和traverse,遇到错误返回第一个错误。

  def sequence[E, A](li: List[Either[E, A]]): Either[E, List[A]] = {
    def loop(n: Int, res: Either[E, List[A]]): Either[E, List[A]] = n match {
      case -1 => res
      case _ => li(n) match {
        case Left(e) => Left(e)
        case Right(a) => loop(n - 1, res.map(a :: _))  
      } 
    }
    loop(li.length - 1, Right(Nil))
  }
  
  def traverse[E, A, B](li: List[A])(f: A => Either[E, B]): Either[E, List[B]] =
    sequence(li.map(f))

相关文章

  • 不是用异常来处理错误(2)

    Option不会告诉我们在异常条件下发生了什么错误,它只是给我们一个None,表示没有可用的值。但是有时候我们想知...

  • 异常

    Python用异常对象(exception object)来表示异常情况,遇到错误后会引发异常。如果异常没有被处理...

  • 2.1.3 Python面向对象之异常处理

    点击跳转笔记总目录 Python面向对象之异常处理 一、错误与异常 二、异常处理 三、什么时候用异常处理 一、错误...

  • Java--异常处理

    异常 异常不是编译时的错误(Error),异常是运行时错误(Exception) 异常处理流程 代码出现错误后,它...

  • Python异常处理

    Python异常处理 一、捕获异常 1.异常捕获语法 2.错误类型捕获 except:处理所有异常。except ...

  • 异常处理

    异常处理简介 1.什么是异常处理 异常时程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的。...

  • 不是用异常来处理错误(1)

    在函数式解决方案中,以值的方式返回错误是更加安全,符合引用透明,并且可以通过高阶函数保存异常的优点--统一处理错误...

  • 【第七天】Python的异常处理

    3.5异常处理 1.bug 语法错误运行时错误语义错误 2.Debug 3.异常处理 对于运行时可能产生的错误,我...

  • 章节笔记——异常处理

    异常出现,程序变得强大,异常是处理错误的机制 1. 用try...catch处理异常 处理程序员控制和用户输入有误...

  • Swift中的异常处理

    1、错误和异常处理2、断言3、fatalError 1、错误和异常处理 在方法后面加throws关键字表示这个方法...

网友评论

      本文标题:不是用异常来处理错误(2)

      本文链接:https://www.haomeiwen.com/subject/qsaztftx.html