Scala中基于特征函数的FunSet类型别名实现相关疑问
问题核心概念解析
1. FunSet类型定义的含义
FunSet是一个类型别名,本质上是给Int => Boolean这个函数类型起了更贴合业务语义的名字。
特征函数(也叫指示函数)是集合论的经典概念:对任意集合S,它的特征函数接收一个元素,返回布尔值:元素属于S则返回true,否则返回false。
这里没有用哈希表、树等结构存储集合元素,而是直接用特征函数本身表示集合,只存「判断元素是否属于集合」的规则,不存具体元素。
举个例子:
- 所有正整数的集合对应的
FunSet是(x: Int) => x > 0 - 所有偶数的集合对应的
FunSet是(x: Int) => x % 2 == 0
2. contains函数的判断逻辑
def contains(s: FunSet, elem: Int): Boolean = s(elem)的逻辑非常直接:
因为s本身就是「接收Int返回Boolean」的特征函数,要判断elem是否属于集合,直接把elem作为参数传入s执行,得到的返回值就是判断结果。
比如调用contains((x: Int) => x > 0, 3),本质就是执行(x: Int) => x > 0)(3),最终返回true。
3. singletonSet函数的实现
单元素集合的特征是:只有你传入的指定元素属于集合,其他所有元素都不属于。对应特征函数的逻辑就是:接收一个输入参数,判断该参数是否等于你要创建的单元素值。
由于FunSet本身是函数类型,所以你需要返回一个函数作为结果,正确实现如下:
def singletonSet(elem: Int): FunSet = (x: Int) => x == elem
也可以用Scala的占位符语法简写:
def singletonSet(elem: Int): FunSet = _ == elem
实现验证
当你执行val s = singletonSet(5)时,得到的s就是单元素集合的特征函数:
- 调用
contains(s,5)返回true - 调用
contains(s,3)、contains(s,-2)等都返回false,完全符合单元素集合的预期。
内容的提问来源于stack exchange,提问作者Jonas_Astley
相关产品推荐
相关产品推荐

