5

Nel scalaz, la funzione endo in Function1Ops è implementato in questo modo:non capiscono funzione scalaz endo

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

Sono curioso di sapere perchè nel corpo della Endo.endo funzione, non solo semplicemente prendendo l'auto ... come Endo.endo(self), che si comporta come Endo.endo(t=> ev(self(t))).

Ecco la mia implementazione mimica e non vedo alcuna differenza tra i due. Ho dimenticato qualcosa?

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 

Inoltre, non la prima implementazione aggiungere un po 'in testa a tempo di esecuzione?

+0

Credo che il posto migliore per porre questo tipo di domande sia la mailing list: https://groups.google.com/forum/?fromgroups#!forum/scalaz. #[email protected] è il posto giusto per sollevare questo tipo di domande. Puoi anche inviare una richiesta di pull al repository github: https://github.com/scalaz/scalaz. – folone

risposta

3

La funzione Endo.endo richiede un A => A. Il valore self è una funzione T => R che non è conforme al requisito Endo.

Si potrebbe in teoria gettato T => R-T => T ma il parametro ev è creato in modo non c'è bisogno di lanciare e accidentalmente fare l'errore che T => R non è uguale a T => T.

Essi tuttavia avrebbe potuto scrivere in questo modo:

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

I suoi esempi di compilazione perché il returnType non è impostato.

+0

grazie mille. Ho perso prendendo in considerazione il tipo di ritorno. – chenhry