Как реализовать flatMap для Option

Я пытаюсь реализовать map а также flatMap как расширение / обогащение для Option, не обманывая и не глядя на то, как это было реализовано в Скалазе.

Вот что я получил до того, как застрял:

package extensions.monad

trait Monad[M[_]] {
  // >>= :: Monad m => m a -> (a -> m b) -> m b
  def flatMap[A, B](input: A => M[B]): M[B]
}

trait Functor[F[_]] {
  // fmap :: Functor f => (a -> b) -> f a -> f b
  def map[A, B](input: A => B): F[B]
}

object MOption {
  implicit class MonadicOption[A](left: Option[A]) extends Monad[Option[A]] with Functor[Option[A]] {
    def flatMap[A, B](right: A => Option[B]): Option[B] = ???

    def map[A, B](right: A => B): Option[B] = ???
  }
}

Все, что мне действительно нужно, это базовая функциональность, поэтому я могу сделать что-то вроде этого:

Some(3).flatMap(x => Some(4).map(y => x + y))

Есть намеки?

1 ответ

Решение
def flatMap[A, B](right: A => Option[B]): Option[B] = left match {
  None => None
  Some(x) => right(x)
}

или аналогично тому, что делает библиотека scala std

def flatMap[A, B](right: A => Option[B]): Option[B] =
  if (left.isEmtpy) None else right(left.get)
Другие вопросы по тегам