2017-01-06 14 views
1

Новое в скалазе, но я представляю здесь вещи? 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)

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 

Это ошибка в Скалазе/или я просто сумасшедший? Я пробовал из последних версий Scala/Scalaz версии 2.12.1/7.2.8 до 2.11.8/7.2.6.

+1

Вы на самом деле псих. val rightS = resultS.right.getOrElse ("не правильно") Почему вы звоните. В порядке на дизъюнкцию? –

ответ

0

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