- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设我想编写一个具有以下签名的方法:
def parse(input: List[(String, String)]):
ValidationNel[Throwable, List[(Int, Int)]]
import scalaz._, Scalaz._
case class InvalidSizes(x: Int, y: Int) extends Exception(
s"Error: $x is not smaller than $y!"
)
def checkParses(p: (String, String)):
ValidationNel[NumberFormatException, (Int, Int)] =
p.bitraverse[
({ type L[x] = ValidationNel[NumberFormatException, x] })#L, Int, Int
](
_.parseInt.toValidationNel,
_.parseInt.toValidationNel
)
def checkValues(p: (Int, Int)): Validation[InvalidSizes, (Int, Int)] =
if (p._1 >= p._2) InvalidSizes(p._1, p._2).failure else p.success
def parse(input: List[(String, String)]):
ValidationNel[Throwable, List[(Int, Int)]] = input.traverseU(p =>
checkParses(p).fold(_.failure, checkValues _ andThen (_.toValidationNel))
)
def checkParses(p: (String, String)):
NonEmptyList[NumberFormatException] \/ (Int, Int) =
p.bitraverse[
({ type L[x] = ValidationNel[NumberFormatException, x] })#L, Int, Int
](
_.parseInt.toValidationNel,
_.parseInt.toValidationNel
).disjunction
def checkValues(p: (Int, Int)): InvalidSizes \/ (Int, Int) =
(p._1 >= p._2) either InvalidSizes(p._1, p._2) or p
def parse(input: List[(String, String)]):
ValidationNel[Throwable, List[(Int, Int)]] = input.traverseU(p =>
checkParses(p).flatMap(s => checkValues(s).leftMap(_.wrapNel)).validation
)
\/
,因为
ValidationNel[Throwable, _]
没有单子(monad)实例)。
ValidationNel
从始至终,然后
fold
最后作为一种假
flatMap
.第二,我在
ValidationNel
之间来回跳动。和
\/
视情况而定,具体取决于我是否需要错误累积或一元绑定(bind)。它们产生相同的结果。
最佳答案
以下是我对 Cats 的第二版代码的非常接近的翻译。 :
import scala.util.Try
case class InvalidSizes(x: Int, y: Int) extends Exception(
s"Error: $x is not smaller than $y!"
)
def parseInt(input: String): Either[Throwable, Int] = Try(input.toInt).toEither
def checkValues(p: (Int, Int)): Either[InvalidSizes, (Int, Int)] =
if (p._1 >= p._2) Left(InvalidSizes(p._1, p._2)) else Right(p)
import cats.data.{EitherNel, ValidatedNel}
import cats.instances.either._
import cats.instances.list._
import cats.syntax.apply._
import cats.syntax.either._
import cats.syntax.traverse._
def checkParses(p: (String, String)): EitherNel[Throwable, (Int, Int)] =
(parseInt(p._1).toValidatedNel, parseInt(p._2).toValidatedNel).tupled.toEither
def parse(input: List[(String, String)]): ValidatedNel[Throwable, List[(Int, Int)]] =
input.traverse(fields =>
checkParses(fields).flatMap(s => checkValues(s).toEitherNel).toValidated
)
ValidatedNel
和
Either
之间来回切换”。
Parallel
type class (在
Cats 2.0.0 中改进)正好解决了我遇到的问题:
import cats.data.EitherNel
import cats.instances.either._
import cats.instances.list._
import cats.instances.parallel._
import cats.syntax.either._
import cats.syntax.parallel._
def checkParses(p: (String, String)): EitherNel[Throwable, (Int, Int)] =
(parseInt(p._1).toEitherNel, parseInt(p._2).toEitherNel).parTupled
def parse(input: List[(String, String)]): EitherNel[Throwable, List[(Int, Int)]] =
input.parTraverse(fields =>
checkParses(fields).flatMap(checkValues(_).toEitherNel)
)
par
我们的应用运算符版本,如
traverse
或
tupled
当我们想要累积错误时,否则我们正在
Either
中工作,这给了我们一元绑定(bind),我们不再需要引用
Validated
一点也不。
关于验证与析取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20065853/
在 C++ 中实现两个 std::vector 之间的逻辑析取的最优雅的方法是什么? 例如: vector a = {0,1,2,3,4,5,6,7,8,9}; vector b = {0,1,2,3
有人知道如何对空析取进行条件检查吗? Disjunction dis = Restrictions.disjunction(); if(dis) { } 最佳答案 您可以尝试: if(dis == n
我有 3 个不同的模块,每个模块都有自己的错误类型。以下是一个非常简化的版本。 object ModuleA { case class ErrorA(msg: String) def getA
我想知道是否有一种方法可以更方便地格式化测试表达式中的连接。目前它看起来像这样: 如果我想在这里测试大约 10 个元素,那么查找我已经添加的元素非常不方便。 2.0中有类似的东西吗?
为什么?我正在为 Java-Scala 适配器类编写测试。 如何在 Java 中为 \/[String, Int] 创建左右析取? 最佳答案 Scala方法名中的符号其实是有脱糖的,用来在JVM中确定
我一直在研究用于自定义/关系查询的 Parse API,但无法找到创建模拟 AND 析取查询的示例。例如,我想找到一个对象,其“第一”和“最后”列分别匹配值“John”和“Doe”。 PARSE AP
我有以下场景,我必须检查 URL 是否正确构建并提供了一些查询参数。我不希望系统在呈现的 URL 中应用特定的顺序,所以我带来了以下我希望工作的测试用例: it('test that url is b
我是一名优秀的程序员,十分优秀!