完全披露:我(当时?)参加了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中发生的事情,似乎我没有创建单例集。相反,我只是检查两个数字是否相同。
我在这里缺少什么?我觉得它必须是非常基本的东西。
提前致谢。
答案 0 :(得分:6)
记住这个集合的实现是一个函数。特别是它的一个布尔函数,所以这个函数可以被看作是问一个问题:“这个数字在集合中吗? - 是真还是假。”可以根据需要多次调用该函数,实际上多次询问该问题:
“这是集合中的这个数字吗?是集合中的那个数字吗?”等等。
由于集合是单例集合,因此集合中只有一个数字。所以你通过调用函数来使用该集合,实际上问这个问题“这个数字是集合中唯一的数字吗?” 所以你是正确的这个集合,单例集只是问这两个数字是否相同。
应该强调的是,这个例子来自Scala中的功能编程原则课程。该课程并不是对Scala的简单介绍。实际上,该课程是故意使事情变得困难,以便能够深入理解函数式编程。通常只会使用范围不可变的Set类。
如果你想使用介于-1000和1000之间的偶数,你可能会使用如下的迭代器:
(-1000 to 1000).withFilter(_ %2 == 0)
或:
(-1000 to 1000 by 2)