4

ToFunctorOpslift暗黙的にメソッドを定義しToLiftVますが、ファンクターインスタンスを見つけさせることができないようです:

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

オプションのファンクター インスタンスは表示されますが、コンパイラはそれを見つけられないようです。これを修正する方法について何か提案はありますか?

4

2 に答える 2

2

なぜこれが機能しないのか正確にはわかりません (そして、理解できない部分についてフォローアップの質問をしただけです) が、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をモデル化したメソッドを持つ、次の新しい構文特性が必要です。liftFunction2Ops

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 メーリング リストで取り上げる価値があるかもしれません。

于 2012-11-22T15:15:29.883 に答える
0

あなたの問題はこのように簡単に解決できます

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

この問題はLiftV、FunctorSyntax で使用される特性に起因していました。率直に言って、それが誰かの役に立ったとは思えません。機能させるには、明示的に入力する必要があります。

import scalaz.syntax.functor._

val f: LiftV[Option, Int, Int] = (inc _)

2.some |> f.lift  
于 2012-11-26T11:25:45.233 に答える