不明白scalaz endo的功能

时间:2013-02-20 01:45:13

标签: scala functional-programming implicit-conversion scalaz

在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 

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

1 个答案:

答案 0 :(得分:3)

Endo.endo功能需要A => Aself值是函数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)

您的示例已编译,因为未设置返回类型。