Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我对Scala集的理解有什么问题?_Scala_Functional Programming_Set_Currying - Fatal编程技术网

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

我对Scala集的理解有什么问题?,scala,functional-programming,set,currying,Scala,Functional Programming,Set,Currying,充分披露:我正在(曾经?)上Coursera的Scala课程,但在第二次布景作业中被难倒了。我不是在寻找答案(很容易得到),而且无论如何我都会得到微薄的分数。但我真的很想了解发生了什么 好的,这里是第一个问题:“定义一个函数,它从一个整数值创建一个单例集:这个集代表一个给定元素的集。”所以我的第一个尝试是: def singletonSet(elem: Int): Set = Set(elem) 所以这个函数,singletonSet,只返回一个新创建的集合。可以这样调用: val why =

充分披露:我正在(曾经?)上Coursera的Scala课程,但在第二次布景作业中被难倒了。我不是在寻找答案(很容易得到),而且无论如何我都会得到微薄的分数。但我真的很想了解发生了什么

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

def singletonSet(elem: Int): Set = Set(elem)
所以这个函数,
singletonSet
,只返回一个新创建的集合。可以这样调用:

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;
    };
};
这样我就可以写(我是在做咖喱吗?)

如果这与Scala中正在发生的事情非常接近,那么看起来我并没有创建一个单例集。相反,我只是检查两个数字是否相同

我错过了什么?我觉得这一定是很基本的东西


提前感谢。

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

“这个号码在集合中吗?那个号码在集合中吗?”等等

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

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

如果您想使用-1000到1000之间的偶数,您可能会使用以下迭代器:

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


可能的重复:对于那些进入理论的人来说,以本练习的方式定义集合允许内涵和扩展定义的可能性,而实际上所有的库实现都是集合的扩展。想象一下“所有偶数整数的集合”。通过实现本例中使用的集合,可以实现非常紧凑和高效的实现。使用普通的Scala或Java
集合
时,必须将“所有”偶数添加到集合中!另一方面,扩展集(小基数的扩展集除外)没有像本练习中那样有效地实现。@RandallSchulz:我只是想澄清一下,我认为您的意思是“普通Scala或Java
Set
标准实现”。从外观上看,Java接口和Scala特性都放宽了足够多的规范来支持内涵定义。然而,要实现Scala的
Set
类型的所有必需功能可能很困难。我从阅读Odersky关于Scala的书开始,意识到可能我错过了该语言的一个要点,那就是它的高度可扩展性。我在这个作业中真正做的是从头定义一个类型
Set
。我说的有道理?是的。分配不是关于在Scala标准库中使用集合类型;它是关于使用语言的抽象功能对集合的概念进行功能编码。事实上,如果您在中查看Set1,现在就可以理解“contains”方法的实现。
(-1000 to 1000).withFilter(_ %2 == 0)
(-1000 to 1000 by 2)