I'm newest in Scala language and I can't understand how type Set = Int => Boolean works. I understand that it's something integer conversing to Boolean. I have def map(s: Set, f: Int => Int): Set = y => exists(s, x => y == f(x)) For exist def exists(s: Set, p: Int => Boolean): Boolean = !forall(s, i => !p(i))) and
def forall(s: Set, p: Int => Boolean): Boolean = {
def iter(a: Int): Boolean = {
if (a > bound) true
else if (diff(s,p)(a)) false
else iter(a 1)
}
iter(-bound)
}
This two functions I understand but with map function I have a problem. I just don't understand how does it show answer if I call it map(Set(2,3,5), i => i * 20) . I get {40,60,100}. I have tried to understand it and I know that x is each element in s and f(x) is x elemet which multiply in 20. And y is range from -1000 to 1000 (bound = 1000). My reading this function like this: y is range -1000..1000 in exists function is getting our Set(2,3,5) and after it give somthing with Boolean type. And how am I getting answer like {40,60,100}. How is new set creating there?
Full code ->
type Set = Int => Boolean
def contains(s: Set, elem: Int): Boolean = s(elem)
def diff(s: Set, t: Set): Set = (i: Int) => s(i) && !t(i)
val bound = 1000
def forall(s: Set, p: Int => Boolean): Boolean = {
def iter(a: Int): Boolean = {
if (a > bound) true
else if (diff(s,p)(a)) false
else iter(a 1)
}
iter(-bound)
}
def exists(s: Set, p: Int => Boolean): Boolean = !forall(s, x => !p(x))
def map(s: Set, f: Int => Int): Set = y => exists(s, x => y == f(x))
def toString(s: Set): String = {
val xs = for (i <- -bound to bound if contains(s, i)) yield i
xs.mkString("{", ",", "}")
}
println(toString(map(Set(2, 3, 5), (i: Int) => i * 20)))
CodePudding user response:
Given the map() implementation...
y => exists(s, x => y == f(x))
...and the invocation...
map(Set(2,3,5), (i: Int) => i * 20)
...make a few substitutions, and you get:
val mappedSet = y => exists(Set(2,3,5), x => y == x*20)
As a Set is Int => Boolean (a function that takes an Int and returns true or false), mappedSet is a function that asks:
Given a number, y, does there exist a number within -bounds that both passes (is a member of) Set(2,3,5) and, when multiplied by 20, equals y?
mappedSet(60) returns true because within -bounds there does exist a number, 3, that is both a member of Set(2,3,5) AND, when multiplied by 20, equals 60.
mappedSet(80) returns false because no number can be found that passes both tests.
