我尝试将map
和flatMap
作为Option
的扩展/丰富实现,而没有作弊并查看它是如何在Scalaz中实现的。
所以这就是我在被困之前到目前为止所得到的:
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))
任何提示?
答案 0 :(得分:2)
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)