FP class :

type Set = Int => Boolean  // Predicate

  /**
   * Indicates whether a set contains a given element.
   */
  def contains(s: Set, elem: Int): Boolean = s(elem)

为什么这样说得通?
assert(contains(x => true, 100))

基本上,它的作用是为函数100提供x => true值。也就是说,我们提供100,它返回 true

但是,这与集合有什么关系?

不管我们放什么,它都会返回true。感觉在哪里?

我了解我们可以提供我们自己的集合实现/函数作为参数,以表示所提供的值在集合内(或不在集合内)的事实-然后(仅)此实现使contains函数被某种意义/含义/逻辑/功能。

但是到目前为止,它看起来像个废话功能。它名为contains,但名称不代表逻辑。我们可以将其称为apply(),因为它的作用是将函数(第一个参数)应用于值(第二个参数)。仅使用名字contains可以告诉读者作者可能想说什么。也许不是很抽象吗?

最佳答案

在上面显示的代码段中,任何设置的S都由所谓的特征函数表示,即给定一些整数i的函数会检查i是否包含在设置的S中。因此,您可以想到这样一个特性函数f,就像它是一个集合一样,即



如果您想到设置了Int => Boolean类型的任何函数(由同义词Set = Int => Boolean类型表示),则可以通过以下方式描述contains:



一些示例集可能使想法更明显:

Set                                Characeristic Function
 empty set                          x => false
 universal set                      x => true
 set of odd numbers                 x => x % 2 == 1
 set of even numbers                x => x % 2 == 0
 set of numbeers smaller than 10    x => x < 10

示例:集{1、2、3}可以表示为
val S: Set = (x => 0 <= x && x <= 3)

如果您想知道这个数字n是否在此集中,则可以执行
contains(S, n)

但是,当然(如您已经观察到的那样),直接进行操作将获得相同的结果
S(n)

虽然它更短,但前者可能更易于阅读(因为意图有些明显)。

10-06 07:50
查看更多