gpt4 book ai didi

scala - 如何使用 ToFunctorOps 的提升

转载 作者:行者123 更新时间:2023-12-01 04:01:01 25 4
gpt4 key购买 nike

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 的仿函数实例是可见的,但编译器似乎找不到它。关于如何解决这个问题的任何建议?

最佳答案

我不明白为什么这不起作用(我刚刚问 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 好多少.

最后一个需要更多的代码,但更令人满意。您需要以下新的语法特征,带有 myLiftlift 为模型的方法在 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 邮件列表上提出这个问题可能是值得的。

关于scala - 如何使用 ToFunctorOps 的提升,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13507202/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com