Фильтр Scala на все элементы набора псевдонимов
Здесь вопрос.
У меня есть этот тип Set:
type Set = Int => Boolean
Который я могу использовать так:
val belowNegFive: Set = (i) => i < -5
belowNegFive(10)
Я имею в виду возвращать bool в зависимости от того, относится ли элемент 10 к числу чисел ниже -5.
- У меня есть этот код, который возвращает подмножество
s
для которогоp
держит.
def filter(s: Set, p: Int => Boolean): Set = (e: Int) => s(e) && p(e)
Q1: Откуда я знаю, что p (e) говорит мне, что int e удовлетворяет предикату p?
- У меня есть этот fc, который возвращает все ли ограниченные целые числа в пределах
s
удовлетворятьp
,
def contains(s: Set, elem: Int): Boolean = s(elem) val bound = 1000 def forall(s: Set, p: Int => Boolean): Boolean = { def iter(a: Int): Boolean = { if (a > bound) true else if (contains(s, a) && !p(a)) false else iter(a+1) } iter(-bound) }
Q2: Почему все границы> просто удовлетворяют условию предиката по умолчанию? Или правда это просто условие остановки? Я не уверен, почему этот fc не возвращает бесконечный цикл. Просто бесконечный список логических значений, и последние логические выражения имеют значение "истина, истина, истина..." для всех границ.
Q3: И я не вижу, в какой точке он использует && между полученными логическими значениями, чтобы сказать да, все ограниченные целые числа внутри s
удовлетворять p
,
благодарю вас
1 ответ
Для Q1:p
это функция, которая принимает целое число и возвращает логическое значение. Мой предикат может быть примерно таким, число должно быть меньше -10. Мой набор может быть, он должен быть меньше -5. filter
вернет тот пользовательский набор, для которого оба держат.
type Set = Int => Boolean
val belowNegFive: Set = (i) => i < -5
def filter(s: Set, p: Int => Boolean): Set = (e: Int) => s(e) && p(e)
val predicate: Int => Boolean = (num) => num < -10
val myset = filter(belowNegFive, predicate)
myset(0) #=> false
myset(-1) #=> false
myset(-10) #=> false
myset(-11) #=> true
Для Q2:
def contains(s: Set, elem: Int): Boolean = s(elem)
val bound = 1000
def forall(s: Set, p: Int => Boolean): Boolean = {
def iter(a: Int): Boolean = {
if (a > bound) true
else if (contains(s, a) && !p(a)) false
else iter(a+1)
}
iter(-bound)
}
Это условие остановки. forall
диктует, что если для всех целых чисел от ч / б от -1000 до 1000 (привязано), если множество содержит целое число и предикат, то это правда. Как видите, в последней строке проверка начинается с -1000 (iter(-bound)
).
Q3: как будет выглядеть таблица истинности для множества и предиката?
set | predicate | should continue checking?
____________________________________________
true | true | yes
false| true | yes
true | false | no
false| false | yes
Как видите, только при условии возврата false
это третий, который является else if
состояние. Для всех остальных он продолжает проверять следующее целое число на наличие в множестве и предикате.