2013-02-20 48 views
5

scalaz में, Function1Ops में endo समारोह इस तरह से कार्यान्वित किया जाता है:समझ में नहीं आता 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] इस तरह के प्रश्नों को उठाने के लिए भी एक सही जगह है। आप github repo को केवल एक पुल अनुरोध भेज सकते हैं: https://github.com/scalaz/scalaz। – folone

उत्तर

3

Endo.endo फ़ंक्शन को A => A की आवश्यकता है। self मान एक फ़ंक्शन T => R है जो Endo आवश्यकता का पालन नहीं करता है।

आप कर सकते थे सिद्धांत में T => T को T => R डाली लेकिन ताकि आप डाली और गलती से गलती कि T => RT => T के बराबर नहीं है की जरूरत नहीं है ev पैरामीटर बनाई गई है।

हालांकि वे इस तरह लिखा जा सकता था:

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

आपका उदाहरण संकलन क्योंकि returntype सेट नहीं है।

+0

बहुत बहुत धन्यवाद। मैं रिटर्न प्रकार पर विचार करने से चूक गया। – chenhry