Non è possibile esprimere l'inverso di una funzione, ma è possibile esprimere l'inverso del suo risultato e forse ciò sarebbe opportuno.
Questo può essere utile quando si passa la funzione in giro.
Ad esempio, se si dispone di una funzione f: Int => Boolean
che si sta utilizzando come parametro in una funzione di ordine superiore, si può avvolgere in un'altra funzione dello stesso tipo x => !f(x)
che justs restituisce l'inverso del risultato calcolato:
def select(ls: List[String], p: String => Boolean): List[String] =
ls.remove(x => !p(x))
// select: (ls: List[String], p: String => Boolean)List[String]
val li = List("one", "two", "three")
// li: List[java.lang.String] = List(one, two, three)
/* using select with some conditions */
select(li, _.length() > 3) // equivalent to select(li, x => x.length() > 3)
// res0: List[String] = List(three)
select(li, _.length() <= 3) // equivalent to select(li, x => x.length() <= 3)
// res1: List[String] = List(one, two)
/* using remove with the same conditions */
li.remove(_.length() > 3) // equivalent to li.remove(x => x.length() > 3)
// res2: List[java.lang.String] = List(one, two)
li.remove(_.length() <= 3) // equivalent to li.remove(x => x.length() <= 3)
// res3: List[java.lang.String] = List(three)
NOTA: il metodo remove
in classe List
è deprecato e filterNot
dovrebbe essere usato al posto, ma credo che in questo esempio remove
solo legge meglio.
Non è necessaria la funzione di inversione per questo esercizio, pensare alla definizione matematica di esistere: Mappa (S, f) = b | Esiste c € S, f (c) = b. –
cosa dire creare la propria InvertibleFunction [Int, Int] – Edmondo1984