Как явно вызвать и использовать Functor для функции - PullRequest
0 голосов
/ 13 сентября 2018
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 голосов
/ 06 октября 2018

Зачем вам явно вызывать экземпляр класса типов? Cat включает в себя поддержку синтаксиса для функтора, поэтому в этом нет необходимости.

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

Чтобы это работало, вам понадобится флаг компилятора -Ypartial-unification (scalacOptions += "-Ypartial-unification", если вы используете sbt). Этот флаг, вероятно, будет включен по умолчанию в будущих версиях Scala.

0 голосов
/ 13 сентября 2018

Вы можете написать

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)
...