Фильтр Scala на все элементы набора псевдонимов

Здесь вопрос.

У меня есть этот тип Set:

type Set = Int => Boolean

Который я могу использовать так:

val belowNegFive: Set = (i) => i < -5
belowNegFive(10)

Я имею в виду возвращать bool в зависимости от того, относится ли элемент 10 к числу чисел ниже -5.

  1. У меня есть этот код, который возвращает подмножество s для которого p держит.
def filter(s: Set, p: Int => Boolean): Set = (e: Int) => s(e) && p(e)

Q1: Откуда я знаю, что p (e) говорит мне, что int e удовлетворяет предикату p?

  1. У меня есть этот 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 состояние. Для всех остальных он продолжает проверять следующее целое число на наличие в множестве и предикате.

Другие вопросы по тегам