2016-06-29 14 views
5

Qualcuno potrebbe gentilmente spiegarmi perché il seguentefunzione Scala => come parametro di

/** 
    * Returns a set transformed by applying `f` to each element of `s`. 
    */ 
    def map(s: Set, f: Int => Int): Set = x => exists(s, y => f(y) == x) 

non è equivalente a

def map(s: Set, f: Int => Int): Set = x => exists(s, f(x)) 

in cui "esiste" è una funzione che restituisce se esista un limitato numero intero compreso tra s (il primo argomento) che soddisfa p (il secondo argomento).

Perché è necessario specificare "y => f (y) == x"? Grazie mille!

risposta

10

exists 's secondo argomento ha il tipo Int => Boolean (corrette), in altre parole, si aspetta una funzione da Int a Boolean. Ora, f(x) non è conforme a questo tipo - ha il tipo Int. Quindi - y => f(y) == x crea una funzione con il tipo corretto, che restituisce true se il suo input è uguale a x.

Se i caratteri in eccesso bug - è anche possibile accorciare un po 'con il argomento anonimo '_':

def map(s: Set, f: Int => Int): Set = x => exists(s, f(_) == x) 
+0

La mia ipotesi è che il PO è stato confuso da pensare a 'x => esiste (s, _ == f (x)) 'quale tipo controlla (sfortunatamente, dato che' f' non ha il tipo più generale), ma fa la cosa sbagliata. – chi

+0

capito, Tzach Zohar, grazie mille! – iammyr

Problemi correlati