我不明白为什么这不起作用(我刚刚问过后续问题 https://stackoverflow.com/q/13515169/334519关于我不明白的部分),但我可以提供三种解决方法。
The first https://gist.github.com/4131492对我来说毫无意义,需要对代码和笨重的语法进行一些更深入的更改,所以我只会顺便提及它。
二是导入合适的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
.
最后一个需要更多的代码,但更令人满意。您需要以下新语法特征,带有myLift
方法建模的lift
in 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 邮件列表中提出这个问题可能是值得的。