我不明白为什么这不起作用(我刚刚问了一个关于我不理解的部分的后续问题),但我可以提供三种解决方法。
第一个对我来说没有意义,并且需要对您的代码和笨拙的语法进行一些更深入的更改,所以我只会顺便提一下。
第二个是导入适当的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
.
最后一个需要更多的代码,但更令人满意。您需要以下新的语法特征,以及以inmyLift
为模型的方法:lift
Function2Ops
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 邮件列表中提出这个问题可能是值得的。