Scala 如何实现选项的flatMap

Scala 如何实现选项的flatMap,scala,monads,scala-option,enrich-my-library,flatmap,Scala,Monads,Scala Option,Enrich My Library,Flatmap,我正在尝试实现map和flatMap作为选项的扩展/充实,而不是欺骗和查看它是如何在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[_]]

我正在尝试实现
map
flatMap
作为
选项的扩展/充实,而不是欺骗和查看它是如何在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))
有什么提示吗

def flatMap[A, B](right: A => Option[B]): Option[B] = left match {
  None => None
  Some(x) => right(x)
}
或者类似于scala标准库的功能

def flatMap[A, B](right: A => Option[B]): Option[B] =
  if (left.isEmtpy) None else right(left.get)

首先,我要正确定义Monad。
const
(或者
return
或者你想怎么称呼它)?@sschae如果我只使用了最基本的功能,即monad的
bind
(这里是
flatMap
)函数,当我找到它的时候,我会为
return
而烦恼你不想通过看scalaz作弊,但你却要求解决这个问题?我不明白。@Gabrieleptronella我有我的理由,也许有更好/更简单的解决方案,因为我不想要scalaz实现中的全部功能monad最基本的功能是
bind
const
。当其中一个缺失时,您无法实现monad。当我尝试在
右侧
而不是
左侧
@上进行匹配时,我感觉自己做错了。顺便说一句,您可以从方法中删除
a
参数,因为它已经在类中。是的,我已经这样做了,虽然如果我从函数中删除它,我必须将它添加到trait中,除非你有更聪明的方法来解决这个问题too@ElectricCoffee不,恐怕那样的话,你得把它留在方法上。