在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 => 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)
您的示例将编译,因为未设置returntype。
关于scala - 不了解scalaz的内在功能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14970899/