Esempio di Either Monad

This commit is contained in:
Fabio Scotto di Santolo
2019-12-29 19:24:26 +01:00
parent a238db765b
commit cdb4b8ef1a
2 changed files with 49 additions and 0 deletions

View File

@@ -0,0 +1,27 @@
package org.gym.fp
// data type
sealed trait BooleanResult[+A] {
def map[B](f: A => B): BooleanResult[B]
def flatMap[B](f: A => BooleanResult[B]): BooleanResult[B]
}
// data constructor
case class TrueResult[A](value: A) extends BooleanResult[A] {
override def map[B](f: A => B): BooleanResult[B] = TrueResult(f(value))
override def flatMap[B](f: A => BooleanResult[B]): BooleanResult[B] = f(value)
}
case class FalseResult[A]() extends BooleanResult[A] {
override def map[B](f: A => B): BooleanResult[B] = FalseResult()
override def flatMap[B](f: A => BooleanResult[B]): BooleanResult[B] = FalseResult()
}

View File

@@ -0,0 +1,22 @@
package org.gym.fp
case class Failed(msg: String)
object EitherExample extends App {
println(giveMeAnAnswer(divideXByY(1, 0)))
println(giveMeAnAnswer(divideXByY(1, 1)))
def divideXByY(x: Int, y: Int): Either[String, Int] = {
if (y == 0) Left("Dude, can't divide by 0") else Right(x / y)
}
private def giveMeAnAnswer(question: Either[String, Int]): String = {
question match {
case Left(value) => "Answer: " + value
case Right(value) => "Answer: " + value
case _ => "I don't known"
}
}
}