代码之家  ›  专栏  ›  技术社区  ›  sarveshseri

如何显式调用函数的函子

  •  0
  • sarveshseri  · 技术社区  · 6 年前
    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 回复  |  直到 6 年前
        1
  •  4
  •   Dmytro Mitin    6 年前

    你可以写

    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)
    
        2
  •  0
  •   Matthias Berndt    6 年前

    import cats.syntax.functor._
    import cats.instances.function._
    val mul4 = ((a: Int) => a * 2).map(_ * 2)
    

    为了让它工作,你需要 -Ypartial-unification 编译器标志( scalacOptions += "-Ypartial-unification" 如果你正在使用sbt)。在将来的scala版本中,默认情况下可能会启用这个标志。