如何使用 ToFunctorOps 的 lift

2023-12-31

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

option 的函子实例是可见的,但编译器似乎找不到它。关于如何解决这个问题有什么建议吗?


我不明白为什么这不起作用(我刚刚问过后续问题 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 邮件列表中提出这个问题可能是值得的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 ToFunctorOps 的 lift 的相关文章

随机推荐