タグ付けされた質問 「scala」

Scalaは、主にJava仮想マシンをターゲットとする汎用プログラミング言語です。一般的なプログラミングパターンを簡潔、エレガント、タイプセーフな方法で表現するように設計されており、命令型プログラミングと関数型プログラミングのスタイルを融合しています。

3
FutureとPromiseの違いは何ですか?
未来と約束の違いは何ですか?(AkkaとGparsで。) 彼らはブロックと同じように見えますが、getが呼び出され、将来の結果を取得することが約束されているときに未来の値を返します。
73 api  scala  groovy  akka 

4
マルチスレッドで関数型プログラミングは速くなりますか?物事の書き方が違うのか、物事のコンパイルが違うのですか?
私は関数型プログラミングの世界に飛び込んでいますが、関数型言語がマルチスレッド/マルチコアプログラムに適していることはどこでも読み続けています。再帰、乱数など、関数型言語がさまざまなことをどのように行うかを理解していますが、関数型言語でマルチスレッドが高速であるかどうかは、コンパイルが異なるため、または私がそれを書くためにわかりません。 たとえば、特定のプロトコルを実装するプログラムをJavaで作成しました。このプロトコルでは、2者は互いに何千ものメッセージを送受信し、それらのメッセージを暗号化し、何度も再送信(および受信)します。予想どおり、数千単位の規模を扱う場合、マルチスレッドが重要です。このプログラムには、ロックは含まれていません。 JVMを使用するScalaで同じプログラムを作成すると、この実装は高速になりますか?はいの場合、なぜですか?文章のスタイルが原因ですか?Javaがラムダ式を含むようになったため、書き込みスタイルが原因である場合、ラムダを使用したJavaを使用して同じ結果を達成できませんでしたか?または、Scalaが異なる方法でコンパイルするため、高速ですか?

3
F#とScalaの最大の違いは何ですか?
F#とScalaはどちらも関数型プログラミング言語であり、開発者が不変のデータ型のみを使用することを強制しません。どちらもオブジェクトをサポートしており、他の言語で記述されたライブラリを使用して、仮想マシンで実行できます。どちらの言語もMLに基づいているようです。 F#は.NETとJavaプラットフォーム用のScala向けに設計されているという事実にもかかわらず、F#とScalaの最大の違いは何ですか?

5
akka / erlangでアクターを使用するのが良くないのはいつですか?
私はakkaで毎日7〜8か月働いています。私が始めたとき、私はアプリケーションに取り組んでおり、ほとんどのオブジェクト間で通信するために、アクターは基本的にアクターシステム内のどこででも使用されることに気付きました。だから私は同じことをした-x / y / zの別のアクターをスピンアップする。 これはあまりにも無差別で、必要のないところに複雑さを加えているように思えます-しかし、アクターとプレーンを介した同期、または先物を介した非同期ロジックを使用する必要がある場所についての議論は見つかりません。同僚が似たようなことを言った後、私は自分のスタンスを熟考し始めました。最近、タスクを熟考し、不変の実装で同じ結果を安全に達成できるため、別のアクターの作成を避けたいくつかのケースを実現しました。たとえば、非常に頻繁にアクセスするデータベースまたはファイルから設定値を取得するようなものです結果を待つのが実際のユースケースです。 特に、不変の状態で遊んでいる場合、アクターは複雑さを生み出し、スループットを制限します。たとえば、オブジェクトの純粋な関数は、並行性のレベルを問わず、リスクなしで同時に呼び出すことができます。アクターは一度に1つのメッセージしか処理できません。別の考慮事項は、futureの使用を開始しない限り、結果を待つ必要がある場合にスレッドを保留することですが、非同期メッセージングやスケールを心配する必要がない場合は、アクターを採用するのはやり過ぎかもしれません。 だから私の質問は-俳優を使用するのに悪い時間はありますか?アーランがどのように見えるのか興味があり、他の人の洞察が本当に欲しいです。または、アクターの使用に関するいくつかの原則がある場合。

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にありますが、代数データ型をネイティブにサポートする他の言語でも同様です。 OOスタイルのサブタイプへの明らかなマッピングがあることがわかります。データ型は抽象基本クラスになり、すべてのデータコンストラクターは具体的なサブクラスになります。Scalaの例を次に示します。 sealed abstract class ConsList[+T] { def map[U](f: T …

3
Scalaのコンパニオンオブジェクトと静的メソッドの利点は何ですか?
Scalaには静的なキーワードはありませんが、代わりにコンパニオンオブジェクトを通じて同様の機能があります。舞台裏では、コンパニオンオブジェクトは静的メソッドを持つクラスにコンパイルされるため、これはすべて構文糖です。この設計選択の利点は何ですか?欠点?他のラングアンジュには同様の構造がありますか?
50 scala 

4
Javaと比較したScalaのパフォーマンス
まず第一に、これはどちらが優れているかを判断するための言語-X-言語-Yの質問ではないことを明確にしたいと思います。 私はJavaを長い間使用しており、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ミリ秒、Scalaで493ミリ秒(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 = System.currentTimeMillis(); final int …

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のみで作業を続けてきました。リソース使用量の点でC / C ++に反しました。 実行時間は最悪で、JavaはC / C ++よりも4倍も遅いを実行すると、まだ比較的良好であったが、平均の周りの(または以下)2倍に。Java自体の実装の性質により、これは驚くことではなく、パフォーマンス時間は実際に私が予想したものよりも短かったです。 実際のレンガはメモリ割り当てでした-最悪の場合、Javaが割り当てられました: Cの52倍ものメモリ C ++の25倍以上。 メモリの52倍...絶対に厄介ですよね?... またはそれは?現在、メモリは比較的安価です。 質問: 作業メモリに厳しい制限があるターゲットプラットフォーム(つまり、組み込みシステムなど)に関して話さない場合、今日汎用言語を選択する際にメモリ使用量を考慮する必要がありますか? 第一言語としてScalaへの移行を検討しているからです。私はそれの機能面が非常に好きですが、私が見ることができることから、それはJavaよりもメモリの点でさらに高価です。ただし、メモリは年々速く、安く、豊富になっているようです(少なくとも4GBのDDR3 RAMを持たない消費者のラップトップを見つけることはますます困難になっているようです)。より読みやすいソリューションを迅速に構築できる(おそらく実装上高価な)高レベル言語機能と比較して無関係ですか?

4
JVMがテールコールの最適化に課す制限
Clojureは、単独で末尾呼び出しの最適化を実行しません。末尾再帰関数があり、それを最適化する場合は、特別な形式を使用する必要がありますrecur。同様に、相互に再帰的な関数が2つある場合、を使用してのみ最適化できますtrampoline。 Scalaコンパイラは、再帰関数に対してTCOを実行できますが、2つの相互再帰関数に対してはできません。 これらの制限について読んだときはいつでも、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()人に話させるように言うことができます。 しかし、関数型プログラミングで同様のことを行うにはどうすればよいですか?関数がどのようにファーストクラスのアイテムであるかがわかります。しかし、その機能は特定の1つのことだけを行います。私は単に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に切り替えて、パターンマッチング、OptionなどのScalaの機能を活用し、一般的にはより簡潔な構文に見えるかどうか疑問に思っています。私はScalaエコシステムでデフォルトでORMを探していましたが、Activateのような考え方を見つけました(しかし、ほとんどはHibernateをScalaで使用できるかどうかを見つけようとしています)。これを検索して、JPA + Scalaに関するPlayのドキュメントでこれを読みました。 しかし、最も重要なポイントは、関数型言語の力を持っているときに、オブジェクトとリレーショナルのマッパーが本当に必要なのかということです。 おそらくない。JPAは、データ変換におけるJavaのパワー不足を抽象化する便利な方法ですが、ScalaからJavaを使用し始めると、本当に間違っていると感じます。 私は関数型プログラミングを使用して完全なアプリケーションを作成する方法を深く理解していません(だからこそ、オブジェクト指向と関数型を組み合わせているため、これを段階的に理解できるようにScalaを使用するつもりです)。関数型言語のORMが必要ない理由と、ドメインモデルの永続性に取り組むための関数型アプローチはどうなるのか。 Scalaでは、ビジネスロジックに対するDDDアプローチが依然として理にかなっていますよね?

2
プログラムの設計への表示的意味論の適用
デノテーショナルセマンティクス(DS)について少し読んだことがあり、型と関数が数学に強く明確にマッピングされているコンピュータープログラムの設計プロセスに非常に興味があります。 DSに基づいたプログラムの設計を詳細に議論するリソースはありますか?私は対象のいくつかの表面的な治療を見てきました。 私はHaskell、Scala、Common Lisp、および少しのSchemeに精通しているので、これらの言語を使用するリソースは大歓迎です。
30 scala  haskell  scheme 

5
Groovyはなくなりますか?[閉まっている]
この質問は何度も聞かれたと思います。しかし、私はこれらの言語の将来は何であるかという意図を持ってもう一度尋ねたいです。 私は最初にGroovyを紹介され、本当に気に入っていました。構文がよりシンプルで、Javaにはるかに近いと感じ、Grailsをすばやく学習することができました。 それからScalaがあり、ウェブフレームワークはLiftです。私はまだScalaを学んでおり、時には構文が非常に難しいと感じています。 しかし、Groovyの将来はどうなるのか、まだ疑問に思っています。Groovyの作者が、Scalaを知っていればgroovyを作成したことはなかったと言ったとき、未来があるのではないかと思うようになります。もちろん、Groovyは大きな進歩を遂げており、Grailsは今日多くの大企業で使用されています。 もし今日Grails対Liftを見るとすれば、Grailsが勝者になります。より多くの企業がそれを使用しています。しかし、これまで述べてきたことをすべて考えると、Groovyに投資すべきかどうか知りたいと思いますか?Groovyは廃止され、Scalaはより良い選択ですか?BMWのCEOがメルセデスを運転すると言ったら、なぜ私たち全員がメルセデスも運転してはいけないのか疑問に思うでしょう。 (この質問が本当に広範で、閉じられている可能性があるかどうかは理解しています。しかし、他の人のためのオープンなWikiにしたいと思っています。)
30 java  scala  groovy  grails 

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.