【发布时间】:2018-07-21 22:30:55
【问题描述】:
我们正在创建自己的 OptionT 猫,以了解单子如何工作以及单子转换流程。在创建我们自己的自定义 monad 时遇到一些错误。下面首先是我们的代码:
case class WhateverOpt[W[_], A] (value: W[Option[A]]) {
def map[B] (f: A => B) (implicit M: Monad[W]): WhateverOpt[W, B] =
WhateverOpt(M.map(value)(_.map(f)))
def flatMap[B] (f: A => WhateverOpt[W, B]) (implicit M: Monad[W]): WhateverOpt[W, B] =
WhateverOpt(M.flatMap(value)(optA => optA match {
case Some(v) => f(v).value
}))
}
implicit val optionTMonad = new Monad[Option] {
override def map[A, B](fa: Option[A])(f: A => B): Option[B] = fa.map(f)
override def flatMap[A, B](fa: Option[A])(f: A => Option[B]): Option[B] = fa.flatMap(f)
}
val optionResult = for {
user <- WhateverOpt(repository.getUserOption(1))
addres <- WhateverOpt(repository.getAddressOption(user))
} yield addres.city
以下是我们卡住的地方:
- 如何处理
WhateverOptflatMap方法中的None大小写? - 执行代码时,出现运行时错误:
Error:(26, 12) could not find implicit value for parameter M: usercases.mtransfomer.Monad[scala.concurrent.Future] addres <- WhateverOpt(repository.getAddressOption(user))
我们不确定错误,因为我们正在创建 optionTMonad 隐式,并且默认情况下,所有这些都在同一范围内。我们如何解决这两个问题?
更新
Github 分支https://github.com/harmeetsingh0013/fp_scala/blob/master/src/main/scala/usercases/mtransfomer/Example5.scala提供完整代码
【问题讨论】:
-
链接似乎不起作用,github 给出了 404 和一个 jedi-octocat。
-
谢谢@AndreyTyukin,您现在可以查看。
标签: scala monads monad-transformers scala-cats