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

不明白scalaz endo的功能

发布时间:2020-12-16 18:35:21 所属栏目:安全 来源:网络整理
导读:在 scalaz中,Function1Ops中的endo函数以这种方式实现: def endo(implicit ev: R =:= T): Endo[T] = Endo.endo(t = ev(self(t))) 我很好奇为什么在Endo.endo函数的主体中,而不仅仅是简单地将自我…作为Endo.endo(self),其行为与Endo.endo相同(t = ev(self(t
在 scalaz中,Function1Ops中的endo函数以这种方式实现:

def endo(implicit ev: R =:= T): Endo[T] =
  Endo.endo(t => ev(self(t)))

我很好奇为什么在Endo.endo函数的主体中,而不仅仅是简单地将自我…作为Endo.endo(self),其行为与Endo.endo相同(t => ev(self(t)) ).

这是我的模仿实现,我发现两者没有区别.我错过了什么?

def endo[R,T](f: R => T)(implicit ev: T =:= R) = (x: R)=> ev(f(x))
def endo2[R,T](f: R => T)(implicit ev: T =:= R) = f

此外,第一个实现是否在运行时增加了一些开销?

解决方法

Endo.endo功能需要A => A.自我值是函数T => R不符合远藤要求.

你理论上可以把T => R至T =>但是创建了ev参数,所以你不需要投射并且不小心犯了T =>的错误. R不等于T => T.

然而他们可以像这样写:

def endo(implicit ev: R =:= T): Endo[T] =
  Endo.endo(self andThen ev)

您的示例编译因为未设置返回类型.

(编辑:李大同)

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

    推荐文章
      热点阅读