2013-02-20 34 views
5

在scalaz,在Function1Opsendo功能以這種方式實現:不明白scalaz內功能

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 

另外,第一個實現不會在運行時增加一些開銷嗎?

+0

我相信,問這類問題的最佳地點是郵件列表:https://groups.google.com/forum/?fromgroups#!forum/scalaz。 #[email protected]也是提出這類問題的好地方。你也可以發送一個pull請求到github repo:https://github.com/scalaz/scalaz。 – folone 2013-03-04 07:41:38

回答

3

Endo.endo函數需要A => Aself值是一個函數T => R,它不符合Endo要求。

理論上你可以投T => RT => Tev參數創建的,因此你不需要投,不小心犯這樣的錯誤是T => R不等於T => T

然而,他們可以寫這樣的:

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

您的例子編譯,因爲返回類型沒有設置。

+0

非常感謝。我錯過了考慮返回類型。 – chenhry 2013-03-07 10:25:51