在scalaz中,endo中的Function1Ops函数是通过以下方式实现的:

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

我很好奇为什么在Endo.endo函数的主体中,不仅只是将self ...作为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 => 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)

您的示例将编译,因为未设置returntype。

关于scala - 不了解scalaz的内在功能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14970899/

10-10 19:44