5

anlamıyorum, Function1Ops içinde endo fonksiyonu bu şekilde uygulanır: Endo.endo fonksiyonun gövdesinde, sadece basitçe kendini alarak nedenscalaz endo fonksiyonu scalaz olarak

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

merak ediyorum ... Endo.endo(t=> ev(self(t))) ile aynı davranan Endo.endo(self) olarak.

İşte benim mimik uygulamam ve ikisi arasında hiçbir fark göremiyorum. Bir şey mi kaçırdım? Ayrıca

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 

, ilk uygulama zamanında bazı ek yükü eklemez?

+0

Bu tür soruları sormanın en iyi yolu, posta listesidir: https://groups.google.com/forum/?fromgroups#!forum/scalaz. #[email protected] bu tür soruları da gündeme getirmek için doğru bir yerdir. Ayrıca github repo'ya bir çekme isteği gönderebilirsiniz: https://github.com/scalaz/scalaz. – folone

cevap

3

Endo.endo işlevi A => A gerektirir. self değeri, Endo gereksinimine uymayan bir T => R işlevidir. teoride

Yapabilirsin T => T için T => R döküm ancak döküm ve yanlışlıkla T => RT => T eşit olmadığı hata yapmak gerekmez ev parametre oluşturulur.

Onlar ancak bu şekilde yazmış olabilirdi: returntype ayarlanmadığı için

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

Kişisel örnekler derlemek.

+0

çok teşekkürler. Dönüş türünü dikkate alarak özledim. – chenhry