使用Cats Functor提升功能

时间:2017-03-30 20:59:31

标签: scala scala-cats

和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] _)

但这不会编译

1 个答案:

答案 0 :(得分:3)

Scala中的函数不能有隐式参数,因此当您尝试将带有隐式参数的方法eta扩展到函数中时,隐式需要在应用函数本身之前解析。也就是说,在eta扩张时。编译器在范围内没有通用Manifest[T],但futureFoo可能需要一个。{/ p>

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