Scalaz脱节是否意味着要取代标准库?

时间:2017-01-06 03:37:41

标签: 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".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)
  }
}

为right生成以下输出(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。

1 个答案:

答案 0 :(得分: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, _))