don';我不理解scalaz内函数
在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:
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发送拉取请求:。非常感谢。我没有考虑退货类型。