加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 如何使用ToFunctorOps中的提升

发布时间:2020-12-16 08:47:26 所属栏目:安全 来源:网络整理
导读:ToFunctorOps通过ToLiftV隐式定义了一个提升方法,但我似乎无法让它找到我的仿函数实例: import scalaz.std.option._import scalaz.syntax.functor._import scalaz.syntax.id._import scalaz.syntax.std.option._def inc(x: Int) = x + 11.some | (inc _).li
ToFunctorOps通过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实例是可见的,但编译器似乎无法找到它.有关如何解决此问题的任何建议?

解决方法

我不明白为什么这不起作用(我刚刚向 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导入这些含义,并且并不比仅仅编写lift inc更好.

最后一个需要更多的代码,但更令人满意.您需要以下新的语法特性,并使用在Function2Ops中提升的myLift方法建模:

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邮件列表上提出这个问题.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读