5

在 scalaz 中,endo函数 inFunction1Ops是这样实现的:

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

我很好奇为什么在Endo.endo函数体中,不只是简单地将 self... as 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 

此外,第一个实现不会在运行时增加一些开销吗?

4

1 回答 1

4

Endo.endo功能需要一个A => A. 该self值是一个T => R不符合Endo要求的函数。

理论上您可以T => R转换为,T => Tev创建了参数,因此您不需要转换并意外犯错误T => R不等于T => T.

然而,他们可以这样写:

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

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

于 2013-03-06T00:00:49.263 回答