Scalaz析取是否意味着要取代标准库';是吗?

Scalaz析取是否意味着要取代标准库';是吗?,scala,scalaz,either,Scala,Scalaz,Either,对scalaz来说是新事物,但我在这里想象吗?Scalaz的/旨在替换标准库的,但我在获取任何一方的值时遇到问题。一个简单的测试类,比较/比较: package com.example import scalaz.\/ import scalaz.syntax.either._ class TestEither { def returnEitherScalaz(p: Int): \/[Int, String] = { if (p > 0) s"AOK".righ

对scalaz来说是新事物,但我在这里想象吗?Scalaz的/旨在替换标准库的,但我在获取任何一方的值时遇到问题。一个简单的测试类,比较/比较:

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)

左侧(testValue=0)


这是Scalaz的bug还是我疯了?我试过从最新的Scala/Scalaz版本2.12.1/7.2.8返回到2.11.8/7.2.6。

结果。right
不返回
选项[String]
,而是右边的析取(比如当您调用
s“AOK”。right
)。由于ScalaZ析取是右倾的,因此还可以使用
getOrElse
函数为您提供获取右侧的方法。因此,您是在析取上调用
getOrElse
,而不是在
选项上调用

使用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, _))

你真是疯了。val rightS=resultS.right.getOrElse(“not right”)你为什么要打电话。就在析取上?
result=-\/(0)
isRight=false
isLeft=true
right=-\/(0)
left=not left
result=Left(0)
isRight=false
isLeft=true
right=not right
left=0
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, _))