【问题标题】:Lifting Functions using Cats Functor使用 Cats Functor 的提升函数
【发布时间】:2017-03-31 05:21:12
【问题描述】:

有了 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 scala-cats


    【解决方案1】:

    Scala 中的函数不能具有隐式参数,因此当您尝试将具有隐式参数的方法 eta-expand 扩展为函数时,需要在应用函数本身之前解析隐式。也就是说,在 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()
    

    【讨论】:

      猜你喜欢
      • 2018-04-21
      • 2018-06-09
      • 2017-09-09
      • 2023-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-30
      相关资源
      最近更新 更多