2017-01-06 18 views
1

스 카즈에 처음 오셨습니까? 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)

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

동일한 결과를 얻을 것입니다 미친. val rightS = resultS.right.getOrElse ("올바르지 않습니다") 왜 전화를 걸었습니까? –

답변

0

resultS.rightOption[String]을 반환하지 않지만 (예 : s"AOK".right을 호출 할 때와 같이) 분리의 올바른 분리는 반환하지 않습니다. ScalaZ 분리가 올바르게 기울기 때문에 getOrElse 함수를 사용하여 올바른 방법을 얻을 수 있습니다. 따라서 Option이 아닌 접속구에 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, _))