scala - 未找到函数的隐式
问题描述
我有这个类型类
import simulacrum._
@typeclass trait Functor[F[_]] {
def map[A, B](fa: F[A])(f: A => B) : F[B]
def lift[A, B](fa: F[A])(f: A => B) : F[A] => F[B] = fa => map(fa)(f)
def as[A, B](fa: F[A], b: => B) : F[B] = map(fa)(_ => b)
def void[A](fa: F[A]) : F[Unit] = as(fa, ())
}
这就是实现
object Functor {
implicit val listFunctor: Functor[List] = new Functor[List] {
def map[A, B](fa: List[A])(f: A => B) = fa.map(f)
}
implicit def functionFunctor[X]: Functor[X => ?] = new Functor[X => ?] {
def map[A, B](fa : X => A)(f : A => B) = fa andThen f
}
}
我可以很容易地发现 List 隐式实现为
object Chapter1 extends App {
import Functor.ops._
List(1, 2, 3).as("foo").foreach(println)
}
上面的工作非常好。我也可以
object Chapter1 extends App {
import Functor._
val func : Int => String = implicitly[Functor[Int => ?]].map(_ + 2)(_.toString)
println(func(5))
}
但是当我尝试
object Chapter1 extends App {
import Functor.ops._
val x : Int => Int = _ + 2
val y : Int => String = x.map(_.toString)
}
它没有找到我的隐式实现,并说该值map
不是 Int => Int 的成员
解决方案
Int => Int
编译器看不到Int => ?
应用于Int
.
添加
scalacOptions += "-Ypartial-unification"
构建.sbt。
使用 Cats、Scalaz 或手动使用更高种类的类型进行正常工作是必要的。
顺便说一句,没有意义import Functor._
推荐阅读
- decidable - 具有有限状态的给定 TM 是否可判定?
- python - 在 Python 中打印倒金字塔
- java - 当对象足够大时,如何告诉杰克逊序列化程序停止继续序列化和写入
- mongodb - 如何使用 mongoDB 中的聚合为数组中的每个元素添加求和字段
- python - Python ThreadPoolExecutor:没有按预期工作?
- flutter - 单引号中的flutter_html图像src标签
- generics - 从 num 扩展的泛型类型和从 int 到 double 类型转换的问题
- postgresql - JackRabbit OAK:在 postgresql 中生成空闲 DB 事务
- scala - Scala 编译器抛出:java.lang.IllegalAccessError: Class 'scala.tools.nsc.transform.patmat.PatternExpansion$ExtractorAlignment'
- c# - 在没有 JS 的 Blazor 中将焦点设置在 InputText 上