我对Scala集的理解有什么问题?

时间:2013-10-11 02:15:08

标签: scala functional-programming set currying

完全披露:我(当时?)参加了Coursera的Scala课程,但被第二次任务集击败了。我不是只寻找答案(很容易获得)并且无论如何都会获得边际信用。但我真的很想了解正在发生的事情。

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

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

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

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

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

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中发生的事情,似乎我没有创建单例集。相反,我只是检查两个数字是否相同。

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

提前致谢。

1 个答案:

答案 0 :(得分:6)

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

“这是集合中的这个数字吗?是集合中的那个数字吗?”等等。

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

应该强调的是,这个例子来自Scala中的功能编程原则课程。该课程并不是对Scala的简单介绍。实际上,该课程是故意使事情变得困难,以便能够深入理解函数式编程。通常只会使用范围不可变的Set类。

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

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

或:

(-1000 to 1000 by 2)