なぜこれが機能しないのか正確にはわかりません (そして、理解できない部分についてフォローアップの質問をしただけです) が、3 つの回避策を提供できます。
最初のものは私には意味がなく、コードとぎこちない構文にさらに深い変更を加える必要があるため、これについては言及するだけにとどめます。
2 つ目は、(適切に動作していないものとは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 メーリング リストで取り上げる価値があるかもしれません。