don';我不理解scalaz内函数

don';我不理解scalaz内函数,scala,functional-programming,implicit-conversion,scalaz,Scala,Functional Programming,Implicit Conversion,Scalaz,在scalaz中,Function1Ops中的endo函数通过以下方式实现: 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:

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

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 

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

Endo.Endo函数需要一个
a=>a
self
值是一个不符合
Endo
要求的函数
T=>R

理论上,您可以将
T=>R
强制转换为
T=>T
,但是
ev
参数是创建的,因此您不需要强制转换,也不会意外地犯下
T=>R
不等于
T
的错误

然而,他们本可以这样写:

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

您的示例之所以能够编译,是因为没有设置returntype。

我认为,提出此类问题的最佳位置是邮件列表:#scalaz@irc.freenode.net也是提出这类问题的好地方。您也可以只向github repo发送拉取请求:。非常感谢。我没有考虑退货类型。