在scalaz中,endo
中的Function1Ops
函数以这种方式实现:
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
此外,第一个实现是否在运行时增加了一些开销?
答案 0 :(得分:3)
Endo.endo
功能需要A => A
。 self
值是函数T => R
,不符合Endo
要求。
理论上你可以将T => R
转换为T => T
,但ev
参数已创建,因此您无需投射并意外地犯下T => R
不是的错误等于T => T
。
def endo(implicit ev: R =:= T): Endo[T] =
Endo.endo(self andThen ev)
您的示例已编译,因为未设置返回类型。