I am reading and practicing Scala, and I found this blog.
Reading the part about Composing Predicates I see this piece of code
def complement[A](predicate: A => Boolean) = (a: A) => !predicate(a)
def any[A](predicates: (A => Boolean)*): A => Boolean =
a => predicates.exists(pred => pred(a))
def none[A](predicates: (A => Boolean)*) = complement(any(predicates: _*))
def every[A](predicates: (A => Boolean)*) = none(predicates.view.map(complement(_)): _*)
I have a python background and would like to understand the meaning of underscore and asterisk, when used alone or together, it's quite strange to make sense of it, specially for none and every definitions.
SomeExpression* means "a sequence of 0 or more elements"
_ can be used to specify "a parameter that we do not need to name"
The parameter to none is "a sequence of predicates containing 0 or more elements", and a "predicate" is a function that takes A and returns Boolean.
The parameter to any is an array, so the value passed in must be converted to an array, which is done by _*
The parameter to every is an array, whose name is not important because there is only one. It can be passed to complement as _
def any[A](predicates: (A => Boolean)*)
produces the same function as
def any[A](predicates: Seq[A => Boolean])
except that you can call it like any(a, b, c) instead of any(List(a, b, c)) (the compiler transforms the call sites).
Given that any is a varargs function, calling any(a) enters the body of any with predicates = List(a). But if a is already a sequence, this isn't what you want. That's what the : _* notation is for: it tells the Scala compiler "treat this as a sequence of parameters for varargs".
This is roughly equivalent to writing in Python,
def complement(predicate):
return lambda a: not predicate(a)
def any_(*predicates):
return lambda a: any(pred(a) for pred in predicates)
def none(*predicates):
return complement(any_(*predicates))
def every(*predicates):
return none(*map(complement, predicates))
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With