【发布时间】:2018-04-21 05:21:04
【问题描述】:
我一直在研究 Cats/Scalaz 的一些基本示例,还通过教程来感受一下,我遇到了一个我确信有解决方案的案例。
是否可以使用具有上下文为<: F 的 Functor 视图 (F[_] : Functor) 来调用采用上下文化值 (F[A]) 的通用函数?我知道 Functor 在类型 F[_] 上是不变的,而且我也知道 Functor.widen 的存在,但似乎很奇怪,没有办法隐式地扩展我的类型以用于一般函数。
Cats 中的一个示例(Scalaz 中也存在类似示例):
import cats.instances.all._
import cats.syntax.all._
def takesAFunctor[F[_] : cats.Functor](f: F[Int]) = f.map(_ + 1)
takesAFunctor(Option(1)) // Works fine (of course)
takesAFunctor(Some(1)) // No implicit for Functor[Some]. Makes sense, but can we summon one since we have a Functor[Option]?
takesAFunctor(Some(1): Option[Int]) // Works but very verbose
当然,为 Option 显式调用 Functor 并按预期进行映射
Functor[Option].map(Some(1))(_ + 1) // Some(2)
所以我的问题是:通用函数的签名是否需要更改以考虑子类上下文,是否存在某种我不知道的“隐式扩展”,或者这只是一个不幸的缺点在 Scala 中使用 stdlib 进行函数式编程?
【问题讨论】:
标签: scala functional-programming functor scalaz scala-cats