如何显式调用和使用 Functor 作为函数
How to explicitly summon and use Functor for function
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$$Lambda7/69160933@3a689738
嗯...有没有更直接的方法来解决这个问题,因为这对于复杂的函数来说往往会变得非常乏味。
你可以写
val ff = Functor[Int => ?].map(f1)(f2)
如果你 add addCompilerPlugin("org.spire-math" %% "kind-projector" % "0.9.7")
到 build.sbt
.
或者你可以导入仿函数语法import cats.syntax.functor._
然后写成类型归属
val ff = (f1: TTT[String]).map(f2)
或带有显式类型注释
val f1: TTT[String] = (i: Int) => i.toString
val ff = f1.map(f2)
为什么一开始就明确地召唤类型 class 的实例? cats 包含对仿函数的语法支持,因此没有必要。
import cats.syntax.functor._
import cats.instances.function._
val mul4 = ((a: Int) => a * 2).map(_ * 2)
为了让它工作,您需要 -Ypartial-unification
编译器标志(scalacOptions += "-Ypartial-unification"
如果您使用的是 sbt)。在未来的 scala 版本中,这个标志可能会默认启用。
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$$Lambda7/69160933@3a689738
嗯...有没有更直接的方法来解决这个问题,因为这对于复杂的函数来说往往会变得非常乏味。
你可以写
val ff = Functor[Int => ?].map(f1)(f2)
如果你 add addCompilerPlugin("org.spire-math" %% "kind-projector" % "0.9.7")
到 build.sbt
.
或者你可以导入仿函数语法import cats.syntax.functor._
然后写成类型归属
val ff = (f1: TTT[String]).map(f2)
或带有显式类型注释
val f1: TTT[String] = (i: Int) => i.toString
val ff = f1.map(f2)
为什么一开始就明确地召唤类型 class 的实例? cats 包含对仿函数的语法支持,因此没有必要。
import cats.syntax.functor._
import cats.instances.function._
val mul4 = ((a: Int) => a * 2).map(_ * 2)
为了让它工作,您需要 -Ypartial-unification
编译器标志(scalacOptions += "-Ypartial-unification"
如果您使用的是 sbt)。在未来的 scala 版本中,这个标志可能会默认启用。