ToFunctorOps
通过lift
隐式定义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
选项的functor实例是可见的,但编译器似乎无法找到它。关于如何解决这个问题的任何建议?
答案 0 :(得分:2)
我不明白为什么这不起作用(我刚刚问过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
要好得多。
最后需要更多代码,但更令人满意。您需要以下新语法特征,myLift
方法建模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邮件列表上可能值得。
答案 1 :(得分: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
问题来自FunctorSyntax中使用的LiftV
特征。坦率地说,我怀疑这对某人有用。为了工作,必须明确键入:
import scalaz.syntax.functor._
val f: LiftV[Option, Int, Int] = (inc _)
2.some |> f.lift