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不,恐怕那样的话,你得把它留在方法上。