【问题标题】:Is the Scalaz disjunction \/ meant to replace the standard library's Either?Scalaz 析取 \/ 是否意味着替换标准库的 Either?
【发布时间】:2017-01-06 03:37:41
【问题描述】:

scalaz 的新手,但我在这里想象吗? Scalaz 的 / 旨在替换标准库的 Either,但我在获取任何一方的值时都遇到了问题。一个比较 / 和 Either 的简单测试类:

package com.example

import scalaz.\/
import scalaz.syntax.either._

class TestEither {
  def returnEitherScalaz(p: Int): \/[Int, String] = {
    if (p > 0)
      s"AOK".right
    else
      p.left
  }

  def returnEitherDefault(p: Int): Either[Int, String] = {
    if (p > 0)
      Right(s"AOK")
    else
      Left(p)
  }
}

object TestRunner {
  def main(args: Array[String]): Unit = {
    val te = new TestEither

    val testValue = 1

    val resultS = te.returnEitherScalaz(testValue)
    println("result=" + resultS)
    println("isRight=" + resultS.isRight)
    println("isLeft=" + resultS.isLeft)

    val rightS = resultS.right.getOrElse("not right")
    println("right=" + rightS)

    val leftS = resultS.left.getOrElse("not left")
    println("left=" + leftS)

    val resultD = te.returnEitherDefault(testValue)
    println("result=" + resultD)
    println("isRight=" + resultD.isRight)
    println("isLeft=" + resultD.isLeft)

    val rightD = resultD.right.getOrElse("not right")
    println("right=" + rightD)

    val leftD = resultD.left.getOrElse("not left")
    println("left=" + leftD)
  }
}

为右 (testValue = 1) 产生以下输出

result=\/-(AOK)
isRight=true
isLeft=false
right=\/-(AOK)
left=not left
result=Right(AOK)
isRight=true
isLeft=false
right=AOK
left=not left

左边(testValue = 0)

result=-\/(0)
isRight=false
isLeft=true
right=-\/(0)
left=not left
result=Left(0)
isRight=false
isLeft=true
right=not right
left=0

这是 Scalaz 的错误 / 还是我疯了?我已经尝试从最新的 Scala/Scalaz 版本 2.12.1/7.2.8 回到 2.11.8/7.2.6。

【问题讨论】:

  • 其实你疯了。 val rightS = resultS.right.getOrElse("not right") 为什么要在析取上调用 .right?

标签: scala scalaz either


【解决方案1】:

resultS.right 不返回Option[String],而是该析取的右析取(例如当您调用s"AOK".right 时)。由于 ScalaZ 析取是右倾的,getOrElse 函数也可以为您提供一种获得右侧的方法。因此,您在析取上调用getOrElse,而不是Option

使用 ScalaZ,您不会直接访问左右,而是通常将结果折叠、映射、模式匹配、恢复等。这将达到相同的结果

def printRightLeft(l: Option[Int], r: Option[String]) = {
  println(s"right=${r.getOrElse("not right")}")
  println(s"left=${l.getOrElse("not left")}")
}

resultS
  .bimap(Option.apply, Option.apply)
  .bimap(printRightLeft(_, None), printRightLeft(None, _))

【讨论】:

    猜你喜欢
    • 2017-05-05
    • 2014-08-15
    • 1970-01-01
    • 1970-01-01
    • 2013-01-05
    • 2018-06-11
    • 2019-03-10
    • 2015-03-12
    相关资源
    最近更新 更多