繁体   English   中英

使用Cat 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)

使用函子(Scalaz7)提升采用隐式参数的函数

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

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM