【发布时间】:2019-12-24 09:31:23
【问题描述】:
示例取自Tagless Final in Mastering Functional Programming:
trait Capabilities[F[_]] {
def resource(name: String): F[String]
def notify(target: String, text: String): F[Unit]
}
import cats.Monad
def income[F[_]](implicit M: Monad[F], C: Capabilities[F]): F[Unit] =
for {
contents <- C.resource("sales.csv")
total = contents
.split("\n").toList.tail // Collection of lines, drop the CSV header
.map { _.split(",").toList match // List[Double] - prices of each of the entries
{ case name :: price :: Nil => price.toDouble }
}
.sum
_ <- C.notify("admin@shop.com", s"Total income made today: $total")
} yield ()
为了编译,我必须包括:
import cats.implicits._
没有这个,我得到一个错误:
错误:(21, 27) 值映射不是类型参数 F[String] 的成员 内容
两个问题:
-
F的类型事先未知。但是有Monad和Capabilities为F定义implicitly。为什么 Scala 编译器在没有从猫中隐式导入的情况下无法识别它。 - 通常我更喜欢找到某个类型,而不是从
cats导入所有东西。例如,更准确地说,只导入cats.instances.list._。来自cats.implicits._的 Scala 编译器究竟使用了什么来编译这段代码?更重要的是,您使用什么算法来找到它? - 我还发现,如果我添加
-Xprint-args选项,即使没有cats.implicits._导入,也可以成功编译代码。你能解释一下,它是如何影响它的吗?
【问题讨论】:
标签: scala monads implicit scala-cats for-comprehension