从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)
虽然它更短,但前者可能更易于阅读(因为意图有些明显)。