如何显式召唤并将Functor用于功能

时间:2018-09-13 07:46:34

标签: scala scala-cats

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

好吧...还有一种更直接的方法来解决此问题,因为对于复杂的功能,这往往变得非常乏味。

2 个答案:

答案 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版本中可能会默认启用此标志。