3

全面披露:我正在(曾经?)参加 Coursera 的 Scala 课程,但被 Sets 的第二个作业难住了。我不只是在寻找答案(很容易获得)并且无论如何都会获得边际信用。但我真的很想了解发生了什么。

好的,这是第一个问题:“定义一个从一个整数值创建单例集的函数:该集表示一个给定元素的集。” 所以我的第一次尝试是这样的:

def singletonSet(elem: Int): Set = Set(elem)

所以这个函数 ,singletonSet只是返回一个新创建的 Set。可以这样调用它:

val why = singletonSet(3)
// now why is a singleton set with a single integer, 3

这个实现似乎微不足道,所以我用谷歌搜索了答案,似乎是这样的:

def singletonSet(elem: Int): Set = (x => x == elem)

现在我的理解是这(x => x == elem)是一个匿名函数,它接受一个整数x并返回一个布尔值。但是……什么?所以作为一名 JavaScript 开发者,我决定翻译它:

function singletonSet(elem) {
    return function(x) {
        return x === elem;
    };
};

那么我可以写(我在骂人吗?):

singletonSet(3)(4)

// singletonSet(3) => returns an anonymous function, function(x) { x === 3; };
// function(4) { return 4 === 3; }
// false

如果这甚至接近 Scala 中发生的情况,那么我似乎没有创建一个单例集。相反,我只是在检查两个数字是否相同。

我在这里想念什么?我觉得它必须是非常基本的东西。

提前致谢。

4

1 回答 1

6

记住这个集合的实现是一个函数。特别是它是一个布尔函数,所以该函数可以看作是在问一个问题:“这个数字在集合中吗? - 真还是假。” 该函数可以根据需要多次调用,实际上是多次询问问题:

“这个号码在套装里吗?那个号码在套装里吗?” 等等等等

由于该集合是单例集合,因此该集合中只有一个数字。所以你通过调用函数来使用集合,实际上是在问一个问题,“这个数字是集合中唯一的数字吗?” 所以你是正确的这个集合,单例集合只是问这两个数字是否相同。

需要强调的是,这个例子来自Scala的函数式编程原理课程。本课程并不意味着对 Scala 的简单介绍。事实上,这门课程是故意让事情变得困难,以便深入理解函数式编程。通常人们只会使用范围内不可变的 Set 类。

如果您想处理介于 -1000 和 1000 之间的偶数,您可能会使用如下迭代器:

(-1000 to 1000).withFilter(_ %2 == 0)

或者:

(-1000 to 1000 by 2)
于 2013-10-11T02:40:44.707 回答