首页 > 解决方案 > 如何显式调用和使用 Functor 函数

问题描述

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

嗯......有没有更直接的方法来解决这个问题,因为这对于复杂的功能往往会变得非常乏味。

标签: scalascala-cats

解决方案


你可以写

val ff = Functor[Int => ?].map(f1)(f2)

如果你添加 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)

推荐阅读