scala - 使用 Cats Functor 提升函数

标签 scala scala-cats

有了猫,我可以编写这个简单的程序

def foo(x: Int) = x + 1
val bar = Functor[Future](foo)

现在我可以执行 bar(future(1)) 并获得 Future.Success(2) 作为结果。非常好。

但是假设我的功能是

def foo[T](x: T)(implicit m: Manifest[T]) : String = {...}

现在如果我尝试解除这个功能

def futureFoo = Functor[Future].lift(foo)

我收到编译器错误No Manifest available for T.

那么如何解除这个功能呢?

我搜索并找到了这个线程(用于 scalaz)

Lifting a function which takes implicit parameter using functor (Scalaz7)

但我仍然无法创造出任何对我有用的东西。我试过了

val futureFoo = Functor[T].lift2(foo[T] _)

但这不能编译

最佳答案

Scala 中的函数不能有隐式参数,因此当您尝试将带有隐式参数的方法进行 eta 扩展为函数时,需要在应用函数本身之前先解析隐式参数。即,在 eta 扩展时。编译器在范围内没有通用的 Manifest[T],但 futureFoo 可能需要一个。

def foo[T](x: T)(implicit m: Manifest[T]) : String = ""

scala> def optionFoo[T: Manifest] = Functor[Option].lift(foo[T] _)
optionFoo: [T](implicit evidence$1: Manifest[T])Option[T] => Option[String]

我使用了Option,因为我没有现成的Functor[Future],同样的概念也适用。请注意,为了使用它,您需要手动提供类型参数以使其返回正确的函数。

scala> optionFoo[Int].apply(Option(1))
res2: Option[String] = Some()

关于scala - 使用 Cats Functor 提升函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43128214/

相关文章:

scala - 使用 rediscala 批量插入

performance - 如何有效地从 Spark 中的每一列中找到不同的值

scala - 在 Scala Cats Validated 中,如何组合有序验证

scala - 为什么 Scala Cats 使用类型类而不是继承?

scala - 使用 Guice 和 MockitoSugar 模拟返回 Cats EitherT 的服务

scala - 如何从cats State创建cats IO monad

scala - 在 scala 构造函数中定义局部变量

scala - 为什么可以改变 immutable.SortedMap 和 immutable.TreeMap?

scala - 转到相同状态后,FSM actor 未触发 onTransition

Scala - JSON 对象在字段类型上是多态的