【问题标题】:How to use lift from ToFunctorOps如何使用 ToFunctorOps 的提升
【发布时间】:2012-11-26 19:25:45
【问题描述】:

ToFunctorOps 通过 ToLiftV 隐式定义了一个 lift 方法,但我似乎无法让它找到我的仿函数实例:

import scalaz.std.option._
import scalaz.syntax.functor._
import scalaz.syntax.id._
import scalaz.syntax.std.option._

def inc(x: Int) = x + 1

1.some |> (inc _).lift

<console>:16: error: could not find implicit value for parameter F: scalaz.Functor[F]
              1.some |> (inc _).lift

option 的仿函数实例是可见的,但编译器似乎找不到它。关于如何解决此问题的任何建议?

【问题讨论】:

    标签: scala scalaz


    【解决方案1】:

    我不明白为什么这不起作用(我刚刚向 a follow-up question 询问了我不明白的部分),但我可以提供三种解决方法。

    first 对我来说毫无意义,需要对您的代码和笨拙的语法进行一些更深入的更改,所以我只是顺便提一下。

    第二个是导入适当的FunctorSyntax 隐式(与不能正常工作的ToFunctorOps 相对):

    scala> val of = implicitly[scalaz.Functor[Option]]
    of: scalaz.Functor[Option] = scalaz.std.OptionInstances$$anon$1@377d4c39
    
    scala> import of.functorSyntax._
    import of.functorSyntax._
    
    scala> 1.some |> (inc _).lift
    res0: Option[Int] = Some(2)
    

    但这需要你为每个你想使用它们的Functor 导入这些隐式,这并不比写of lift inc 好多少。

    最后一个需要更多的代码,但更令人满意。您需要以下新的语法特征,以及以 lift 为模型的 Function2Ops 中的 myLift 方法:

    trait MyFunction1Syntax[A, R] extends scalaz.syntax.Ops[A => R] {
      def myLift[F[_]](implicit F: scalaz.Functor[F]) = F lift self
    }
    
    implicit def toMyFunction1Syntax[A, R](f: A => R) =
      new MyFunction1Syntax[A, R] { def self = f }
    

    现在您可以编写以下内容:

    scala> 1.some |> (inc _).myLift
    res3: Option[Int] = Some(2)
    

    将这个问题放到 Scalaz 邮件列表中可能是值得的。

    【讨论】:

    • 我不明白您对第二种解决方法的说法。这些进口应该足够了。 'import scalaz.std.AllInstances._' 和 'import scalaz.syntax.functor._'
    • @YoEight 是的,这就是这个问题的重点:他们应该,但他们没有。
    • 这是一种奇怪的行为 - 真的很好挖掘。
    【解决方案2】:

    你的问题可以这样轻松解决

    import scalaz.syntax.std.option._
    import scalaz.std.option._
    import scalaz.syntax.id._
    
    implicit def liftIt[F[_], A, B](f: A => B)(implicit F: Functor[F]): F[A] => F[B] =
      F lift f
    
    def inc(x: Int) = x + 1
    
    2.some |> inc
    

    问题来自 FunctorSyntax 中使用的 LiftV 特征。坦率地说,我怀疑它可能对某人有用。为了工作,它必须明确输入:

    import scalaz.syntax.functor._
    
    val f: LiftV[Option, Int, Int] = (inc _)
    
    2.some |> f.lift  
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-27
      • 2012-05-15
      • 1970-01-01
      • 2012-06-16
      • 1970-01-01
      • 2013-11-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多