Questions tagged «scala»

Scala是一种主要用于Java虚拟机的通用编程语言。它旨在以简洁,优雅和类型安全的方式表达常见的编程模式,它融合了命令式和功能性编程风格。


4
是因为我编写不同的东西还是因为编译的方式不同,所以函数编程在多线程中是否更快?
我将深入研究函数式编程的世界,并且不断阅读有关函数式语言更适合多线程/多核程序的内容。我了解函数式语言如何做很多不同的事情,例如递归,随机数等,但是我似乎无法弄清楚函数式语言中的多线程是否更快,因为它的编译方式不同或因为我编写的方式不同。 例如,我已经用Java编写了实现某种协议的程序。在此协议中,双方互相发送和接收数千条消息,它们对这些消息进行加密并一次又一次地重新发送(并接收)。不出所料,当处理成千上万的规模时,多线程是关键。在此程序中,没有锁定。 如果我在Scala(使用JVM)中编写相同的程序,这种实现会更快吗?如果是,为什么?是因为写作风格吗?如果是因为写作风格,现在Java包含了lambda表达式,我不能将Java与lambda一起使用来达到相同的结果吗?还是因为Scala将以不同的方式编译事物而更快?


5
什么时候在akka / erlang中使用actor不好?
我每天与akka合作7-8个月。当我开始时,我将在应用程序上工作,并注意到actor基本上会在actor系统内部的任何地方用于大多数对象之间的通信。所以我也做同样的事情-为x / y / z旋转另一个演员。 在我看来,这可能太过随意了,在不需要的地方增加了复杂性-但是我找不到关于应该使用参与者与普通同步甚至是期货的异步逻辑的讨论。我的同事提到类似的内容后,我开始思考自己的立场。我最近才意识到有几种情况,我在考虑一个任务,然后避免创建另一个参与者,因为我可以在不可变的实现中安全地实现相同的结果-例如,从数据库或文件中获取配置值的地方,而这些地方很少访问并且会等待结果是实际用例。 尤其是在我看来,在任何情况下,如果您正在使用不可变状态,参与者都会造成复杂性并限制吞吐量-例如,对象中的纯函数可以在没有任何并行级别的情况下并发调用,但是演员一次只能处理一条消息。另一个考虑因素是,如果您需要等待结果,除非您开始使用期货,否则就将线程停放,但是在不需要担心异步消息传递或扩展的情况下,聘请演员似乎过大。 所以我的问题是-使用演员的时间不好吗?我很好奇erlang看起来如何并且真的希望别人的见识。或者,如果有一些有关演员使用的原则。

7
您如何用C#或类似Java的语言编码代数数据类型?
代数数据类型很容易解决一些问题,例如,列表类型可以非常简洁地表示为: data ConsList a = Empty | ConsCell a (ConsList a) consmap f Empty = Empty consmap f (ConsCell a b) = ConsCell (f a) (consmap f b) l = ConsCell 1 (ConsCell 2 (ConsCell 3 Empty)) consmap (+1) l 这个特定的例子在Haskell中,但是在其他语言中,本机支持代数数据类型,这将是相似的。 事实证明,有一个明显的面向对象样式子类型的映射:数据类型成为抽象基类,每个数据构造函数都成为具体的子类。这是Scala中的示例: sealed abstract class ConsList[+T] { def map[U](f: T …

3
与静态方法相比,Scala的伴随对象有哪些优势?
Scala没有静态 -keyword,但是通过随播对象具有类似的功能。在幕后,伴随对象被编译为具有静态方法的类,因此所有这些都是语法糖。这种设计选择的优点是什么?劣势?其他的languanges有类似的构造吗?
50 scala 

4
Scala与Java相比的性能
首先,我想明确指出,这不是确定哪种语言更好的语言-X-语言-Y的问题。 我已经使用Java很长时间了,我打算继续使用它。与此并行的是,我目前对Scala的学习非常感兴趣:除了一些让我印象深刻的小事情之外,我真的可以很好地使用这种语言。 我的问题是:在执行速度和内存消耗方面,用Scala编写的软件与用Java编写的软件相比如何?当然,通常这是一个很难回答的问题,但是我希望模式匹配,高阶函数等更高层次的结构会带来一些开销。 但是,我目前在Scala的经验仅限于50行以下代码的小示例,并且到目前为止,我还没有运行任何基准测试。因此,我没有真实数据。 如果事实证明Scala 在 Java上确实有一些开销,那么混合使用Scala / Java项目是否有意义,在该项目中,Scala中的较复杂部分和Java中的性能关键部分都可以编码?这是常见的做法吗? 编辑1 我运行了一个小型基准测试:构建一个整数列表,将每个整数乘以2并将其放入新列表中,然后打印结果列表。我编写了一个Java实现(Java 6)和一个Scala实现(Scala 2.9)。我已经在Ubuntu 10.04下的Eclipse Indigo上都运行了。 结果是可比的:Java 480 ms,Scala 493 ms(平均100次迭代)。这是我使用过的片段。 // Java public static void main(String[] args) { long total = 0; final int maxCount = 100; for (int count = 0; count < maxCount; count++) { final long t1 …

12
为什么大多数编程语言都具有用于声明函数的特殊关键字或语法?[关闭]
大多数编程语言(动态和静态类型的语言)都具有特殊的关键字和/或语法,这些关键字和/或语法与用于函数声明的变量大不相同。我认为函数就像声明另一个命名实体一样: 例如在Python中: x = 2 y = addOne(x) def addOne(number): return number + 1 为什么不: x = 2 y = addOne(x) addOne = (number) => return number + 1 同样,使用Java之类的语言: int x = 2; int y = addOne(x); int addOne(int x) { return x + 1; } 为什么不: int x …

9
编程中的内存管理是否已成为无关紧要的问题?
背景信息 我重新访问了一个我很久没去过的古老(但很棒)的网站-Alioth Language Shootout(http://benchmarksgame.alioth.debian.org/)。 几年前,我开始使用C / C ++进行编程,但是由于参与的项目中的语言限制,从那时起,我几乎一直只在Java中工作。我不记得这些数字,而是想大致了解一下Java的状况。在资源使用方面与C / C ++背道而驰。 该执行时间仍然比较好,与Java在表现最差的4倍比C / C ++慢,但平均约(或以下)2倍。由于Java本身实现的性质,这不足为奇,并且它的性能时间实际上比我预期的要短。 真正的难题是内存分配 -最糟糕的是,Java分配了: 内存比C高52倍 比C ++高25倍。 52倍的内存...绝对令人讨厌,对吗?...还是?内存现在相对便宜。 问题: 如果我们不是在对工作内存(即嵌入式系统等)有严格限制的目标平台上说话,那么今天选择通用语言时是否应该考虑内存使用情况? 我之所以提出这样的要求,部分原因是因为我正在考虑迁移到Scala作为我的主要语言。我非常喜欢它的功能方面,但是从内存上看,它比Java还要昂贵。但是,由于内存似乎正在以每年更快,更便宜和更丰富的方式(似乎越来越难找到没有至少4GB DDR3 RAM的家用笔记本电脑),因此可以不争辩说资源管理正在变得越来越多与(可能需要昂贵的实现方式)高级语言功能无关,后者可以更快地构建更具可读性的解决方案?

4
JVM对尾调用优化施加哪些限制
Clojure不会单独执行尾部调用优化:当您具有尾部递归函数并且想要对其进行优化时,必须使用特殊形式recur。同样,如果您有两个相互递归的函数,则只能使用来优化它们trampoline。 Scala编译器能够为递归函数执行TCO,但不能为两个相互递归函数执行TCO。 每当我阅读这些限制时,它们总是归因于JVM模型固有的某些限制。我对编译器一无所知,但这使我有些困惑。让我举一个例子Programming Scala。这里的功能 def approximate(guess: Double): Double = if (isGoodEnough(guess)) guess else approximate(improve(guess)) 被翻译成 0: aload_0 1: astore_3 2: aload_0 3: dload_1 4: invokevirtual #24; //Method isGoodEnough:(D)Z 7: ifeq 10: dload_1 11: dreturn 12: aload_0 13: dload_1 14: invokevirtual #27; //Method improve:(D)D 17: dstore_1 18: goto 2 因此,在字节码级别,只需要一个goto。实际上,在这种情况下,繁琐的工作由编译器完成。 基础虚拟机的什么功能将使编译器更轻松地处理TCO? …
36 scala  clojure  jvm  tail-call 

6
Scala的重新发明系统设计
很多很多月以前,我做过面向对象软件工程的硕士。我涵盖了所有内容:项目启动,需求,分析,设计,体系结构,开发等,等等。我一直以来最喜欢的IT书籍是《开发面向对象的软件》,这是一种基于经验的方法(IBM-1996)。由一群当时的真正专家创作的书。它描述了以工作产品为中心的方法来进行面向对象的分析,设计和开发方法。 我设计和开发游戏时感到很开心,并在游戏中处于顶峰,但我开始感到有些过时:敏捷运动已成为当今的时尚,并用新的时髦词重新命名了一些众所周知的迭代和增量方法。当我说“需求”或“架构”时,经验不足的开发人员开始皱眉,好像这些东西已被魔术所取代。 设计和开发失去了乐趣,我将把整个IT行业抛在身后。 然后我发现了Scala。哦,就像尘土飞扬的道路上的小雨。一切都变得清晰起来,空气再次变得甜美起来,硬盘驱动器上的微弱灯光将闪烁到深夜,使我开心地陪伴在发现世界中。 我喜欢系统设计。我是一名建筑师,而不是程序员。我喜欢分析,设计,思考,争论,改进-我只是喜欢简单,干净和清晰的设计。 我们如何设计纯Scala解决方案? 当然,常规命令图,交互图,对象图等都可以全部替换或改进,以将命令性和功能性面向对象的系统融合在一起。当然,有一个完全不同的地方可以开放! 我不是在寻找肿的复杂性,而是在寻找灵活的简单性。实际上,Scala很简单(虽然有所不同),但可以像一条瑜伽裤一样扩展以适应您的需求。对于这种可爱的语言,必须有一个设计系统,该系统应从简单开始,并且可以扩展以适合您的要求和您的领域。当然不能是UML! 那么我们如何设计纯Scala系统呢?想象一下,您有足够的勇气从头开始设计一个完整的系统,并且知道您将只使用Scala- 您的模型外观如何?您必须描述什么类型的图的结构和行为?您将如何对选项,匹配项,混合项,单例对象等进行建模,而不会陷入扩展现有建模技术而不是使用新颖,轻巧的创新工具集的复杂性。 是否存在这样的设计/过程/解决方案,或者现在该发明一个?

7
函数编程与带类的OOP相比
最近,我对函数式编程的某些概念感兴趣。我已经使用OOP一段时间了。我可以看到如何在OOP中构建一个相当复杂的应用程序。每个对象都会知道该对象执行的操作。还是父母班上的任何事情都可以。因此,我可以简单地告诉Person().speak()别人说话。 但是如何在函数式编程中做类似的事情?我看到函数是头等舱物品。但是该功能只做一件事。我是否可以简单地使用一个say()浮动的方法,并使用等效的Person()参数来调用它,以便使我知道在说些什么呢? 因此,我可以看到简单的事情,在函数式编程中,我将如何做OOP和对象的比较,从而可以模块化和组织代码库? 作为参考,我对OOP的主要经验是Python,PHP和一些C#。我正在查看的具有功能特性的语言是Scala和Haskell。虽然我倾向于Scala。 基本示例(Python): Animal(object): def say(self, what): print(what) Dog(Animal): def say(self, what): super().say('dog barks: {0}'.format(what)) Cat(Animal): def say(self, what): super().say('cat meows: {0}'.format(what)) dog = Dog() cat = Cat() dog.say('ruff') cat.say('purr')

4
为什么我不需要功能语言如Scala的ORM?
我想知道是否可以在Spring + Hibernate项目中从Java切换到Scala,以利用一些Scala功能,例如模式匹配,Option以及对我来说似乎更简洁的语法。我一直在Scala生态系统中寻找默认的ORM,并且发现了类似Activate的想法(但大多数情况下,我尝试查找Hibernate是否可以与Scala一起使用)。搜索此内容,我已经在有关JPA + Scala 的Play文档中阅读了此内容。 但是最重​​要的一点是:如果您拥有功能语言的强大功能,您是否真的需要一个“关系到对象”映射器? 可能不会。JPA是一种抽象的Java数据转换能力不足的便捷方法,但是当您从Scala开始使用它时,确实感觉不对。 我对如何使用函数式编程来创建完整的应用程序没有深入的了解(这就是为什么我打算使用Scala以便使我能够逐步理解这一点,因为它结合了OO + Functional),所以我不知道为什么我不需要功能语言的ORM,以及解决领域模型持久性的功能方法是什么? 对于Scala,用于业务逻辑的DDD方法仍然有意义,不是吗?

2
将指称语义学应用于程序设计
我已经读过一些有关指称语义(DS)的文章,并且对设计计算机程序的过程非常感兴趣,在计算机程序中,类型和功能与数学之间有着牢固而清晰的映射。 是否有任何资源详细讨论了基于DS的设计程序?我已经看到了对该主题的一些表面处理。 我精通Haskell,Scala,Common Lisp和一些Scheme,因此使用这些语言的任何资源都将受到赞赏。
30 scala  haskell  scheme 

3
C#,Java和Scala的Closures / Lambdas /…方法的优缺点是什么?
我想知道C#和Scala之间在技术上的实现差异是什么,以及两种解决方案如何与布莱恩·格茨(Brian Goetz)发送给Project Lambda(JSR 335)邮件列表的Peek Past lambda电子邮件中表达的实现思想和关注点进行比较? 从电子邮件: 我们探索了“也许lambdas应该只是内部类实例,那真的很简单”之路,但最终走到了“函数是语言未来的更好方向”的位置。 并进一步: 世界的lambdas-are-objects视图与这个可能的未来冲突。对世界的lambda-are-functions视图并不了解,并且保留这​​种灵活性是不让lambda负担甚至带有客观性的负担的要点之一。 结论: Lambdas-are函数打开了大门。Lambdas-are-objects将它们关闭。 我们更希望看到那些门保持打开状态。 有人在Reddit主题上发表了一些评论: 我实际上通过电子邮件向Neal Gafter发送了电子邮件,由于我对他的解释的有限理解,C#和当前的Java设计非常相似,因为Delegates实际上是对象而不是函数类型。似乎他认为Java应该从C#的lambda的缺点中学习并避免它们(就像C#从Java的缺点中获悉并在一开始就避免它们一样)。 为什么“ Lambdas-are-functions”方法比“ Lambdas-are-objects”在将来能提供更多的机会?有人可以解释存在什么差异以及它们如何影响代码的编写方式吗? 看到Scala中的事情“可行”,我一直在想,我缺少关于C#/ Java(8)中采用/提出的方法的某些东西,可能与对向后兼容性的关注有关吗?
30 c#  java  scala  lambda  closures 

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.