import scala.language.higherKinds
import cats.Functor
import cats.instances.list._
import cats.instances.function._
val list1 = List(1, 2)
val list2 = Functor[List].map(list1)(i => i + 1)
但是对于功能而言,事情进展得并不顺利
val f1 = (i: Int) => i.toString
val f2 = (s: String) => s
而且我们不得不求助于骗术,
scala> type TTT[A] = Int => A
// defined type alias TTT
scala> val ff = Functor[TTT].map(f1)(f2)
// ff: TTT[String] = scala.Function1$$Lambda$607/69160933@3a689738
好吧...还有一种更直接的方法来解决此问题,因为对于复杂的功能,这往往变得非常乏味。
答案 0 :(得分:3)
您可以写
val ff = Functor[Int => ?].map(f1)(f2)
如果您从add addCompilerPlugin("org.spire-math" %% "kind-projector" % "0.9.7")
到build.sbt
。
或者您可以导入函子语法import cats.syntax.functor._
,然后使用ascription类型编写
val ff = (f1: TTT[String]).map(f2)
或带有显式类型注释
val f1: TTT[String] = (i: Int) => i.toString
val ff = f1.map(f2)
答案 1 :(得分:0)
为什么首先要显式召唤类型类实例? cats包含对functor的语法支持,因此不需要。
import cats.syntax.functor._
import cats.instances.function._
val mul4 = ((a: Int) => a * 2).map(_ * 2)
要使其正常工作,您需要使用-Ypartial-unification
编译器标志(如果使用的是sbt,则需要scalacOptions += "-Ypartial-unification"
)。将来的scala版本中可能会默认启用此标志。