[英]Lifting Functions using Cats Functor
与猫一起,我可以编写这个简单的程序
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)
但是我仍然无法创建任何对我有用的东西。 我试过了
val futureFoo = Functor[T].lift2(foo[T] _)
但这不能编译
Scala中的函数不能具有隐式参数,因此,当您尝试将具有隐式参数的方法扩展到函数中时,需要在应用函数本身之前解析隐式。 也就是说,在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]
,适用相同的概念。 请注意,要使用此功能,您需要手动提供type参数,以使其返回正确的功能。
scala> optionFoo[Int].apply(Option(1))
res2: Option[String] = Some()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.