使用 Cats Functor 提升函数
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 扩展为函数时,隐式需要在 函数之前解析本身被应用。也就是说,在 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: Manifest[T])Option[T] => Option[String]
我使用Option
是因为我没有现成的Functor[Future]
,同样的概念也适用。请注意,为了使用它,您需要手动将类型参数提供给 return 正确的函数。
scala> optionFoo[Int].apply(Option(1))
res2: Option[String] = Some()
有了猫,我可以写出这个简单的程序
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 扩展为函数时,隐式需要在 函数之前解析本身被应用。也就是说,在 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: Manifest[T])Option[T] => Option[String]
我使用Option
是因为我没有现成的Functor[Future]
,同样的概念也适用。请注意,为了使用它,您需要手动将类型参数提供给 return 正确的函数。
scala> optionFoo[Int].apply(Option(1))
res2: Option[String] = Some()