・Scalaの紹介文(さわり)
Scalaは簡潔かつ優雅で型安全な方法でよくあるプログラミングパターンを表現できるように
設計された汎用プログラミング言語です。
Scalaはオブジェクト指向と関数型言語の特徴をスムーズに統合しておりJavaやその他の言語を扱う
プログラマをより生産的にすることができます。(以下略)
ttp://www.scala-lang.org/node/25 ・Scalaに関する書籍(英語)
ttp://www.scala-lang.org/node/959 リファレンスマニュアルや草稿のPDFなども充実しているのでそちらも参照してください。
日本語の資料には、チュートリアルの訳やIBM dW、IT Proの連載記事、各々で開かれた勉強会の資料などがあります。
このスレッドは天才チンパンジー「アイちゃん」が 言語訓練のために立てたものです。 アイと研究員とのやり取りに利用するスレッドなので、 関係者以外は書きこまないで下さい。 京都大学霊長類研究所
スクルト!
次のバージョンアップで、C#のTPL (Task Parallel Library)っぽい並列コレクションが 入るんだっけ? 後、欲しいのは、IO周りだな。Javaのクラス使う事が多すぎる。 XML周りはもうちょっと拡張して欲しいかな。操作によってはめんどい事もある。 バイナリXMLとか、HTML5とかもサポートされるといいかも。 あ、あとは、もうちょっとソースにjavadoc書いて欲しい。
まだしょうがないとは言え、イベントも入門ばかり、出る本も入門ばかり なぜか数だけは多い
まぁ、とりあえず裾野を広げないことには、な。。
Rubyのほうが優れているのにこの言語を勉強する意味がわからん
セグメントが違うだろ……一部で被ってる程度
13 :
デフォルトの名無しさん :2011/01/10(月) 01:51:50
Ruby の対抗馬は Groovy。片付けとけ。
Ruby厨はどこにでも現れるな。 信者を騙ったアンチかと思う位だ
信者を騙ったアンチだからだよw
暗黙の型変換の定義をコンパニオンオブジェクトに書いているのに 参照してくれないのはなぜでしょうか? class C(val i:Int) { def m1(c:C) = 1 } object C { implicit def string2C(s:String) : C = { new C(0) } } scala> "abc" m1 (new C(3)) <console>:7: error: value m1 is not a member of java.lang.String "abc" m1 (new C(3)) ちなみに import C._ とすればうまくいきます。
"abc" m1 (new C(3)) これじゃあ型Cのインスタンスを引数に取るm1っていう名前のメソッドっていうだけで 文字列を型Cに変換するべきとまではコンパイラに伝わらないから Cのコンパニオンオブジェクトの中まで探索されない val c: C = "abc" c m1 (new C(3)) ならおk
JavaできないやつはScalaはじめんの幾分抵抗あるだろな
>>17 ありがとうございます。
なるほど。
C型のコンパニオンオブジェクトの中を探しにいくのは
「C型から別の型への変換が必要なときに限る」
ということですね。
今関連しているすべての型のコンパニオンオブジェクトが
検索対象に入ると勘違いしてました。
20 :
デフォルトの名無しさん :2011/01/11(火) 22:41:57
Scalaって普及しますかね? Javaを使っていると どうしても冗長性が気になるんですよね。 Scala使ってみたいな。
scalaはいいよ。 コンパイルは爆速。 ソースに型エラーがあるくらいでコンパイラがスタックトレース吐いて落ちることもない。 ドキュメントも充実。 強力な型推論があるので、高階関数でも型注釈まみれになることがない。 eclipseが重すぎて気が狂うなんてことも勿論ない。
ScalaをEclipse上で書こうとしたら気が狂いそうになったw なんかオススメのエディタとかIDEとかありませんかね?
IntelliJ IDEAオススメ
25 :
デフォルトの名無しさん :2011/01/12(水) 20:42:21
scalaに関する最強の本ってなんですか? 別に英語でもいいんですが。
26 :
odersky :2011/01/12(水) 23:18:11
言語仕様書が最強なんじゃね?読んだことないけどな
28 :
odersky :2011/01/12(水) 23:34:11
言語仕様書と実装が、すごく微妙に食い違ってるとこあるから、だめ
標準ライブラリのソースを3回写経しろ。
それで理解できる言語じゃないでしょう
>25 Scalaで学ぶ関数脳入門 がお勧め。 関数型プログラミングの解説をしつつ、Scalaでの書き方を解説と言う感じ。 基礎がしっかりつく。 Scala言語自身をしっかり学びたいならば、ボクらのScala が良いかと思う。 この2冊呼んで、あとは通称コップ本を手元においておけば良かろう。
俺も一般プログラマにはそれがいいと思う コップ本は意味不明すぎた
英語でもいいから最強っていうのなら
>>26 のOdersky先生の言うとおりだと思うけど
きっとある程度の自信はあるんでしょ
>>20 俺は絶対普及しないと思う。Java程バックというか後ろ盾がないし、Haskellには美しさやオールイミュータブルじゃないことによるデメリットが大きすぎるし、Ruby並に動的な機能を使えるようにするために言語仕様を拡大しすぎた。
まあ、それでも一部の人にはウケるだろうね。言語にこだわりがあるなら勉強すればいいと思う。
Scalaの後ろ盾はJavaじゃん なにいってんの
36 :
34 :2011/01/14(金) 02:59:10
× Haskellには美しさや ○ Haskellには美しさで劣り、
37 :
34 :2011/01/14(金) 03:02:29
>>35 ライブラリだけじゃ全く足りないと思うよ。初心者用の本とか運用ノウハウとか教育とか、もういろいろ足りないよ。VMなにそれみたいな、初心者でもやってみようかなと思わせるぐらいじゃないと。Javaと比べるならね。
なんかおまえの言ってることはズレてて捉えどころがないから適切に突っ込めない
Rubyもそんなにとっつきやすい言語じゃないけど、RoRのおかげで普及したようなもんだし云々。
RoRって別にbaseがRubyでなくてもよかったよな
>>23 eclipseはSSD使わないとモッサリかも
問題はjavaがこれからどうなるかだな。
>>34 >Ruby並に動的な機能を使えるようにするために言語仕様を拡大しすぎた。
の一文見ただけで、まともにScala触ったことがあるのかきわめて疑わしく思える…
基本的にScalaの組み込み構文で動的に処理されるものなんてほとんど無いがな
仕事でつかってるぜ
むしろリフレクションなんかはScalaの弱点だと思っていたけど、 どの辺がRuby並に動的なんだろう
適当なこというけどリフレクションないとWebフレームワーク作れないんじゃねーの
>>46 お前は馬鹿なのか?大丈夫か?
と釣られてみるテスト
implicit defとかのこといってんじゃね?
Webフレームワーク=RoRじゃないだろ
静的にできることでも動的にやっているのか それともポリモーフィズムなんかは全部動的だと思っているのか どちらにしても怖いな
>>46 うんだからRubyとPHP以外まともな
Webフレームワークが存在しないわけで
必要なのはメタプログラミングの手段であって、リフレクションは道具に過ぎないんじゃ?
リフレクションもそうだけど、個人的にはFFIを強化して欲しいな。 すべてJNI経由というのはつらい。 Haskellのccallみたいなのがあればいいのに。
55 :
デフォルトの名無しさん :2011/01/15(土) 16:52:01
Scalaに興味を持ちつつある。 Liftってどうなんだろう? Google App Engineで使ってみようかな。
Liftもいいが、Play!もいいらしい。 よりScala的なのは前者。
>>55 App EngineでLiftは、App Engineの制限に引っかかりやすい(裏でActorつかってたり)から、あまりおすすめできない。
個人的にはscalatraとかが、シンプルでおすすめ
JavaでWebフレームっていう時点で 無理があったからRubyが成長したわけで Javaをベースにした言語だとその無理が 改善されるわけではない
JavaでWebフレームワークで無理があるって意味がわからない そことRoRの飛躍もさっぱり関連性がわからない なにを言っているのだ?
あほが一人混じっています
具体的な説明できないやつが一番アホ
>>59 HTML や SQL 周辺のシステム境界は Java でもリフレクション使いまくりになるから
動的型付け言語が楽だが、そこに挟まるアプリ層が厚くなれば動的型付け言語なんて
危なくて使っていられなくなるよ。
あんた DB 舐めて表示する程度の Web アプリしか作ったこと無いんじゃね。
危ないって変な表現だな デバッグやリファクタリングが面倒とか言うなら理解出来るが
デスマはあなたの健康を損ねます。
def x = 1 とか書けることに気づいた。 ひょっとしてdefってvalのシンタックスシュガーなのかな? 関数定義のときだけちょっと変換してくれるだけの。
>>67 違う。def x = 1は、呼ばれるたびに1を返すメソッドの定義。
>>67 > def x = 1
これは、関数定義で
def x: Int = { return 1; }
の省略されたもの。
> ひょっとしてdefってvalのシンタックスシュガーなのかな?
ちょっと違う。
だけど、あるクラスのフィールド値を参照したい場合、
・フィールド値の参照として書いても、
・getterメソッドを定義して、メソッド呼び出ししても
同じような書式で出来るっていうのはあるよ!
----------
class MyClass( arg1: Int){
var y1 : Int = arg1
def y2 : Int = y1
}
val p = new MyClass( 2 )
println(p.y1) //<-- フィールドの参照
println(p.y2) //<-- getterメソッドで呼び出し
----------
Scala本3冊もってるけどまだ全然身に付いてない
>>69 それだと p.y1 はフィールド参照じゃなくてgetterだし p.y1 = 0 はsetter呼び出しになるよ
private[this]以外のvarは自動でsetter/getter定義される
RegexParserで @から開始する行をコメント行 \nで始まる行はスキップするような以下の例はどうやって パースするのがいいの? @ \n @ test
実践的なノウハウについてもかなりページを割いてるから、買ってもいいんじゃない。
Haskellとこれとどっちがつおいの?
Haskellがバッハだとすれば、scalaはベートーベンかな。
さては、うまいこと言ったつもりだなw
Haskellに例えられたのは、どのバッハなのかが……
80 :
デフォルトの名無しさん :2011/01/29(土) 23:31:51
3月の日経ソフトウェアでScalaが紹介されているね。 浅海さんによる紹介で分かりやすくてGood。 でも、見開き4ページ分だけ、、。 連載でやってほしいなあ。。
var は variable val は ?
日本人は、rとlの区別が付かない。
value
代入不可の定数が value なのか 数学的な意味合いとしてはそういうもんなの
数学的というよりコンピュータサイエンス的
87 :
デフォルトの名無しさん :2011/01/30(日) 17:35:01
コップ本ゲットしました!!!!!!
みなさん開発環境何使ってます?
秀丸
はげ・・まる・・・?
つるぴか
オライリーのプログラミングScalaは、わりとおすすめ。
コップ本はすごく丁寧に書いてるけど、 プログラミング上級者には冗長だな
>>93 後半を読んでもその台詞を吐ける奴って1%以下な気がするが。
これって既知のバグかしら? locally -> identity にしてもだめで scala-2.8.0-finalから2.8.1-finalにしたけどやっぱりだめだった % scalac -version Scala compiler version 2.8.1.final -- Copyright 2002-2010, LAMP/EPFL % cat Test.scala object Test { { class Foo(v: Int = 1) locally { new Foo } locally { } /* この行を削除するとコンパイルエラーは発生しない. */ } } % scalac Test.scala Exception in thread "main" java.lang.Error: symbol variable Foo$module$1 does not exist in Test.<init> at scala.tools.nsc.symtab.SymbolTable.abort(SymbolTable.scala:33) at scala.tools.nsc.backend.icode.GenICode$ICodePhase.scala$tools$nsc$backend$icode$GenICode$ICodePhase$$genLoad(GenICode.scala:843) at scala.tools.nsc.backend.icode.GenICode$ICodePhase.genLoadArguments(GenICode.scala:1030) at scala.tools.nsc.backend.icode.GenICode$ICodePhase.scala$tools$nsc$backend$icode$GenICode$ICodePhase$$genLoad(GenICode.scala:742) ...
前はsbt使ってwindowsで開発してたんだけど、 OSをlinuxに変更したのでフォルダ毎もってきてsbt上でコンパイルすると java.io.FileNotFoundExceptionが発生してしまいます。 コンパイル成功させるにはどうしたら良いかどなたか教えて頂けませんでしょうか。 尚sbt-appengine-pluginを使用しています。 sbt自体は立ち上がり、updateも成功しています。
98 :
97 :2011/02/03(木) 18:29:57
すみません。解決しました。 ただsbt-appengine-pluginの方をpublishし忘れてただけでした。
おめでとう
100 :
デフォルトの名無しさん :2011/02/04(金) 21:59:37
なぜソースに型エラーがあったくらいで、コンパイラ自体が スタックトレース吐いて落ちるんだ…納得いかん。
オライリーのプログラミングScala買った
日記じゃないんだから、役に立つレビュー書けよ。
まだ3ページしか読んでないからちょっと待てよ
>>102 1章しか読んでないけど、日本語は問題ないっぽい
case classを継承するとdeprecatedだと言われるんだけど、何が駄目なのかな? case class C() case class D() extends D warning: there were deprecation warnings; re-run with -deprecation for details defined class D
代数データ型が欲しいときは、case classの継承でなく extractorを使えということらしい。
JじゃないRuby(Rails)はプラットフォームがどれもクソすぎて使う気にならない。
プラットフォームってなにさ。
113 :
デフォルトの名無しさん :2011/02/10(木) 23:24:37
implicitって何て発音するんですか?
いんぷりしっと
116 :
デフォルトの名無しさん :2011/02/11(金) 00:35:15
>>108 これって、Scalaにとっては逆風だなあ、、、。
これって、、、
これまで David Pollak氏は、WebフレームワークであるLiftを
Lift in Scala で作ってきた。
David氏いわく”Liftは現在入手可能な最高の Web フレームワーク”で
あるにもかかわらず、Scalaがプログラマの間での普及度がいまいちなことから
メジャーな言語であるRubyで開発することに切り替えたってこと?
しかも、すでに、Liftの大部分はJRuby上で動作するまで来ている?
つまり、今後は、Lift in JRuby をメインに開発していくってこと?
Liftは、Scalaのキラーアプリになると思っていたんだがなあ、、、。
117 :
116 :2011/02/11(金) 01:01:36
>>116 でも、David氏は完全にScalaを捨てたってわけでもないんだな。
今はとにかくLift自体を普及させることに尽力をつくすってことか。
JRubyが拡大すれば、いずれ、ScalaへのBridgeとなるってことか。
どっかのインタビューでRubyは結局テストコード書きまくるハメになって糞だと気づいたっていってたし
テストコード書かないといけないのはどの言語でも同じだ
必要なテストの数が多いか少ないかは大いに問題なんじゃないの
>>118 http://www.infoq.com/jp/news/2008/03/liftweb >わたしはこれまで Rails による開発を 18 カ月、Java による開発を 10 年経験してきました。
>Rails はウェブ開発に新しい風を吹き込みました。よく使うタスクはコマンド一発で実行することができます。
>実にすばらしい。しかし、私は気が付いてしまいました。Ruby の動的型付けは多くのエラーを引きおこすことに。
>そして、安心してデプロイするためには 95% ものテストカバレッジを達成しなければいけないことに。
>95% のテストカバレッジを得ることの代償として、私の書いたコードは(テストコードも含めて) Java で書いたものと
>同等のサイズにまでふくれあがってしまいました。
Rubyで型チェックとか悪夢だからな Scalaはコンパイル通すたびにもっと美しい型制約がないか試したくなる sbtを裏で走らせておけば脳汁出まくり状態だよ〜
静的型付け言語は後でやらなきゃいけないことを先付けで強制する。 動的型付け言語はそれをすべて後回しにする。 テストやメンテを無視して良いなら、とりあえず動く物を作るには動的型付け言語が速くて当たり前。 だがそれを持って生産性が高いなどと言ってる奴を見るとアホかと思う。
JVM使っている時点で将来性が皆無だよなぁ Clayみたいにllvm使わないと今後は生き残れないねぇ
今のところ中間言語の仮想マシンは JVM 一択。安定性もデバッグも プロファイリングも、大手各社が金を投入しまくっただけはある。 将来的に載せ替えの必要があるならコンパイラレベルで開発すれば よいだけの話だな。
>>106 ソースコード間違っているぞ(w
case classの継承は、2.8でdeprecatedになった。詳細は、プログラミングScalaにあったはず。
ScalaはJVMだからダメっていうやつはJavaの知識がないから手だしにくいってだけだろ
この言語は今どういうところで使われているです?
ヒゥイッヒヒー
TwitterのバックエンドがRubyからScalaに置き換えられたり、 位置情報系サービスのForsqueareは全面Liftで作られてたり 日本だとGMOの求人に書いてたけど、バックエンド担当に2人Scalaエンジニアがいるらしい
やっぱコップ本はダメだな。 あれは1冊目には向かない。 Scalaの書き方がなんとなくわかっていて、 より深い理解をするための本だね。 1冊目はオライリーがよさげ。
一冊目としては、「Scalaで学ぶ関数脳入門」がお勧め。 とにかく、最初に、関数型言語とかScalaの特徴をつかむのに良い。 1.5冊目として、「ボクらのScala」 も読みやすいのでお勧め。 個人的には、海外製の本は、言い回しがあんまり好きじゃない。 なんというか、章のはじめのあいさつ文みたいな書き出し、とか、 いまいち的を得ていない例題とか、、、読んでいてテンポが狂う。
お勧め本に関しては同意見だが、海外本はああいうもんなんだから仕方ないw
向こうの人はなぜがみんなダグラス・アダムス好きだよねw
もっと簡単な入門書が必要なのかもね。
コップ本すら解らない連中なんて 勉強する資格ないだろ
139 :
613 :2011/02/12(土) 12:37:17
確かに将来的にはともかく 現段階では、コップ本で理解できないようでは 環境構築やライブラリ周りで挫折すると思う 仕様もまだ安定していないし……
もう2.9の話が結構出てるからな 付いてこれないやつはどんどん置いてかれるぞ
早く枯れろ
何か手頃な練習問題のページないですかね。回答例も見られると良いのですが
>143 S-99 Scala Problemsでググれ
すげえなscala、宣伝文句がやたらと興味を刺激してくる
147 :
デフォルトの名無しさん :2011/02/13(日) 03:38:12
日本人はクレイジーだな
version2.9は、2月にはもうRCがでるらしい
Scala 2.9の変更点について、2.9行でまとめてくれ。
Parallel Collectionsがメインかなぁ
scala.collection.mutable.SynchronizedMapとどう違うの? Lock-free/Wait-freeなのかな?
果てしなくメソッドが増え続けるコレクションクラスだが、順列・組合せが入るのは 便利だな。
>>154 for(i <- (1 to 10).par) process(i)
これでprocess(i)が並列実行される
サンクス なるほどActorつくらなくても手軽に並列化できるんですね 関数型の本領発揮ってかんじ
いや、C#で既に導入済だし。
scala-clもこんな感じだったな
これってモジュールimportしたらスレッドプールが作成されるのかな?
>>158 自分はErlangをイメージしました
MPIのパクリだろ
Clojureじゃないの?
>>160 5分くらいソース読んだ感じだと、importしただけどはおそらくスレッドプールは作られないと思う。
src/library/scala/collection/parallel/Tasks.scala あたりを見てみたが、Parallel Collectionでforeachなどの
高階関数が評価されるタイミングでobject ThreadPoolTasksが評価されてシングルトンインスタンスが
生成され、ここで初めてスレッドプールが出来ると予想される。
間違ってたらゴメンナ
Scalaの型関係の詳細ってどこ読むのがベスト?
>164 え、じゃあ、初回は遅いじゃん。
>165 コップ本かバク本
>>166 ただの想像に過ぎないけど、
・import した時点で幾つスレッドプールが必要になるかは分からない
・import が重いのと初回が重いのとどちらが良いとも言えない
・初回が重くとも loop の回数が大きければ全体として pay する
・初回が重くとも一回の loop 毎の処理が重ければ全体として pay する
・当たり前だけど、損益分岐点を越えられない場合は使わないでね
みたいな感じなんじゃないかなあ
>>164 まぁ初回にThreadPool生成のコストを払う戦略になってるのは確かだな。eagerではなくlazyに
やってるんだろう。
それがイヤで事前にThreadPool用意したいなら、scala.collection.parallel.ThreadPoolTasksを
自分で先にどこかで評価しておけば、先にThreadPool生成のコストを支払っておくことができる。
importってJavaと同じで、単にコンパイル時の名前の解決じゃないの? それとも違う意味で言ってる? なんか他の言語の似たような機能と勘違いしてる人がいるきがする
>>170 Java でも class がロードされる時の処理を記述出来なかったっけ?
>>171 sttic initializerのことだな。だがアレはあくまでクラスがクラスローダでロードされた時点で
実行される処理。
import文自体は、171の言うとおり単なる名前解決でしかないはず。
Parallel Collectionなクラスをimportしてるクラスがロードされたとして、
そこでimport先のクラスも一緒にロードされるとは限らない、んじゃなかったっけ?
import したクラスがロードされなかったら、インスタンスを作ったり クラス変数やクラスメソッドを利用する時に困るんじゃない? 自分はそういう理解だったけど、間違ってたらご免。
importせずに使ってるクラスはロードされない、って理解なん?
なるほど、サンクス
>>177 http://www.infoq.com/news/2011/02/lift-jruby >I love Scala and it's my favorite programming language.
>After talking to a lot of development organizations and watching Scala's adoption rate,
>I've realized that Scala is unlikely to have Ruby or even Python-level adoption
>in the next few years.
原文の"in the next few years"が翻訳されていません。
Lift作者はScalaが普及しない事に気付いたとは言っていません。
Scalaが普及するのに時間がかかる事に気付いたと言っています。
時間を掛ければ採用されるとも書いていない
Scalaを実際に使ってみて、どんな点が良かったです?
Javaのスタックトレースを読み慣れるようになった点
転職出来た点
こりゃLiftはRubyに降伏宣言したのと 同義だよねー Scalaに未来がないから見切りつけたのか
JVM汎用では無く、JRuby専用APIってなんだろうとおもったら、 Javaに、ScalaのobjectなどJavaと整合性が取れない部分についてJRuby拡張して合わせるのか。 JRubyで作ったScala依存プログラムがどれだけふえるんかね?
しょうもないことだけど、fewやlittleは冠詞を付ける付けないで 意味が変わるって中学の頃習ったけど、 冠詞を付けないfew yearsって結構用例でてくるよな。 この場合もaを付けないと、意味が変わってるんだろうか。
ちょっとしたものを作る時や開発段階ではコンパイルしないで実行 リリースする時はコンパイルしたものを配備 ってことをコード等を変更せずに出来るです?
Scalaは基本的にコンパイル言語なんで無理
>>184 EUじゃこれ受託するところって
未踏(笑)と同じ扱いだからな
Scalaインタープリタってやつ使えないんです?
コンパイルして実行してるだけじゃないの
言語系の開発で2億もらっても大したことないよね Javaは2000億円以上つぎ込んでるし llvmだって100億ぐらいつぎ込んでる
VMから作るプロジェクトとは比較にならんだろ
型を書くのってそんなに大変なことなんだろうか
>>187 意図と違うかもしれないが、
Getting Started with Scala
http://www.scala-lang.org/node/166 「Script it !」のように、REPLに打ち込むのとおなじように、ファイル読み込みして実行出来る。
-- HelloWorld.scala --
object HelloWorld {
def main(args: Array[String]) {
println("Hello, world! " + args.toList)
}
}
HelloWorld.main(args)
$ scala HelloWorld.scala foo bar
コンパイルするとき一番下の行が邪魔でコンパイル出来ないし、
スクリプトなら、「println("Hello, world! " + args.toList)」だけでも実行できるから
なんともアンバランスだけど。
最後の一行抜けば、 scala -i HelloWorld.scala -e "HelloWorld.main(args)" a b で実行できるし、コンパイル後 scala HelloWorld a b で実行できるけど、カッコ悪いな。
>>196 あしゃしゃす
コード変更しないといけないのは厳しいですね
まあコンパイルなんてそんな面倒じゃないか
scalaコマンドに-i付けるとプリロードになる。 この時、コンパイルしてtmpディレクトリにクラスファイル出来るから、結局コンパイルしてるREPLに移行する。 そして、-eは、文字列をevalしてREPL終了する 単に、scalaソースだけ引数にする場合はREPLで解釈して終了する。
>結局コンパイルしてるREPLに移行する。 コンパイルして、読み込んで、REPLに移行する うはー
オライリー本いいね ↓こういう素朴な疑問が1章に書かれてあーなるほどなーって思った なんで左が変数名で右が型なのか ⇒コンパイラが構文解析しやすいから ジェネリクスみたいな型指定でなんで <> ではなく [] になったのか ⇒ < とかは不等号としてメソッド名にそのままつけることがよくあるため(角カッコはメソッド名として使えない)
そうそう、コンパイラが…て説明あるね
コンパイラの都合でできてる言語ってのは 糞の塊
Scalaは、Javaの都合でできすぎ。
それでむしろ利便性が増してるんだからいいことずくめ。
いや、LLVM版Scalaを目指すべき。
Delphiはコンパイラよりだったとおもうが、明快だったのでは?
C言語とかがコンパイラの都合だらけでかつ使いにくい言語なのは事実だが、 これでも時代は下って、技術と学問は進歩してるんだし。
コンパイラ寄りっていったらLispが最強だよな エディタでAST書いてるもんだもんな
有名なのはLL(1)で構文解析できるようにしたというPascalだよな ああいうのは無駄だと思うけど、C++のテンプレートの入れ子で出る 「>>」がシフトと区別つかないってのも有名な話で、 それをわかってていつまでも引きずる必要もないわな
仮に左に型右に変数名をおいたらvalとかvarの場所はどこになるん? val Int i = 10 みたいになっちゃうの?
Javaと変わらんだろ final int i = 0
2.8で入った、@specializedだけど、普通に val m = new mutable.HashMap[Int, Int]() みたいに使った時は、specializedなHashMapが使われるの? それとも、この宣言のどっかに@specializedを埋め込まないとダメ?
Scala2.8では、タプルや一部の関数にしか@specializedは対応していなくて、HashMapは未対応。
>>212 ってことはval相当のを書くほうがfinal付ける分タイプ数多くなるんか、それはやだな(var相当のほうがタイプ数多くなるって言うなら別にいいけど)
javaと同じだと括弧なし関数どうやって書くのかワカンネーし、書き比べるとscalaのほうがまとまってる感じするわー
scala
val i: Int = 10
var i: Int = 10
def i: Int = 10
def twice(i: Int): Int = i * 2
java
final int i = 10
int i = 10
?
int twice(int i) = i * 2
型推論させると
scala
val i = 10
var i = 10
def i = 10
def twice(i: Int) = i * 2
java
final i = 10
i = 10
?
twice(int i) = i * 2
このスレで誰かが進めてくれた 「ボクらのScala」買ってみたよ。 初学にはコップ本よりこっちの方が断然いいね。 (コップ本はscalaの言語仕様を一通り知ってから読む本だと思う) まあ、説明の順番とか、どうでもいいことにページ数割いてあったりとかは 不満は残るが。 あとはページ数を1.5倍にして、もう少し詳細に突っ込んで欲しい気もした。 まあ、まだ2時間しか読んでないけど、こんな感想でした。
>214 あー、そうなんだ。自分で定義するクラスしか駄目なのかな。
型推論が不思議で寝不足になりそうです;; val randomVariables = for (i <- 1 to 100) yield { if (i < 10) { r.nextInt(10000) } else { r.nextDouble() } }
>>217 Javaのプリミティブをちゃんと勉強したほうがいいと思う
Akkaって何なの? 教えて?
>>220 actorとかSTMとかその他いろいろ入ってるライブラリ
Scala IO 0.1 releasedなわけだが、何か感想ないの?
>>218 自分が思ったのと違う結果だった
if(true) 1 else 1.0
の型がDoubleになるんだなAnyValになるのかと思った
暗黙の型変換定義の見え方で変わってくるのかな
>>225 そうなんですか。
OTPはErlang本見ればわかるのでちょっとあとで舐めてみます。
ちなみに、Akkaの耐障害性ってどうやって実現してるんですかね?
TeracottaとEhcacheを内部で利用してゴニョゴニョ
してるのかなぁ。商用サポート前提のコードじゃなければいいんだけど
Scalaで、ストリーム操作する時ってやっぱJavaの使うんですかね?
おれも気になる
>>227 OTPはたしかにPragmatic/オーム社ので結構分かりやすく書いてあった。(別件だが、bpstudyでMnesiaの部分はオライリーで本来のアクセス方法が載るはずと言ってた)
Akka 1.1以降で、TeracottaやEhcacheみたいに数百GBクラスの単一オブジェクト?に関するクラスタリングの商用プラグインを出して、そちらのサポートで作者は仕事するつもりらしい。あとは差別化でおなじみな監視や分析系のGUIもそうなるかも。
ただし、通常の耐障害性のある分散はOTPと同じ仕組みなので問題ないと思う。
監視担当のアクターと実行担当のアクターで耐障害性上げる仕組みや、起動中の変更反映など。STMは1.1で作り直しみたいだ。
日本語版来てた
http://www.infoq.com/jp/news/2011/02/akka10
訂正: infoqの記事の日本語翻訳
>228 Scala IO 0.01を使うんじゃないの?
0.01とかそんなおっかないもの使いたくない
Scalaz にはIO入ってないんだっけ? 標準ライブラリを補完しよう的なプロジェクトは幾つか有るが、 誰かまとめて欲しい。
先週のscala-tohokuがそのネタでしたね
>>230 Teracotta商法かぁ最悪な展開になりそうだな。
細かいバグ以外オープン阪はサポートしない
ってスタンス継承されちゃうのか。
Teracotta高い割にバグ対応とか全然してくれないし
Stringをパターンマッチして "abcde" match { case "ab" :: s :: "e" => println(s) case _ => } 的なことがしたいんだけど、素直に正規表現使え?
まあそのためにあるんだし
正規表現のパターンマッチは一回変数に入れなきゃいけないのがダサいのよね
自作のExtractor書けば?
Scala使うなら、IntelliJ IDEAかせめてNetBeans使えよ。
確かにeclipse pluginのもっさり感はひどいね。 コンパイルも遅いの?
俺のPCだとそんなリッチな統合開発環境、起動するだけで5分はかかるな
ensimeで
今そこ
>>242 小田好先生って誰だ?って思ったら、Martin Odersky教授のことか、、。
今時の言語は、開発のスピードが早さも重要だが、
Scalaの本体とか周辺ライブラリの開発者のコミュニティーってどれくらいの規模なんだろう。
まさか、ScalaってOdersky先生一人で開発している???わけないか。
EUから潤沢な資金を得ているし、フルタイムで学生や優秀な人を雇って開発してるし、会社も作ったし すでにBertrand Mayer(Eiffel開発者)を追い越した感がある(俺調べ)
その優秀な人材を処理系の品質向上に避けないものか。 せめて、型エラーで落ちない程度でも。
周辺ライブラリは、Javaのものですごく完成度高いものがあると、一から作り直そうとしないから、なんかまぁ・・・
twitterがgithubで公開してるものはいっぱいあるけど
https://github.com/twitter 細かいものが多数あるから、コードリーディングにはいいかもしれない
あまり変態的なことしてないし
>251 たくさんありすぎて、よく分からんから、何か紹介してくれ。
>>249 学生とかいるの?
odersky先生の大学の生徒とか?
ライブラリじゃないけど、 Scalalab に期待。
http://code.google.com/p/scalalab/ Scalalabは、名前のとおり、Matlabを意識しているが、
Scalaの文法で、行列とか信号処理とかグラフ表示とかが出来るもの。
今流行りの 集合知プログラミングとか認識とかのアルゴリズムの確認に
良いかも。
ちょっと試した感じは、結構気合を入れて作られている様子。
かなり頻繁にアップデートされているみたいなので期待大。
Scalaにはnamed letみたいなのはないの?
誰かエロい人、教えてください。 scalaの型推論のうち単純なもの 例えば val str="aaa" みたいなのは、あまり意味を感じない。 例えば、java ならeclipseを使っていれば、ctrl 1 で勝手に型推論される。 逆に val tmp=list.get(1); みたいなってしまうと、可読性が落ちる気がするんだけど、 そこら辺って、どういう風に考えられてるんですか? あと、varとvalを使い分ける意味は宣言的(ヒューマンエラーを防ぐ) 意味しかないのかな? 例えば、valを使うと高速化ができるとか valを使った時にだけ、使える機能があるとか。 わかる人いたら教えてください。
IDE使って補完できても、 HogeFugaPiyo obj = new HogeFugaPiyo() って書いてたら、"コードを読むときに"冗長・・・と感じるようになる。 人間が一度に視界に入れることの可能な情報量って限界があるだろうから。 まぁscalaに慣れれば。 その"慣れる"までの期間に個人差はあるだろうが
list.get(1)を一時変数に入れるって時点でダサイ 可読性を落としている原因はlistという変数名だと考えるね
Scalaはクラスもメソッドも変数も1文字が 規約だったような?
>>259 確かにそうだね。
>>260 >可読性を落としている原因はlistという変数名だと考えるね
変数名に型名入れるくらいなら、型宣言した方がよくないか?
変数名にはその変数が必要とされている意味を名前にしている。 単数/複数に気を付けるくらいだなー case class Person(name: String) val customers = List(Person("Tanaka"), Person("Yamada")) val firstUser = customers(0)
まあ可読性高いと思うやり方でいいんじゃないかな scalaには選べる自由があるよ
>>264 そうだとすると、varをデフォルトにして、valの時だけ
finalってつける方が良い気がしちゃう。
var使うとコンパイルエラーにしてくれるコンパイラプラグインあるよ( ̄▽ ̄)
世間ではできるだけval使ってvarは最期まで使うなよみたいに言われてるけど 俺的にvalとvarはタイプ数おんなじでどっちが書きやすいということもなくなんていうか対等な感じがしていいわ scalaっていう言語の性格が出てると思う
>267 あんた、scala向いてないわ。
新しい概念とそれを実現する方法の説明が分離していないのが学習の枷になる。 一つ覚えた事を、次に覚える事の足がかりに出来ない。 結局の所、学習者は学習する前にまず学習の仕方を(自力で)修得しなければならない。 以前から類似の物を使っていれば簡単だろうが、初学者には厳しい学習曲線にならざるを得ない。 まあ草の根で開発されたようなソフトウェアにはよくあることだが。
はやく2.9でないかなぁ
>>242 eclipseプラグインも一緒に出すって言ってるけど、そっちはベータ版だからな
2.9は、下位互換性は保たれるのかねえ。バージョンアップが激しすぎるのもどうかと思うけど・・・。
Scala 2.9が、Scala 9になりますだったら、それ以降安定しそう。
2.7.7から2.8.0のときよりは、互換性たもたれそう
私の股間のオブジェクトはあらゆる問題に対してスケーラビリティ なんだけど、Scala勉強しようかな。 「Scalaで学ぶ関数脳入門」おもしろいです。いま、5章め読書中。
Scala 2.9は、追加だけじゃなくて変更も有るのか?
>>277 2.7→2.9 のときも、変更によって、動かないコードが出てきたりしたからなあ。
だけど、
>>275 の言うように、2.8→2.9はあまり変更はないのじゃないかと予想。
>276
あの本はお勧めだよね。
279 :
デフォルトの名無しさん :2011/02/27(日) 23:31:32.07
↓みたいなコードを書くと、コンパイラに「末尾再帰になってない」と怒られるんだけど、 try〜catch使ってると末尾再帰にできなかったりする? @tailrec def func(): Int = { try { func() } catch { case e: Exception => ...; func() } finally { ...(何か後始末) } }
末尾再帰ってのは再帰呼び出し後に戻ってこないことが保証できるものだ その例は戻ってこないように見えるのか?
>>280 確かに、finallyを処理しに戻ってくるように見えますね。。なるほど。
過疎ってんな もうダメか
ボクの頭髪も過疎りそうです。
ハゲ散らかした頭って漢らしいとおもいます。応援します。 ところで、scalaでgtk+をいじりたいのですが、scalaでGUIを解説している サイト知りませんか?
>>284 まぁ日本語ではないだろうから、英語のサイトか、javaでGUI解説したサイト探したほうがいいと思われ
なんか答えになってないけど
侵略の手がこんなところまでw
289 :
デフォルトの名無しさん :2011/03/06(日) 03:34:18.47
Javaの配列をJavaのListに変換するために、 val list: java.util.List[String] = Arrays.asList[String](Array("hello", "scala")) とかやろうとすると、asListのところで「引数の型がArray[String]だ」って怒られるんですけど、 どうすればいいんでしょう。
あ、自己解決しました。 val list: java.util.List[String] = Arrays.asList[String](Array("hello", "scala"): _*) とやれば、可変長引数の一番目の引数ではなく、配列としてみてくれるんですね。
ScalaでOSとか作ろうと思ったらできるものなん?VM上のものだから難しい?
JavaのOSがあるくらいだからいけるんじゃね?
いみわからんのだけどそれってOSの上にOSのってるの?
ちょっとだけアセンブラのカーネルがあって、VM起動してその上にOSを走らせるみたい
ちょっとまて、メモリー保護や管理、IO割り込みやバス転送どうしてるんだよ! 全部アセンブラか?
Java VM じゃカーネル空間で動作できないから現実的ではないかな。 エミュレータのようなものになりそう。
オライリの本、java知らなくても読める?
Javaだったらのたとえ話おおいけど、Java知らないくても読める それよりJVMの上に作ってるんだからJavaの話でるのは当然で、 そこに無駄にストレス感じてるルビリストやらパールモンジャーとかピチパーが多い印象
>>297 もし、知らなければ読めないって言ったら、先にJavaを勉強するつもりなのか?
それともscala自体を諦めるのか?
なんにせよ、scalaやっていく上である程度のJavaというかJVMの知識は必要だが、
何も知らないとしてもわざわざ先にJava勉強しても遠回りだし、scala勉強したいならとにかくO'Reilly本買って勉強すればいいんじゃないか?
ツンデレか
>>302 ちょっと読んだけど、ほんとに何も知らない人向けの、単なる紹介記事なので、
わざわざ買って読むものではないと思う。
>>298-299 レスどうもです。
今はちょっと興味がある程度なので、javaの知識が大前提であればjavaをやる気になるまで様子見のつもりでした。
本職がハードなので、用途としては回路シミュレーションのデバッグデータ生成ぐらいです。
だから、scalaのメリットを生かしきる!みたいな使い方はできなさそうですが、
なんとなく面白そうなのでscalaをつかってみたいなぐらいの意気込みでした。
とりあえず読んでみる事にします。
アドバイス、ありがとうございました。
305 :
デフォルトの名無しさん :2011/03/09(水) 21:19:12.39
いやJavaを覚えた方が良いって。
Scalaはミーハーうけも良い
パーフェクトjavaなり、まとまった本を眺めてみると良いかも
308 :
デフォルトの名無しさん :2011/03/10(木) 00:15:13.41
>>297 と
>>304 が同一人物だとしたら、、、
ちょっと使ってみたいな、というために、Scalaを知りたいのだったら、
いきなり、オライリの本 みたいな気合い入ったのを買う必要ないと思う。
おすすめは、「Scalaで学ぶ関数脳入門」。
Java知らなくても読めるし、この本で得た知識は、どんな言語にも応用できる。
日本でこんな良い本が出ているのに、日本人が書いたってだけで無視しているとしたら
もったいない。
これ読んでから、次の本買ってみれば?
ちなみに、、ScalaとかJavaは、ハード屋にはうけが悪いと思う。
素直に、C か sh か perl で書かないと拒否られると思う。
本当は、オレも、VerilogやSystemCと、Scala/Java(JVM)を連携させたいのだが、、。
Java使ってる人間の10%でもScala使うようになれば、 それだけで相当ポピュラーな言語になるんだけどなぁ
このスレもすっかり、関数脳派に乗っ取られたな。 コップ派の栄光は短かった。
>>309 仮に 0.1% だとしても実現不可能な数字に見える
>>310 関数型に慣れてない人が多かっただけでしょ
関数になれたらコップを読みたくなるんじゃないか
関数脳 > コップ FP入門度
314 :
デフォルトの名無しさん :2011/03/10(木) 19:57:22.46
「Scalaで学ぶ関数脳入門」 は、たしかに面白い視点から書かれてて、いいんけど scalaを深く学ぶということに関しては、versionが2.7と2.8がぐちゃぐちゃに分かりづらくまざってるし、 ところどころ間違いあるし、注意したほうがいいと思う 共著だから、章によって書いてる人違って、 章によって、完成度がバラバラ・・・いい章もあるけど、 なんかひどい章もある・・・コード例がすげぇscalaっぽくないやつが・・・
>>310 > このスレもすっかり、関数脳派に乗っ取られたな。
このスレで、関数脳本を推薦しているのは、ほとんどが同一人物だよ。
なぜならば、ほとんどはオレが書いたから。(笑)
:
:
:
2chに書かれる事って、大多数の人間の意見とは限らない。
どっちかというと、同じ人が大量にカキコしているケースの方が多いかもな。
>>314 と、これまで、関数脳本を薦めてきたオレだが、
確かに、Scalaの記述については注意した方が良いかも。
この本は、関数型言語の最初の一歩としてはおすすめだが、
Scalaについては、これ一冊で習得は難しい。
かなり説明が省かれている所もあって、そういうところは、概略だけ見て、
詳細は別の本を開いた方がよさそうだ。
Caseクラスの説明とか、、この本だけでは、さっぱりわからん。
あれ表紙が気に入らないからスルーだわ。
言語仕様として、varを省略可能にすることってできなかったんだろうか? あとvalってjavaのfinalと同じ機能? scalaだと、プラスアルファのメリットがあったりする?
varを省略可能にしてどんなメリットがあるんだ…… valはjavaのfinalと一緒で再代入が不可。それとlazy valで遅延評価ができるよ。
319 :
デフォルトの名無しさん :2011/03/11(金) 19:46:10.60
scalaの需要って増えると思う?
>>319 良くも悪くも、JVM上の言語って点が問題かと。
確かに既存のLibraryを使えるって点は大きなメリットなのだが、
JVMってだけで毛嫌いする人は多いだろうね。
.netコードも一応吐き出せるのだから、
ちょっとがんばればNativeコードも出力できそうに思うが。
まあ、現時点では、開発陣には、言語自体を進化させるのに注力していると
思われるので、そっちの発展に期待。
>>316 表紙が普通だったら、もっと売れていただろうね。
日本の出版社って、なぜ、表紙絵とかタイトル名のセンスがないのだろうか?
あれって、出版社の意向で決まるんだよね。著者にはいい迷惑。
321 :
デフォルトの名無しさん :2011/03/11(金) 23:50:18.45
covariant nonvariant contravariant とかって何て発音しますか?
val, varはJavaScriptといっしょで型指定なしの変数宣言の意味でもあるから なしとかコンパイルできんだろ
>>321 こばりあんと
のんばりあんと
こんとらばりあんと じゃないの
いやいや コヴァリェィント ノンヴァリェィント コントルゥァヴヮルゥィウェイント だろ
若本っぽい
>>322 なんか勘違いしてない?型指定なしって…?
>>322 「言語仕様」の話をしてるんだから、コンパイルできるできないは関係ない。
そういう「言語仕様」がナンセンスだと言うならそのとおり。
関数型も目指してるから要るんでしょ。マルチパラダイスだっけ?
valはHaskellのトップレベル宣言のように省略可能にして欲しかったとは思う。 ただ、構文解析が面倒になるのと、varとの対称性が崩れるデメリットのに見合うかというと微妙。
頻度が高く、使い手が楽できるなら省略も許容できる ただScalaは、varとvalどちらかをよく使う言語ではないし、 どちらかをより使わせたい言語でもないのだろう
Java との整合性を前提にすると、ネストのときの挙動が微妙だよな。 a = 1 { // 「宣言&初期化」か「代入」どっち? a = 3 }
代入は := を使うことになるんじゃないかな
インクリメントはこうなんの? i +:= 1
代入以外は現状のままでOK
まぁそんなこと議論してもどうせ今さら変わらないわけだし。 こういう話が意味がないとは言わないが。
まあお遊びですな。 ところで >331 省略するのがvalの場合、初期化しかないんじゃない?
structural subtypingってどうゆう時に使うものなんですか?
アヒルのように歩き、アヒルのように鳴くとき
340 :
デフォルトの名無しさん :2011/03/15(火) 21:10:32.97
JVMレベルでは、型チェックとか無いの?
ない
ClassCastExceptionとかだすからあるんじゃね。
Google [Java erasure]検索
ErasureはGenericsの話。 そんなこともわかってないのか。
そもそも342の質問が大雑把すぎて何がききたいのかわからない
342のは、コンパイラは厳しいけど、一度コンパイラのチェックを通ったら、 あとは野放しなのかって質問。
実行時型情報って言えカス
戻り値を返さない関数を記述するとき def action { println("hello") } def action: Unit = { println("hello") } どちらの書き方をScalaでは推奨しているんですか?
素早いコーディングを重視するなら前者、後から見た時の分かりやすさを重視するなら後者。
そういうの見てふと疑問に思うんだけど、例えば def action { foo.bar("hello") } こんなコードみたときに、果たしてこれは戻り値があるのだろうか・・・? と常にストレス感じるハメになるけど、素早いコーディングを重視する人たちは その辺どう考えてんの?
>353 戻り値の有無では悩まないだろう。暗黙的にUnit型になるんだから。 悩むとしたら=の書き忘れの可能性じゃないか。
それは言われるまでもなくて、可読性の話 わざわざ fooクラス の barメソッドを見に行かないと、戻り値の有無を確認できないじゃん コードの挙動以前に、戻り値の有無すらわからない
大抵は書かなくても問題ないよね 自明なことが多いし、コレクションなら下手に書くより推論させたほうが適切な型を吐くし IDE支援があればますますそうなんだけど、Java上がりの連中は絶対書けってやつが多そうだな
>>356 自分にとって自明でも、他人や「明日の自分」にとっては自明ではなかったりするからねぇ。
355以降話がおかしいぞ。353は誰にでも自明でしょ、354の言うとおり。 def action: Unit = { def action { ならはっきり言って下のほうが、 Unit を読まなくて良い分可読性が高いとさえ感じる def action: String = { foo.bar("hello") } def action = { foo.bar("hello") } なら当然上のほうが高いけどね
Haskellなんかも必ず型書くけど、意味あんのかなと思ってしまう みんな推論させてからコピペするわけでしょ
いやいや358全然わかってねーよ 型推論の話をしてるわけでもないし、記述する文字数の話をしてるわけでもない foo.barメソッドを見に行かないと戻り値がわからないから、actionメソッドの戻り値の有無もわからない ましてやそのメソッドに複数のif文が合ったら尚更戻り値が意味不明になる
>>359 ・一見で何を出力する関数なのか分かりやすい。
・コピペで意味が変わる場合がある。
358は十分わかっていると思うが、他の人は元の質問の意図を汲んで話しているだけだと思う
戻り値かかないと100%必ずUnitってことか
{の前の=を省略するとその関数の返り値は強制的にUnitになるのよ scala > def two() { 2 } two: ()Unit scala > def two() = { 2 } two: ()Int
スレ伸びてるからすわ何事かとおもったら 初心者いじって遊んでるだけだったってオチ
水が無くてすっからかん
米原子力委員長「4号機プールに水ないと思う」
【ワシントン=山田哲朗】米原子力規制委員会(NRC)のグレゴリー・ヤツコ委員長は16日、
米下院エネルギー・商業委員会で証言し、福島第一原発4号機について
「使用済み燃料プールの水はすべて沸騰し、なくなっていると思う」との見解を明らかにした。
使用済み燃料棒が露出した結果、「放射線レベルは極めて高く、復旧作業に影響する可能性がある」
とも指摘した。具体的な人体への影響については、「かなり短い時間で致命的になるレベルだ」と述べた。
ヤツコ委員長の発言は、東京に派遣した米国の専門家チームからの情報を基にしているとみられる。
米当局が、日本政府や東京電力よりも、原子炉の状況について悲観的な見方をしていることを示した。
(2011年3月17日10時04分 読売新聞)
http://www.yomiuri.co.jp/science/news/20110317-OYT1T00277.htm
実際のメソッド名はbarじゃなくて名詞なり動詞なりが来るから なにが戻り値かだいたい解るっしょ さらにコンパイラも確かめてくれるし
2.7系の処理系で、 val p = getClass.getTypeParameters def func(vars: Array[TypeVariables[Class[_]]]) = ... func(p) ってやるとtype mismatchって怒られるんだけど、これは処理系のバグ? それとも、私がヘマやってるだけ?
なるほどね たしかにメソッド名は同士を使うな
日本が被災しているのに2.9 出すなんて不謹慎にも程がある
Oderskyとスイスは日本に対する配慮が足りないかもしれないな ちょっとScalaの公開を自粛するように抗議してくるわ
あほかw
>>368 バグではないな
def func(vars: Array[TypeVariables[Class[_]]])
を
def func[A](vars: Array[TypeVariables[Class[A]]])
にしたらコンパイル通るんじゃね?
376 :
368 :2011/03/18(金) 18:00:44.44
>>375 自己解決しました。なぜか、
def func(vars: Array[TypeVariables[Class[T]]] forSome { type T })
にしたらコンパイルを通りました。
コップ本には、Hoge[_] は Hoge[T] forSome { type T } と同じだと書いてあるのになぁ。。
>>376 言語仕様を読んでないから推測だけど、_は
それを含む一番外側の[]の型変数とみなされているんじゃない?
>>377 ふむふむ。
参考までに、REPL(というかSimply Scalaサイト)に投げてみた結果を張ってみます。
> import java.lang.reflect.TypeVariable
> val cls = classOf[Array[String]]
cls: java.lang.Class[Array[String]] = class [Ljava.lang.String;
> def func(cls: Class[_]) = cls.getTypeParameters
func: (cls: Class[_])Array[java.lang.reflect.TypeVariable[java.lang.Class[_$1]]] forSome { type _$1 }
> def func2(vars: Array[TypeVariable[Class[_]]]) = null
func2: (vars: Array[java.lang.reflect.TypeVariable[Class[_]]])Null
> def func3(vars: Array[TypeVariable[Class[T]]] forSome { type T }) = null
func3: (vars: Array[java.lang.reflect.TypeVariable[Class[T]]] forSome { type T })Null
んで結果。 言語仕様も少しあたってみます。 > func2(cls.getTypeParameters) error: type mismatch; found : Array[java.lang.reflect.TypeVariable[java.lang.Class[Array[String]]]] required: Array[java.lang.reflect.TypeVariable[Class[_]]] func2(cls.getTypeParameters) > func2(func(cls)) error: type mismatch; found : Array[java.lang.reflect.TypeVariable[java.lang.Class[_$1(in value res3)]]] where type _$1(in value res3) required: Array[java.lang.reflect.TypeVariable[Class[_]]] func2(func(cls)) > func3(cls.getTypeParameters) res0: Null = null > func3(func(cls)) res1: Null = null
> それを含む一番外側の[]の型変数とみなされているんじゃない? ごめん、一番内側の間違い。 つまり A[_] = A[T] forSome {type T} ということは A[B[_]] = A[B[T] forSome {type T}] となる。 つまり仮引数の型がA[B[_]]である関数に渡す実引数は 存在型A[B[T] forSome {type T}]でなければならないので >368は型エラーになる。 言語仕様の3.2参照。
>>380 確かに、こういう例が載ってますね。
ワイルドカードが直接くっついてる型として展開するわけか。
Example 3.2.7
The type List[List[_]] is equivalent to the existential type List[List[t] forSome { type t } ]
List[List[_]]は、『List[List[t]] forSome { type t }という存在型』ではなく、
『「List[t] forSome { type t }」という存在型を型パラメータとするList型』になるから、
そういう意図ならforSomeで明示的に宣言を書かないとダメということですね。
382 :
381 :2011/03/18(金) 23:49:12.41
正直、JVM言語ではあるけどJavaとの混ぜ書きは色々と罠があるなぁ、と感じていたり。 Java資産のScala版を作っていくのはやっぱ重要だと思いましたとさ。
頑張って作ってくれ
言語仕様書の日本語訳ないの?
386 :
384 :2011/03/19(土) 14:34:31.72
お、あるのか、ありがとう
>>385 日本語で読んでも何が書いてあるのかさっぱりだお。。
まだドラフト未満だから仕方ない。 例から推測したり、実装の振る舞いから補完しながらでないと 正確な仕様はわからないと思う。 いっそformal semanticsでも定義すればいいのに。
389 :
デフォルトの名無しさん :2011/03/22(火) 20:36:52.46
>>318 >それとlazy valで遅延評価ができるよ。
レス、サンクスです。
遅延評価の価値がいまいちわからないんだけど、
誰かエロい人、教えてくれないか。
俺の理解:
・lazyは単なる実行時の効率化に過ぎない
・副作用が無ければ、全部lazy valでOK。(Haskellがそう?)
・副作用を許容しているので、lazyを付けたり付けなかったり
scalaのjavaに対するわかりやすいアドバンテージがわからない。 コンストラクタ省略可能とか、そういう細かい点はわかる。 あと、yield forが便利だとは思う。 でも、なんかもっと魅力が欲しい。
>>390 魅力感じないなら、ずっとJava使ってればいいんじゃないの?
いやほら流行りモノには乗っかりたいじゃないか
"省略可能とか、そういう細かい点" っていうのがなにをさしてるのかって話だよな。 「◯◯ができます」っていう大きな特徴(を数点)教えてくれというか、 そういう回答を期待してるのかもしれないけど、 すごく細かいけれど、いいところが大量にあるから便利って捉え方もできるし。 おまえ本当に、scalaの細かい便利な点全部知ってるの? お前がいう細かい点ってなに? っていう
Javaに比べて利点はたくさんあると思うけど そのなかで特にいいの1個あげてよってScalaプログラマに聞いたらかなりバラバラになりそうな気がする
まず、関数型言語だってことでしょ そこに価値を見出せない人にはBetter Javaにしか見えないと思う
Better Java で十分じゃん。 あと Lift
>>391 単なる技術論
言語仕様としてScalaは本当に進歩してるのか?ってこと、
進歩してるとしたら、それはどこか?ってことに興味がある。
実務的な話になれば、仕事の本流はこの先もずっとJavaだろうし。
どうでもいいところならScalaを使うことはできる。趣味レベルで。
>>395 >そこに価値を見出せない人には
その価値を他人に説明できないなら、盲信に過ぎないのでは?
関数型言語だってのを除いてオブジェクト指向のところだけを見てもtraitとかあるしBetter Javaにとどまらないんじゃね?
ScalaやるとJavaでノタノタとforループやifで無駄な行数稼いでる奴 見るとヘドがでそうになるデメリットしかないよ
いいからお前らscalaで色々作って、githubとかにどんどん上げろ
はーい
>>397 関数型言語の何がいいかはMLスレで訊いてくるといいよ
間違ってHaskellスレで訊かないようにね!
>>399 forとifのためにscala使ってるなら、
scala辞めた方がいいと思う。
君にはまだ早い。
>>403 どこをどう読んだらそんな解釈ができるんだ?
>>404 それ以外にどんな解釈があるんだよwww
なんちゃってscala厨にはrubyがお似合い。
どうも、なんちゃってscala厨にされちゃったみたいですが、
ちょっと、scala.io.BytePickle についてお知恵を拝借したいのです。
http://research.microsoft.com/en-us/um/people/akenn/fun/picklercombinators.pdf ↑に記述の有る maybePickler をOption[T]でやりたくてホゲってるんですが、
Haskellまだよくわかってないから果たしてこれで合ってるのやら...
/* maybe pickler
*
http://research.microsoft.com/en-us/um/people/akenn/fun/picklercombinators.pdf * pMaybe :: PU a -> PU (Maybe a)
* pMaybe pa = alt tag [lift Nothing, wrap (Just, fromJust) pa]
* where tag Nothing = 0; tag (Just x) = 1
*/
implicit def optPickler[T: SPU]: SPU[Option[T]] =
data(
(t: Option[T]) => t match {
case None => 0
case Some(_) => 1
},
List(() => nonePickler[T], () => somePickler[T])
)
def nonePickler[T]: SPU[Option[T]] = lift(None)
def somePickler[T: SPU]: SPU[Option[T]] =
wrap[T, Option[T]]((x: T) => Option(x), x => x.get, implicitly[SPU[T]])
関数プログラミングするなら、やはりHaskellの方がいいな。 ただ、型適用を明示的にかけるのはscalaの強みか?
PDFを見るのが面倒過ぎるから三行で説明してくれたら 考えなくもない。
みんなscalaで何作るの?
コンパイラプラグインってなに?
>>409 Scalaコンパイラが独自で使っているscala.tools.nsc.io.Picklerを参照してみてはいかが?
implicit def optionPickler[T: Pickler]: Pickler[Option[T]] = nonePickler | somePickler[T]
implicit val nonePickler = singletonPickler(None)
* '|'演算子はCondPicklerにて定義されていて実体はeitherPickler。
* CondPicklerはPicklerをextendsした抽象クラス。
* seqが'~'演算子で記述できる。
など、DSLがBNFのように見やすくなる工夫がなされているみたい。
TNX 演算子採用したい あとStatePicklerいいですね BytePicklerではエラー状態を封じ込めてないからリカバーできない
>>410 ちょっとした、GUIアプリとか。
で、そのアプリを配布するとき、どうしようかと迷っている。
JVMは、割と普通のPCには入っているだろうから無問題だけど、
ScalaのライブラリのJarも一緒に配布するのは、サイズがでかくなるなあ。。
>>414 ちょっとしたGUIアプリならC#がいいと思う。
ScalaでGUIはないわ。
Scala使う場面って、Lift使ってアプリ作るくらいしか思い浮かばない。
しかも、Liftは実績がないから、仕事で使うのは難しいな。
今のところScalaはちょこっといじるくらいしか、意味がないんじゃないか?
現段階で、実用的なアプリをScalaで作ろうと思う人はある意味すごいよ。
マジで!?俺すげぇ!!
【速報】俺たちすごかった
Twitterは英雄だな。
Lift実績ないってFoursquare知らんのか
implicit conversionって、クラスファイルではどう表現されてるの? 諸般の事情で、Javaで書いたコードにimplicitのマークを付けられないかと思ってるんだけど。
>>423 コンパイル時にすべて解決されてる。
>Javaで書いたコードにimplicitのマーク
というのがなにをやりたいのかが、いまいちわからないが・・・?
仕組みというか、コンパイル後にどうなってるかしりたいなら、
scalacでコンパイルしてjadとかで、デコンパイルすることおすすめ
'|'演算子って論理和?
>>424 scalacは、クラスファイルになってる変数なりメソッドがimplicitで宣言されてることを
どうやって知るのかな、と思って。
つまり、
public static Hoge hoge = ...
となっているJavaコードを、Scalaで言うところの
implicit val hoge: Hoge = ...
に見せかけたいわけです。
それScalaのスレで質問する内容じゃないよな? Java厨なんですけどScalaの機能をJavaで実現したいんです!なんて 頭の悪い質問してると人生無駄にするよ
javaのほうが以下のようになってるとして public JavaClass{ public static Hoge foo(){ ... } } 使う側のscalaのコードのどこかで、以下のように一行加えればいいんじゃないの? ScalaClass{ implicit val bar = JavaClass.foo() }
>>427 REPLの補完でREST APIのJavaラッパを叩いて快適生活を送ろうとしたところ、
どうもobjectに入ってるメンバやimplicit conversionを補完してくれないみたいなので(バグ?)、
仕方なくJavaでstaticメソッドを実装して補完候補に出すという大変頭の悪いことをしているわけです。
既に、APIをリフレクションで走査してScalaラッパを自動生成するところまでやっているので、
ここでダメだとけっこうきつい。。W
>>428 なるほど、とりあえずそれで乗り切ります。
431 :
デフォルトの名無しさん :2011/03/26(土) 01:41:54.42
432 :
デフォルトの名無しさん :2011/03/26(土) 01:51:25.89
自分に都合悪いとたいして調べずにバグとか言いだすやつなんなんだろうな
>>431 再三の注意にもかかわらず2.9出すとは日本への宣戦布告ということか
434 :
デフォルトの名無しさん :2011/03/26(土) 02:39:54.46
スイスって永世中立国じゃなかったのか・・・?
>>432 確かに追試してないなぁと思って、新規のsbt環境でやってみたら正常に動作した。。
色々設定いじってるのがいけないのかな。よく分からん。
ちなみに、sbt 0.7.4でscala 2.9.1.RC1を指定した上でconsoleを動かすとフリーズする。
こちらはWindows環境とMac環境の両方で試したので確か。
既にscala 2.9.1.RC1が出ていたとは
Akka 1.1でpersistence亡くなったんだけど これから先、NoSQL使えないAkkaに意味あるのか?
あまりにくだらなさ過ぎて脱力した・・・
RC1って実質β位かな。 狼少年っぽいし。
狼少年は肉食系男子だからがんがんいこうじぇ
共変宣言されているクラスに、共変を満たすように下界限界を設定した関数リ テラルを後から注入するにはどのように記述すれば良いのでしょう? HogeImp3がやりたいことなのですが、クラスの下界限界設定とメソッドのそれ とがうまく協調してくれないんです。 // covariant trait with func trait Hoge[+T] { def twice[U >: T](x: U): List[U] } // OK class HogeImp[+T] extends Hoge[T] { def f[U >: T](x: U): List[U] = List(x, x) def twice[U >: T](x: U): List[U] = f(x) } case class HogeImp3[T, U >: T](f: U => List[U]) extends Hoge[T] { def twice(x: U): List[U] = f(x) /* ここでコンパイルエラー * type mismatch; * found : U(in method twice) * required: U(in class HogeImp3) * def twice[U >: T](x: U): List[U] = f(x) * ^ */ } val x3 = new HogeImp3[Int, AnyVal]((x: AnyVal) => List[AnyVal](x, x)) 関数リテラルは諦めてトレイトにするべきなのでしょうか?
445 :
444 :2011/03/29(火) 18:22:31.46
すいません。上のコンパイルエラーの箇所に誤りがありました。 上記のHogeImp3だとtwiceに下界限界が無いのでoverrideしてないので abstract必要ですというエラーになります。 def twice(x: U): List[U] = f(x) /* error: class HogeImp3 needs to be abstract, since method twice in * trait Hoge of type [U >: T](x: U)List[U] is not defined */ それならtwiceに下界限界を指定したらどうなるか、クラスの下界限界設定と メソッドのそれとがうまく協調してくれないのでやっぱりエラーになります。 def twice[U >: T](x: U): List[U] = f(x) /* error: type mismatch; * found : U(in method twice) * required: U(in class HogeImp3) * def twice[U >: T](x: U): List[U] = f(x) * ^ */
どうなんだろ、関数オブジェクトは型パラメータを取る関数とか記述出来ないから ジェネリックメソッドの代わりは無理なんじゃないかな、という気はする。 本当に出来ないかはしらね
447 :
444 :2011/03/30(水) 10:05:25.87
やっぱりTraitにしてミックスインするしかなさそうですね。 // covariant trait with func trait Hoge[+T] { def twice[U >: T](x: U): List[U] } // OK trait HogeInject[+T] { def f[U >: T](x: U): List[U] = List(x, x) } class HogeImp2[+T] extends HogeInject[T] with Hoge[T] { def twice[U >: T](x: U): List[U] = f[U](x) } assert((new HogeImp2[Int]).twice(2.asInstanceOf[AnyVal]) == List[AnyVal](2, 2))
もしくは総称型関数を包むクラスを定義するとか。 abstract class F[+T] { def f[U >: T](x:U) : List[U] } case class HogeImp3[+T](F:F[T]) extends Hoge[T] { def twice[U >: T](x: U): List[U] = F.f(x) } val x3 = new HogeImp3[Int](new F[Int] { def f[U >: Int](x:U) = List(x,x) })
449 :
444 :2011/03/30(水) 11:55:55.88
>>448 ありがとうございます、提案頂いたやり方のが描いてたイメージに近いです。
採用の方向で検討させて頂きます。m(_ _)m
えっ、ダメなの?期待してたのに
まだ作り途中じゃないの?eclipse
454 :
444 :2011/03/31(木) 13:32:24.87
共変宣言されているクラスに、共変を満たすように型パラメータ境界を設定した 関数リテラルを後から注入する方法について判明しましたので御報告。 trait Covariant[+T <: U, U] { def twice[V >: T <: U](x: V): List[U] } case class CovariantImp[+T <: U, U](f: U => List[U]) extends Covariant[T, U] { def twice[V >: T <: U](x: V): List[U] = f(x) } val x = new CovariantImp[Int, AnyVal]((x: AnyVal) => List[AnyVal](x, x)) assert(x.twice(2) == List[AnyVal](2, 2)) それにしても境界パラメータ宣言の『>: T <:』の部分が 「こうですか!?わかりません><」って言ってるように見えて困る...
>454 おおすごい。 でも、それってもとの問題 > 共変宣言されているクラスに、共変を満たすように下界限界を設定した関数リ > テラルを後から注入するにはどのように記述すれば良いのでしょう? の解とはちょっと違わない? それだと下界だけでなく上界も設定しないといけない。
456 :
444 :2011/03/31(木) 21:45:35.64
ごめんなさい、使い勝手を考えると上界が欲しいかなと思ってよくばりすぎました。 下界だけだとこうですね。 case class CovariantImp[+T <: U, U](f: U => List[U]) { def twice(x: U): List[U] = f(x) } val x = new CovariantImp[Int, AnyVal]((x: AnyVal) => List[AnyVal](x, x)) assert(x.twice(2) == List[AnyVal](2, 2))
457 :
444 :2011/03/31(木) 22:17:34.86
ちょっとCovariant/Contravariantを汎化して書き取り練習してた 下界と上界、共変と反変の型パラメータについて推奨の書き方(順序/変数名)ってあるんでしょうか? みなさんどうやって書かれてます? case class V[+T <: I, -U >: O, I, O](fl: I => O) { def f = fl(_) } new V[Int, Int, Int, Int](x => x.hashCode) new V[Int, Int, AnyVal, Int](x => x.hashCode) new V[Int, Int, Any, Int](x => x.hashCode) new V[Int, AnyVal, Int, Int](x => x.hashCode) new V[Int, AnyVal, Int, AnyVal](x => x.hashCode) new V[Int, AnyVal, AnyVal, Int](x => x.hashCode) new V[Int, AnyVal, AnyVal, AnyVal](x => x.hashCode) new V[Int, AnyVal, Any, Int](x => x.hashCode) new V[Int, AnyVal, Any, AnyVal](x => x.hashCode) new V[Int, Any, Int, Int](x => x.hashCode) new V[Int, Any, Int, AnyVal](x => x.hashCode) new V[Int, Any, Int, Any](x => x.hashCode) new V[Int, Any, AnyVal, Int](x => x.hashCode) new V[Int, Any, AnyVal, AnyVal](x => x.hashCode) new V[Int, Any, AnyVal, Any](x => x.hashCode) new V[Int, Any, Any, Int](x => x.hashCode) new V[Int, Any, Any, AnyVal](x => x.hashCode) new V[Int, Any, Any, Any](x => x.hashCode) new V[AnyVal, AnyVal, AnyVal, Int](x => x.hashCode) : 上界設定がAnyValなのに、入力にAnyをとることができるのは やっぱりわかったようなわからないような不思議な感じがする... new V[AnyVal, Any, AnyVal, Any]((x: Any) => x.hashCode.asInstanceOf[Any])
STMが入るって聞いたけど、どうなってるの?
並列とSTMは同時にいれてくれないと困るじゃん
462 :
デフォルトの名無しさん :2011/04/06(水) 12:33:47.11
eclipseのscalaプラグインがゴミ過ぎて使えないんだけど、 みんな何使ってるの?
vi
>>463 ワロタwwww
さすがにviとemacsよりは、eclipseの方がましだわ。
宗教戦争のお時間がやってまいりました
vimかIntelliJ IDEA
ENSIME最強
だってScalaには標準でvim用のsyntaxファイルが添付されてるもん!
emacs用もあるがな
xyzzy 用もつくってくれ
http://www.infoq.com/jp/news/2011/04/erlang-copied-jvm-and-scala Erlang を共同で開発した Joe Armstrong と Robert Virding 両氏が,Erlang が Java から多大な着想を得たことを認めている。
ErlangFactory 2011 SF で行われたインタビューで両氏は,Erlang では「プロセス」と呼んでいるものを作る上で,
Scala の Actor が大きな影響を与えているという,以前からあった噂をついに
肯定したのだ。さらに Erlang の VM が,かの有名な Java 仮想マシン (Java Virtual
Machine,JVM) のクローン同然のものであることも告白した。
ErlangってJavaより古いんだ
翻訳で4/6に延期されるとか、新しいのか?
1986年に社内公開で、一般公開は1998だと? javaの一般公開が1995で、開発開始が1990 JVMの件は、直接関係ないんじゃないかな
ScalaがErlangの影響があるのは明らかだけど、JavaはErlangの影響あんの? なかったとしたらあまりいい趣味のネタとは思えないな
>>465 宗教戦争つーより、用途による。
本当に複雑なプログラムを書くなら、高機能なIDEに100万円出せる。
WEB系みたいに割とシンプルならemacsでいい。
言語の型有りか型無しかってのと同じ。
シンプルならperlでもOK。
でも割と難解なものをperlで書くと、指数的に作業がつらくなる。
perlをemacsで置き換えても、意味が変わらない。
478 :
デフォルトの名無しさん :2011/04/07(木) 19:42:56.98
コップ本に「トレイトのメンバを変更すると、そのトレイトを継承したクラスを 利用する側のコードをコンパイルしなおす必要がある」ってあるけど、これは何で? Javaのインタフェースでは、そんなことは起きなかったと思うけど。
プラグインがゴミっていうゆとり世代は、自分でプラグイン書けばいいじゃん。お前の能力が低いだけだろ
>>479 プラグイン書くくらいならJava使った方がいい。
プラグインがゴミなうちは、rubyと同程度の扱いで、
Java未満なのは仕方が無い。
JavaとRubyを同列で比べるあたりが無知まるだしだな
Java使ったほうがいいって思うなら黙ってJava使ってればいいよ
>>482 まともなディベロッパーはscala使ってないから安心しろ
みんな言われなくても仕事ではJava使ってる
×まともな ○低レベルな
マイナーな言語を使うことで低レベルなマを排除出来るとかどこかのブログで見た覚えがある けど実際にscala使ってるサービスってtwitter意外に何があるかしらない
確かにRubyは人が増えて低レベルなマも増えた
RubyやScalaでハード寄りのプログラムってかけるの?
っ『Android』
490 :
デフォルトの名無しさん :2011/04/08(金) 01:39:42.17
testSubClassをnewするとNullPointerExceptionが出てしまうのはなぜ・・ 抽象valが1個しかなかったり、lazyを消すと出ないのですが・・ abstract class testClass { val test:Int val test2:Int lazy val f:Int => Double = t => 1 } class testSubClass extends testClass{ val test:Int= 1 val test2:Int = 1 println(f(0)) //ここでNullPointerが出る }
Rubyオワコンだったか
仕事でscala使ってる俺勝ち組
HaskellとかML系の言語と比べても、implicitパラメータ使ったりすればかなり型に関する柔軟で高度な操作ができるのに、 Rubyがどうとかいってるようじゃ、まだまだレベルが低いな
RubyからJavaってScala関係ないじゃん、ここScalaスレ
>>490 とりあえず2.8.1のREPLで試したら再現しないけど。versionと環境は?
>>478 ScalaはJavaじゃないから当たり前
Javaは、NextStepのObj-Cもろにパクッただけよ Obj-Cの洗練された言語仕様は全く理解できず コボルのようなコーディングができることに心血を 注いだ結果 糞言語Javaが完成しましたー
>>499 Objective-Cみたいなうんこ言語にならなくて本当に良かったな
501 :
デフォルトの名無しさん :2011/04/08(金) 23:39:21.52
>>490 scalaのバージョンは2.8.1で、
NetBeans6.9.1+nb-scala-6.9v1.1.0で作業しています。
-Xcheckinit を付けていたのが原因のようで、
それを付けるとREPLでもエラーが出ました。
が、何故なんでしょう。。
JavaってObj-Cより後発なのか?Obj-Cは洗練された言語だという噂だったな NextStep使ってたことあるけど軽くて使いやすいいいOSだった
洗練、洗練か、、、うーん。
>>499 Objective-CはSmalltalkもろにパクッただけよ
Cと混ぜることに心血を注いだ糞言語
ちなみにNextStep知ってる人どれぐらいいるんだろ?
知識としてはみんな知ってんじゃないの 使ったことがあるやつはほとんどいないだろうけど
Rubyなんて使うのはperlくらいしか使ったことがないWeb系の人達だけだろうに。
Ruby()笑
>>506 ハードウェアの現物を見たことはあるよ!w
おれもおれも、研究室ではSunOSとNEWSのほうが人気だった
個人でNeXT(ピザでなくキューブのヤツな)を買った人もSunのサーバ(E450とかな)を買った人も NEWSを買った人もSGIを買った人もDEC Alphaを買った人も昔の職場にいたな
おじさんたちの話についていけない そしてscala関係ねぇ
やっぱscalaっておっさんばっかなの?
やっぱってなに?w
中高生プログラマにScalaを布教フラグか。
小田好先生曰く、 Avoid mutable state but don't demonize it.
なんでこのスレ、「Nothingさん」とか「Noneさん」じゃなくて「デフォルトの名無しさん」なの?
スレ単位で名無しが変わると思ってるの?
俺はBox派だから、
さんを付けるなデコスケ
Boxってなに?
箱男さん。
>>527 こんなwikiあるんだ
いいものを知った
まだちょっと触り始めただけだけど、synchronized みたいに自分定義の機能を ブロックの前に記述したりできる? def foo(x:Int) = transaction { ... } 言いたいこと分かるかな? こんな感じで書けたらアスペクト指向っぽいことができるかなと思ったんで。
def transaction[A](func: => A):A っていう関数定義して使うとかそういうこと?
また本が出るって噂聞いたんだけど本当?でるの?
そもそもscalaではsynchronizedも単なるメソッドなんだから、それのシグネチャみて真似すれば
>>532 yuroyoro氏と水島氏が書いてるとTwitterで言っていた気がするが、それらとは別のものだろうか
2.9いつでるんだよ、RC1がでてから1ヶ月以上経ってないか?
2.8は3ヶ月
scala news archiveだと2.9rc1が3/25付けの記事
>>531 ,533
ありがとう。脳からカウパー液出たわ。
英語でも良いけど Lift でいい本はないかな。
昨日からScalaの勉強始めたんだけど、 なんだかPerlと同じにおいがする... 後からソース見直した時分かりにくくない? まだScalaの流儀に慣れてないからだろうけど
>>540 > まだScalaの流儀に慣れてないからだろうけど
根本的に何も理解してないから。よりによってPerlとは…
PerlとPHPとJavaしか知らんのだろう だから一回Haskellやってから来いと
どうせScalaもHaskellもメジャーになれない言語で終わるから慣れようとする必要はない
どんな言語だって慣れなきゃわかりにくいだろ
理解すればいい
548 :
デフォルトの名無しさん :2011/04/22(金) 22:24:15.39
省略記法の多さ、言語拡張系、表現の自由度の高さが、レベルにばらつきがあり、 その差か解消できないチームとかだとカオスになりそうな感じはあるな。 でもそれでも手を出したくなる良いとこ取り言語なんだよな. …
マ板の話題はマ板でしてくれ
これがscalaの真の力 def main(ゲソ: Array[String]) { val イ = (1 + 1) の 計算 を しなイカ val カ = 3 を 倍 に しなイカ val 娘 = "スイカ" の 料理 を 作らなイカ println(イ) println(カ) println(娘) }
パーサの常識を軽く超えてるな
メジャーにならない=覚えなくていい ってちょっと違くね?scalaに限らずあまりメジャーじゃなくてもその言語でのいい条件の仕事が転がってるなら 覚えた方がいいじゃん。向上心のないやつは一生Javaで安い仕事やってればいいんじゃねぇの?
Scalaの高い仕事紹介してくれよ
給料とか関係なく、JavaかPHPしかできません、他の言語覚える気ありませんっていう人より Scalaとかある程度できますって人と一緒に仕事したいよな
海外だとScalaはどうなんだろうね?
開発者がrubyにはしるくらい普及してない
要は使いようやねん
CeylonあるからScala不要になっちゃったね
まだコンパイラもできてないんじゃないか…
Ceylonの仕様は神過ぎる
>>563 詳しく知らないんだが、ceylonの仕様の神具合を書いてみてくれ
次から次へとJavaの派生が出ておっさんついて行かれへんわ
567 :
デフォルトの名無しさん :2011/04/23(土) 19:57:18.36
早わかりとかいいよもう
これからはScalaの時代なのでしょうか? 窓際プログラマーである私の救世主となってくれるのでしょうか?
572 :
デフォルトの名無しさん :2011/04/24(日) 00:46:28.53
諸君らの愛したClojureは死んだ!なぜだ!
死んだの?
clojure急にでてきてワロタ 572 はなにがしたいんだ?
言語って単なる道具だから、救世主とかじゃなしに使いこなすかどうかっていう話じゃないの
一番の目的は、mavenやosgiの要らないモジュール管理みたいだねぇ javaとの相互運用性は落ちそうってのがどういう目的なんだろう。 redhatなので投入先は、管理ツールやJBOSSのライブラリとツールなんだろうか?
clojureに関しては、Lisp系独特のとっつき難さがあっても、 STMが組み込みとかいろいろScalaより機能的に優れてる点はあるからわかるんだけど、 ceylonは、「Scalaは複雑すぎるから、もうちょっとシンプルにJavaを拡張しました」程度の印象で、 「Scalaより明らかに優れた機能」とかが見当たらないんだけど・・・どうなの? この解釈間違ってる?
型安全なリフレクションなど新しいアイデアが入っているらしい
そいつは…scalaでも取り込めるような。 というかなんかceylonってvb.netくさい…ような…。 .net意識してるよね、明らかに。 けどその中で駄目っ子のvb.netを最も意識してるように見える。 しかし赤帽もなんでこんな事するかな…。
底辺プログラマが使えるものを提供しないとw
底辺はずっとJava使ってりゃいいんじゃね?
ライブラリレベルで取り込めるような新機能だと存在意義が怪しくなるぞ Clojureが失速したのも他の言語が真似できるような機能しかなかったからだろ
Clojure事情詳しくないんだけど、失速してるの? でも例えば、STMってScalaの場合副作用ある操作が原理的にできちゃうけど、 Clojureの場合組み込みだから原理的に副作用ある操作が禁止できてHaapyとかじゃなくて?
新機能よりもバランスなんじゃないの?scalaの美点って。
Clojure はそもそもメインストリームレベルの人気を獲得するのはむずかしいと思うよ。命令型言語の延長として書き始められる Scala と違って完全にパラダイムの転換を要求するから。
赤帽って今でもクラス図作るよりも フローチャートで設計する旧型世代ばっかり だったからなぁその文化で言語作ったんだろう
>>580 > そいつは…scalaでも取り込めるような。
それ言い出したら多くの言語が同じになってしまう。
何でもできる言語より、限定された目的のための機能が制限された言語の方が使いやすい、 という考え方だってあるわけだしな。
つか、DSLってそういうもんだよね。
Logging API や Log4j を使ってクラス単位のログ出力先の定義ってどうしてる? ログ出力のためだけにコンパニオンオブジェクトとか定義するのはアホらしいし、 かといってログ出力ごときがインスタンス変数になるのもアホらしいし。
>>591 mixinするか、もしくはpackage objectに定義するとかが1番コード量は少ないかと。
この辺はもう好みの問題じゃね?
どういう意図を持つ発言なのか考えもせず 単にそれっぽい発言だからということで貼る俺って素敵、まで読んだ
ガビーンさんの言っていることがよくわからない
DSLって言葉が流行ってるからって、DSLと汎用言語を一緒に議論するのはちょっと違う気がするが
「XMLカコイイ! Beanや構造体は時代遅れ!」 とか騒いでた時代を思い出します
まあ、Scalaが最強のDSL言語なのは間違いないでしょ Ceylonはメソッド名にASCIIしか認めてないらしいけど、なんでそんな制限をしているのかさっぱりわからない
DSLって「事務計算に特化したCOBOL最高!」とかそういうことだっけ
ScalaはDSLじゃない。
まぁceylonなんてもう少ししたら話題にもならなくなるんじゃ
ceylon(笑) こうですか?`
Noopとはなんだったのか
>>602 JavaTeaに対して、CeylonTeaという名前をつけたくらいしか、笑えるところない言語だもんな。
まだ、仕様をきめただけで、実装もまだ、開発環境もまだ、、だよ。
5年くらい開発が進まないと、話にもならない。
Scalaはようやく開発環境もそろってきて、いろんな話できる段階に来た。
オダチャンまた俺にだまって RC2公開かよ
驚かせたくて…ゴメンね
誰とは言わないけど、少し自重しろ。 他のコミュニティに喧嘩売りまくっても、どんどん雰囲気が悪くなるだけだ。 自分がScala界の発展を背負うんだ、くらいの気負いがあるのかもしれないが、 ムーブメントはみんなで作り上げていくものだ。君だけのものじゃない。
Ceylonにコミュニティあるの?
>>609 TwitterでよくScalaの事書いてる某氏のこと?
オレだよ、オレ!
あるディレクト内にあるCSVファイルを全部読み込んで、 指定した複数種類のキーワードごとに、出現回数をカウントしたいだが、どうすれば? Scalaだと簡潔にかけるかなあ?
>>609 2chなんて所詮そんな場所だろ?
それとも2ch以外での活動を批判したいのかわからないけど、
直接名前だすか、もっと具体的にどこが悪いのか指摘したほうがいいんじゃねぇの?
仮に、そういう人が存在するなら本人のためにも。
あいまい過ぎて何が言いたいのかわからない。
>>618 ごめん。
Ceylonとかの話するよりかは建設的と思ったので。
Ceylonとかって、OSの設定とかいじったりするスクリプトを狙っているのだろう?
Scalaでもスクリプト書くのは十分容易なはず。
JVM系の言語でスクリプトなんて苦痛 短いのはGaucheで書いてるわ
>>617 import scala.io.Source
val file = "foo.csv"
var keyword = "hoge"
val csv : Array[Array[String]] =
Source.fromFile(file).getLines.map(_.split(",")).toArray
val n = csv.flatten.filter(_ == keyword).length
println(n)
これでどうだ!
>>617 確かに建設的な議論をすべきだな。ちなみに
>>623 は自前でCSVをパースしているが
ちゃんとやるにはopencsvなどライブラリを使うべき。
import au.com.bytecode.opencsv.CSVReader
val file = "foo.csv"
val keyword = "hoge"
val csv = new CSVReader(new FileReader(file)).readAll();
val n = csv.flatten.filter(_ == keyword).length
SourceとFileの混在はしばらく続くのかな…面倒だ
混在?混じってなんかないぞ。
Sourceって、ファイル閉じない奴だっけ?
IOライブラリはいつ入るの
>>623 ,
>>624 Thanks!
だけども、いまだに、こういうやりかたに慣れないなあ。
2つとも、ファイルの全内容を、Array変数 csv に格納したあとでflatten.filter しているけど、
もしも
・1ファイルが大きい場合は、Array変数あふれるのでは?
・Keywordが複数ある場合は、flatten.filter を複数回やるの?
とか考えちゃう。
単純に、
Foreach F ∈ {指定ディレクトリ内の全.csvファイル}
__ Foreach L ∈ {ファイルFから一行づつ取り出し} begin
___ ___ if (Lはword1を含む) count1 = count1 +1
___ ___ if (Lはword2を含む) count2 = count2 +1
___ end
みたいに、やりたいのだが、、。 逐次処理的だけど。
>>629 そういう書き方をするなら、scalaで書いても他の言語と大差ないと思うよ。
var count1 = 0
var count2 = 0
for(F <- ...) {
for(L <- ...) {
if(L contains word1) count1 += 1
if(L contains word2) count2 += 1
}
}
>>624 問題文には複数のキーワードってあるから結果はMapにすべきなんジャマイカ。
import au.com.bytecode.opencsv.CSVReader
val file = "foo.csv"
val keyword = "hoge"
val csv = new CSVReader(new FileReader(file)).readAll();
val result: Map[String, Int] = keywordList.map {
keyword => (keyword -> csv.flatten.filter(_ == keyword).length)
}.toMap
一度にファイルの内容がメモリに読まれる事を懸念するなら遅延リスト(Stream)を使えばおk。 flattenが複数呼ばれるのがいやなら、先に束縛しておけばおk。 val file = "foo.csv" val keywordList = List("hoge", "piyo") val csv : Stream[Array[String]] = Source.fromFile(file).getLines.map(_.split(",")).toStream val words = csv.flatten val result: Map[String, Int] = keywordList.map { keyword => (keyword -> words.filter(_ == keyword).length) }.toMap
>>Array変数あふれる ってどういうことだろう。配列の最大長を超えるってこと?どんなCSVやねん。
>>632 > val words = csv.flatten
ここで一気に読まれないの?
>>634 遅延リストのflattenは Haskellでは一気に評価されないのでScalaでも同様だと
思ったけど、よく考えたら違うかも。
あるディレクト内にあるCSVファイルを全部読み込んでのところを考慮するとどうなる? 俺が考えるとmutableなマップを用意して+1するようなやり方になっちゃう import java.io.File import au.com.bytecode.opencsv.CSVReader import collection.{mutable, breakOut} val path = """c:\fizz\buzz""" val keywords = List("hoge", "fuga") val result: mutable.Map[String,Int] = keywords.map(_ -> 0)(breakOut) for { csv <- new File(path).list.filter(_.endsWith(".csv")) word <- new CSVReader(new FileReader(csv)).readAll().flatten if result.contains(word) } result(word) += 1
>>638 なるほど。確かに今回は遅延リスト(Stream)ではなくIteratorのようなTraversableOnceを使うべきか。
val file = "foo.csv"
val keywordList = List("hoge", "piyo")
val csv : Iterator[Iterator[String]] = Source.fromFile(file).getLines.map(_.split(",").toIterator)
val result = csv.flatten.foldLeft(Map[String,Int]()) {
case (store, item) if keywordList.contains(item) =>
store.updated(item, store.get(item).getOrElse(0) + 1)
case (store, _) => store
}
Iteratorは、本当に一度しか使用しない場合。 Strameは2回以上使う予定がある場合。 という違いだよな? Iteratorは一度使いきってしまったら、もう一度Iterator自体を生成しないと同じことができない、使いきりのもの。 そのかわり一度走査した要素を保持しないからメモリは消費しない。 Streamは、初回の評価は遅延されるけど、2回目以降はメモ化されているというか。 (この場合メモ化っていう言い方があってるのかわからないけど) SourceのgetLinesが返すのはIteratorだから、そのIteratorを何度も使う場合は、 toListやtoStreamなどして違うcollectionに変換する必要がある。 逆に1回きりしか使わないのであればIteratorのまま使ったほうがよい。
なんども使いたいなら、その数だけIteratorを作ればいいんじゃない?
対象とするファイルがでかすぎるとか、 メモリに余裕がないとか、 次読み込むときには内容が変わってる可能性がある という場合以外は、メモリに保持しておいたほうが、2回目以降のアクセスがはやくできて便利じゃないの?
>>642 同意。最近のコンピュータはメモリたくさん積んでるから、数万行あるCSVファイルを
メモリに展開してもけっこう問題なかったりする。
>>617 の例だと読むのは一度でよいが、
より複雑な場合だとメモリに保持して置いた方がよいね。
開発の早い段階での効率化は悪だっていう説もあるから、あとで実際に問題になってから
考えるのでもよさそう。
csvとか頭悪そうで嫌いです
関係無いけどPHPなんかはcsv専用の関数がバグってるのにもう何年も修正してないな
fgetcsv? 海外製のソフトは日本語対応がいい加減だよね
Shift_JISみたいなクソ文字コード対応させられるのはたまらんだろ。 2byte目にバックスラッシュとか…
データがCSV -> opencsv で読む -> Iterator[String] データがExcel -> poi で読む -> Iterator[String] データをデータベースから -> Iterator[String] メモリ上の配列 -> Array#toIteratorで変換 -> Iterator[String] いずれにせよ、あとはIterator[String]をmapやfilterやfoldで処理して終わり。 ひょっとしてScala最強なんじゃないか。
んなこといったらLinqのあるC#が最強になってしまう
>>648 べつにどんな言語でもある程度似たようなことできるんじゃね?
あと、ArrayをわざわざIteratorにする意味がわからんが?
>>650 JavaやC#はmap, filterができないお。
あと、こういう作りだと単体テストが楽だお。
モックとかいちいち用意しなくても引数を切り替えるだけだお。
Array#toIteratorは確かにいらなかったお。
最近のC#にはmapやfilterに該当する高階関数は一通りあるだろ
.NETだと
Aggregate - foldl
Select - map
Where - filter
という感じだね
LazyなリストはIEnumerableで表現する
>>651 はLINQでぐぐるといいよ(福岡のアイドルグループじゃないほうな)
for love in qshu
>>652 >>653 C#って中途半端に関数型だから使いにくいんだよね。例えば列の直積を取りたいとき、
// C# 4.0
IEnumerable<Tuple<A,B>> prod<A,B>(IEnumerable<A> xs, IEnumerable<B> ys) {
return xs.SelectMany(x => ys.Select(y => new Tuple<A,B>(x, y)));
}
// Scala 2.8
def prod[A,B](xs: Seq[A], ys: Seq[B]) =
xs.flatMap(x => ys.map((x,_)))
俺はScalaの方がいいな。
>655 ほぼ同じじゃん。
>>655 んー
まあ関数型と思って見れば足りないものがいろいろ多いのは同意だけど
その「中途半端に関数型」な部分がなんも無いよりは、あったほうが俺は便利だと思うな
Javaと比較しての話
使用される最大メモリを低減するのを、遅延評価に頼って書くのは間違いだろう 素直にループ/イテレーションさせて書くのが正解だと思うが 標準のコレクションのmap,filterとかの高階メソッドじゃなくシーケンス内包 javaには無いって話だけど、標準にはないけどCommons Collectionsにはあるし
>>658 日本語おかしくて何が言いたいのかわからん
>>659 別にそこまでおかしくないだろ。
でも具体的なソース無しにCommons Collections だとできるとか言われても
よくわからんな。ホントかどうかも怪しい。
「中途半端に関数型」ってのは、まさにscalaに対して常々感じていた ことだなあ。 1. 高階関数を使うと、型宣言の嵐になる。 2. メソッド呼び出しが後置形式なので、関数適用が順に並ばない たとえば filter g . map f xがfilter(g, x.map(f))みたいになる。 まあOOPとFPを共存させる上でやむを得ないとはわかっているんだけどね。
>>661 確かに。関数型言語度で並べるならこんな感じか。
Java < C# <<< Scala < F# < Haskell
OOPとFPの融合というのが、単なる幻想でもっと純粋なHaskellのような関数型が主流になるのか、 それともScalaみたいな言語が使われるのか、 それとも、両方残って使い分けられるのか? 少なくとも、「純粋なオブジェクト指向だけ」っていうのは流行らなくなるんだろうな。 Javaもクロージャとか取り込むわけだし
「OOPとFPの融合」 という点だけ考えたら、べつにJVM上でなくてもよかったわけで、 Javaとの互換性とか考えずにネイティブで動く言語を一から作ったら、 もうちょっと綺麗な言語仕様になるんだろうな。 まぁ流行るかどうかはべつにして
>662 Java < C# <<< Scala ではなく Java <<< C# < Scala だと思うけど。 C#は何かと新しい。
>>663 Haskellのtype classはうまいことFPにOOPを組み合わせてる。
type alias, associateid type access, implicit argument dedection,
multi-type traitsあたりをちゃんと機能させて、既存のclassを使って、
新規にclass定義せずに型安全にOOP出来るのはHaskellくらい。
他の言語はtraits/concept辺りの機能が弱すぎ。
しかしオブジェクトが状態をもてないOOPというのは OOPといえるのだろうか
Haskell知らないでしょw
>668 Mark Jonesがtype classを提案した頃からHaskellとは 付き合ってきているつもりだが…ICFPにまだ出てないような 最新動向は確かに知らない。 元の話題について。 OOPとFPとの統合で難しい点のひとつはパラメトリック多相と 部分型多相の共存で、scalaもMLもそれで苦労しているね。 もちろん、破壊代入がなければ問題は生じないけれど。
>>655 こういう勘違いが本当に悲しい。
C#は確かに進化しているけど、型推論は永遠に中途半端、パターンマッチできない、lazy評価ができない、
nullぽが普通に起きる、対話環境ない、LINQによってやっとmap,filterができる、でもペアすらない。
C# <<< Scala は明らか。
構文の柔軟性は、 IDEの支援とどっちを取るかだね。
その辺って単に便利ってだけじゃなくて関数型志向と関係あんの?(たとえば型推論がより賢ければより関数型なの?) 自分的にはC#より関数型だなあって思うのはなるたけ副作用を嫌うとこ(valとかimmutableコレクションとか)と 文じゃなくて式なのが多いとこかなぁって思ってたけど
>>670 ペアってTupleのこと?
TupleならC#4.0から、使いづらいけど一応あるよ
>>670 つ CsharpRepl
LINQによってmap,filter云々てのもなんかおかしくね
ジェネリックなシークエンスと
ラムダ式やファーストクラスの関数がサポートされていることが本質的で
その辺があるのなら、(もし)なくても作ればいいだけ、簡単だし…
ML族に比べたらScalaの型推論も十分半端
まあ結論には特に異は唱えないけど
ゼロイチじゃなくてただの程度問題に見える
型推論は、Scalaの一番痛いとこだろ。
なんで痛いところなのかわからない
>>671 構文とIDEの支援とどっちを取るかって構文に決まってるだろJK。
ソースコードは書くことと読むことどちらも大事なのはプログラマの常識だろう。
あとIDEの支援はあとから良くなることもあるしな。
>>673 //Scala 2.8
val (name, age) = getNameAndAge()
println(name+"さんは"+age+"歳です。")
//C# 4.0 (笑)
var nameAndAge = getNameAndAge();
System.out.println(nameAndAge.Item1+"さんは"+nameAndAge.Item2+"歳です。");
>677 それはペアっつーか、Extractorだろ。
クロージャがあれば関数型ができるというのは暴論だろ その言語のライブラリとか文化的に関数型パラダイムがなくて、 一人だけ関数型プログラミングやってたら単に痛いやつになっちゃう
タプルのアンパック代入はmonoでそういう拡張があったような気がするな、まあどうでもいいけど
scalaもいつか、無名関数の引数のところに (x,y) => x + y みたいなパターンマッチ式を書けるようになると嬉しい。
あ、ペアを分解するパターンマッチという意味ね
いちいち、caseって書きたくないという話?
俺も最近考えた言語なのにパターンマッチ渡しを採用しない理由がわからん
>>681 できるよ。
List((1,2), (3,4)).map {case (x, y) => x+y}
OCamlの型システムの駄目なところ 1. 型推論の邪魔になるからオーバーロードがない 2. 単純なアップキャストですら明示的におこなわないと駄目 class a = object method a = 1 end;; class b = object inherit a method b = 2 end;; [new a; new b];; Error: This expression has type b but an expression was expected of type a The second object type has no method b こう書かなきゃ駄目 [new a; (new b :> a)];;
3. 継承してもサブタイプにならないことがある class a = object (self : 'a) method value = 1 method calc (o: 'a) = self#value + o#value end;; class b = object inherit a method value2 = 2 end;; (new b :> a);; Error: Type b = < calc : b -> int; value : int; value2 : int > is not a subtype of a = < calc : a -> int; value : int > Type a = < calc : a -> int; value : int > is not a subtype of b = < calc : b -> int; value : int; value2 : int > で、どの言語が中途半端だって?
関数型言語オイルレスリングスレでどうぞ
C#って関数内関数ってできないよね。 例えばScalaでいう def hogehoge() = { def calc(x: Int) = { if (x > 0) x+1 else x-1 } Array(1,2,3).map(calc) } みたいなことをC#でやろうとすると private int calcHogehoge(int x) { if (x > 0) return x + 1; else return x - 1; } public Array<int> hogehoge() { return [1,2,3].map(calcHogehoge); } みたいになってとっても残念な気持ちになる。
>>689 >>671 そのものズバリ、ラムダ式、匿名メソッドでぐぐればいいと思う
その例だと単に
new []{1, 2, 3}.Select(x => x > 0 ? x + 1 : x - 1)
とでも書くか、
Func<int, int> calc = delegate(int x) { .... };
とでも書く
別にC#のスレじゃないからC#知らなくてもいいと思うけど
ロクに知らないことまで無理して貶すのは如何なもんだろうか
HTTPでテキストデータをダウンロードするときは、Source.fromURLで簡単に出来ますが、 画像などのバイナリデータを簡単にダウンロードする方法はないのでしょうか?
つ getByteStream()
>>692 確かに細かな構文が違っていたのは謝る。でもラムダ式、匿名メソッドを知らない
わけじゃないよ。言いたかったのは、クロージャの式がある程度複雑になったときに
無名関数は適さないし、delegateは構文が重すぎだろ。
さらに構文だけじゃなくて、Genericsができないから実用上はとても使えない。
C#で内部関数を定義するためにdelegateをわざわざ使うのはあまり見ないけど
Scalaだと標準ライブラリ内でもよくあるってのは事実だろう。
List(1,2,"1",2.4).filter(_.isInstanceOf[Int]).map(_.asInstanceOf[Int]) のようなことを総称つかってやれないでしょうか? 単純に[T]をつけてIntをTに置き換えただけだとfilterが働いていないようです
>>696 素直な方法では無理じゃない?
JVMベースなので、コンパイル後に型情報を捨ててしまうため
実行時に参照できない。
>>696 classmanifest使えばできると思う
>>692 確かにScalaに直接関係ない部分での知識不足というか、説明不足というか下手というか、
言いたいことよくわからない人がでてきてて、それに突っ込む返信も多くなってしまって
微妙になってるな。
他の言語と比べること自体はありだとは思うが、話それてScalaに関係なくなってるのは…
>689 > C#って関数内関数ってできないよね。 できる。 >695 > 言いたかったのは、クロージャの式がある程度複雑になったときに > 無名関数は適さないし、delegateは構文が重すぎだろ。 これは主観だからノーコメント。 > さらに構文だけじゃなくて、Genericsができないから実用上はとても使えない。 できる。
>>700 匿名関数でGenericsできないだろ。できるのか?ぜひ教えてくれ。
構文が重いかどうかは確かに主観的だったな。
しかし、匿名関数以外でローカル関数定義はC#で見ないよな。これは事実じゃね?
>>696 ,697
def f[T](l: Seq[Any])(implicit c:reflect.ClassManifest[T]): Seq[T] =
l.filter(c.erasure.isInstance _).map(_.asInstanceOf[T])
でプリミティブ以外はいけました。
erasure経由してるからかIntじゃなくてIntegerになってる。
>>700 匿名関数でGenericsできないだろ。できるのか?ぜひ教えてくれ。
構文が重いかどうかは確かに主観的だったな。
しかし、匿名関数以外でローカル関数定義はC#で見ないよな。これは事実じゃね?
C#の話はC#板でしろ。もしくはググれ
inputStreamを簡単にファイルに書き出す方法はありますか?
>>705 ぼくの考えたさいきょうのこーど
def fwrite(filename: String, in: InputStream) = {
val out = new FileOutputStream(filename)
for (b <- Source.fromInputStream(in)) {
out.write(b)
}
}
InputStreamはSerializableでないので、ファイルに書き出すことはできません
>>706 それはバイト単位の読み書きになりませんか?
709 :
デフォルトの名無しさん :2011/05/03(火) 17:27:14.20
>>700 匿名関数でGenericsできないだろ。できるのか?ぜひ教えてくれ。
匿名関数でGenericsできないってのは、要はScalaでいう def hoge() { def foo[T](x: T) = ... ... } のfoo(ジェネリックなメソッド内メソッド)がC#では定義できないってことだよね?それならあってる。 この点はC#がScalaに比べて不利な点かもね。
711 :
sage :2011/05/03(火) 19:44:44.34
>>711 C#に追い付かれると困る人もいるんだよ
優越感のためにScalaを使ってる人とかさ
はいはいC#はすごいすごい だから巣に帰ってね
いや、初撃に撃ちすぎだろwwww
誤爆・・・
これからC#スレに特攻して、scalaの凄さを売り込んでくる ノシ
>>716 ネタだとは思うが、そういうイタいことはやめれ
C#に触れちゃいけないということは良くわかった
scala >>> C# という事実を認めない奴が多すぎる
C#の話になると途端に話のレベルが低くなるな 言語の優劣はともかく使ってるやつは間違いなく低能
C#の話はおいといて、Scalaの標準ライブラリにLoanパターンを実装したの取り込んでくれないかねえ 要はこういうの def using[A <: { def close(): Unit }, B](resource: A)(body: A => B): B = try { body(resource) } finally { resource.close() }
Scala厨はC#に脅威を感じている
Java7 Scala動かないだろうし
Scala難しいよぉぉぉぉ!
AutoCloseableか Scalaでもそれに合わせて何か入るでしょう
> A large number of bugfixes が気になるなあ。 どこにどんだけバグがあったんだろ。
tracに登録されてここ1週間で更新のあったclosedなのが20個くらいだな。
作りながら仕様を決めてる感じがするな
C#は良い言語だろ(使ったことないけど) ただ、そのC#で何つくるのって話になると(笑)になるだけのこと
2.9.1finalはいつ出るの?
RCだすタイミングってどういう基準なんだろ。RC2からRC3が結構はやかったな
RCの意味的に考えると重大で対処可能なバグが全部つぶれたタイミング
>>734 多分年末くらいじゃないかな
2.8.0が出たのが2010年7月で、2.8.1が出たのが2010年11月だから
>>708 バイト単位の書き込みに何か問題あったっけ?
>>708 ,738
Source使うとバイト単位じゃなくてChar(2バイト)単位での読み書きになってしまうんじゃないかな
(で、それがむしろ問題なんじゃないかと)
740 :
739 :2011/05/04(水) 19:49:57.49
あー、この表現も正しくないな。読み取りがChar(2バイト)単位になってるのに、それを1バイトとして書き込んでるのが、 (FileInputStream#write(byte))問題なのではないかと。
741 :
708 :2011/05/04(水) 20:37:02.88
FileOutputStreamへの書き込みがBufferedじゃないんで1byteごとに アクセス発生して遅いんじゃないかと思った。
やっぱり、ScalaはI/Oがカスだな。
I/O回りのAPIの手入れが遅れてるのは何が理由なんだろうね。
将来的には素晴らしいIOを入れようとはしてるんだけど、 今のものを完全に置き換えるようなものなので、 既存のものをちょっとだけ改善してもどうせ捨てられるから意味ないしーという感じで、 今のAPIは誰もいじろうとしてないらしい
I/Oがカスじゃないと、本格的な関数型言語とは言えない。
ライブラリ空っぽの方が夢詰め込める
いちいち依存関係を解決するのがめんどくさいから、I/Oくらい標準APIでなんとかして欲しいなぁ。。w
どのタイミングで始めるべきか、いまだにつかめない
>>748 え?始めたいときに始めればいいんじゃ?
覚えた言語が仮に廃れたって大した損じゃないし、面白いと思ったら勉強すればいいんだよ。 今時、「使える言語は一つだけです(キリッ」とか言ってる奴の方が、よっぽど使えない。
Javaとの差分でScalaやるんならScalaで覚えたことは 他の静的型付け関数型言語でも使えるよ。 自分の趣味プログラムや細かい社内ツールにならまったく問題ないんだが 多人数である程度の期間やる商用の場合に使っていいかは迷う。
>>709 「scalaでは」匿名関数でGenricsってできるの?マジ知りてーわ。
scalaは関数内関数でできる C#はdelegateでできる 終了
>>752 Scalaだと普通にできるだろーが。
def foo = {
def id[A](x: A) = x
id(id[Int](_))
}
これはC#では絶対にできない。
それ匿名関数ちがう
>>755 あ、ホントだ。でも関数内関数でGenericsが実現できてるよん♡
scalaは匿名関数でGenericsはできない
関数内関数でGenericsが使いたいな♡ Scala: 出来る C#: 出来ない 修了
>>758 匿名関数でGenericsできないだろ。できるのか?ぜひ教えてくれ。
>>752 匿名でgenericsって意味あるの?
scalaの欠点ってなんなの? valとvarが目障り以外で教えてくれ
762 :
デフォルトの名無しさん :2011/05/07(土) 19:15:01.02
コンパイルが遅い。
>>761 コンパイルが遅い。F#と比べると若干型推論が弱い。
764 :
デフォルトの名無しさん :2011/05/07(土) 21:42:57.74
メモリ馬鹿食い
>>765 //F#
let foo x = (x, x)
//Scala
def foo[A](x: A) = (x, x)
DSLってなんなの? いまいちピンとこない。
>>768 の記事には、scalaとF#はmixin以外はほぼ同じって書いてある。
scalaとF#ってほとんど同じなの?
>>769 構文は全然違うけど、言語機能や思想はだいぶ近いと思うよ。
でもF#の方がより関数型っぽいキガス。
771 :
デフォルトの名無しさん :2011/05/07(土) 23:27:39.96
>>770 >F#の方がより関数型っぽいキガス。
そうなのかー。
じゃあ、F#の本もちょっと買ってみるかな。
GUI作ったりするなら、やっぱり.NETの方がいいからね。
Scalaの場合は、ウェブアプリくらいしか、使い道が思い浮かばない。
Scalaで数値計算とかはやっぱ微妙だよね?
まあ、F#も微妙だろうけど?
数値計算って言ってもいろいろあるんだろうけど 速度の限界目指さない用途ならそんなに困らないと思う。 糖衣構文ある分Javaより楽だけど不用意に使うと遅いこともあるんで、 JVMの限界目指すとJavaっぽい書き方になっていく 詳しくないがLAPACKみたいな用途だと突き詰めると FORTRAN/C使えってことにならないの?
773 :
デフォルトの名無しさん :2011/05/08(日) 01:58:15.13
>>772 >FORTRAN/C使えってことにならないの?
ガチンコで速度勝負ならそうなるよ。
例えば、実行速度が1.1倍になっただけでも、嬉しいならC言語で書くべき。
一方で、どんどん新しい数値計算処理コードを書く場合は、
実行速度と生産性の両方が重要になるよ。
もちろんrubyレベルの遅さは論外だけど、JavaやC#は許される。
pythonはちと厳しいかも。
>>771 ScalaもF#も「静的型付け」の「非純粋関数型言語」であるという点で同じだね。
細くとしては、F#は、MicrosoftがOcamlっていうこれも「静的型付け」の「非純粋関数型言語」の言語を
参考に、「.NET」上で動く関数型言語を用意しようって目的で作られた。
で、Ocamlっていうのは、フランスのある機関が教育用につくった関数型言語である。
Scalaっていうのは、Javaのライブラリを使える関数型言語をつくるって目的でつくられた。
どれも親戚みたいなものだね。そして、目的(作られた経緯)がちゃんとあってすみわけされてる。
pythonはCで書かれた数値計算用のライブラリがあるからそれなりに使えるよ。 ライブラリでカバーできない部分でも、高速化したい部分は自分でCで書いちゃえばいいし。 Cで書き直して高速化できるという点はrubyも同じ。 rubyもpythonもCと繋ぐのはそんなに難しくないです。 実はjavaもscalaもまるで分かってないのだけれど、 scalaの一部をjavaで書き直して高速化とか javaで書かれた数値計算用ライブラリが使えるとか、 scalaにそういうのは無いの?
>>775 > scalaの一部をjavaで書き直して高速化とか
javaとscalaだと、ほとんど速度は変わらない、という話。
どちらも、ソースコードを、コンパイルして生成されるclassファイルを実行するという点
は変わらないからね。
ただ、Scalaのライブラリを遅く使うような書き方すれば遅くなる。
> javaで書かれた数値計算用ライブラリが使えるとか、
ScalaはJavaのライブラリをシームレスに使える。
当然、Javaで書かれたライブラリ資産を呼び出そう。
たとえば、Scalaから、Processingを呼び出すのも可能だ。
> scalaにそういうのは無いの?
つ Scalalab
http://code.google.com/p/scalalab/ これは、Matlab みたいな数値計算を Scalaの文法でやるもの。
数値演算、行列演算、データマイニング、ニューラルネット など。
現在、ものすごい勢いで開発されているので、頻繁にアップデートチェックしてね。
ただ、チュートリアルとかの情報は少ないので、とりあえず実行してみるべし。
Scalaによる科学計算の速度だが、
http://swik.net/scalalab によると、
・Javaと同等
・ScalaLab(ScalaSci) は、 Matlab mスクリプトより 20〜40倍速い。
・C/C++に近い速度。もしくはC/C++以上の速度。
とか書かれている。
まあ、C/C++以上っていうのは、そういうライブラリもある、、って意味だろうけど。
ScalaっつうかSun JVMの話になるがJNI経由でCのコード呼び出しは粒度が あんまり細かいと呼び出しコストの方がでかくなりがちなのが難点だな。
2.9.0 RC4 来たざんす
ワシのRCは108式まであるぞ
じゃあ3.0来週か?
RC4のところの説明文読めばわかるけど、もうそろそろfinal来る頃だと思うよ。RC3→RC4は 大きなバグフィックスは無いし。
Scala Daysまでにリリースって目標も続いてるのかな?(それとも、もともと無い?) 去年は4/15-16、今年は6/2-3
785 :
デフォルトの名無しさん :2011/05/10(火) 18:16:55.70
なんかF#の方がいい気がしてきた今日この頃
どうぞどうぞ
純粋に言語仕様の良さなら Scala より良いのいくらでもあるよ。 中途半端に関数型で JVM 上で動くからこそ注目されてる。
Scala Daysでもう一回School Daysネタを振ってくれる猛者はいないかなー(チラッ。
ライブラリ回りがScalaの1/10でも1/100でもかまわなければ ML派生・Lisp派生は10と言わずあるだろ
VDM++をScalaでラッパした ライブラリって知りませんか?
Scala ってか関数型言語でコマンドラインパラメータの解析って どういう書き方が良いんだろう? for(int i=0; i<args.length; i++){ if(args[i].equals("-f")){ filename = args[i+1]; i ++; } else if ... } Java だといつもこんな具合に書いてるんだけど。
そんなんの代わりならこんなんでいいんじゃね? パラメータの数ごとにループ走るけどまあ問題ないっしょ 本当はそれ用のライブラリ使うのがいいと思うが val filename = args.dropWhile(_ != "-f").tail.headOption val hoge = args.dropWhile(_ != "-h").tail.headOption ...
2.9.0 RC5 登場。final間近の模様
797 :
795 :2011/05/12(木) 09:22:23.20
tailじゃ安全じゃなかったわdropで val filename = args.dropWhile(_ != "-f").drop(1).headOption
Commons CLIでいいんじゃね。
変わったし検索もだいぶ速くなってるぜ
804 :
デフォルトの名無しさん :2011/05/13(金) 18:20:23.86
valを省略可能にしたいんですが、 コンパイル時に自動でvalを付け加えるプラグインって簡単に作れますかね?
806 :
デフォルトの名無しさん :2011/05/16(月) 02:44:33.93
ここ数年スラドも特定技術の話題だと弱いね Linuxや*BSDのリリースストーリーでも中の人が書きこまない限り 関連した回顧ネタや自分語りばっかりだったりする
スラドのレベルが低いのか、それともハッカー受けしない言語なのか
ばかにはよめないもじでこめんとがかいてあるのです
/.jpのコメント数は人気とはほとんど相関関係が無いので、どうでもよいかと。 あそこは、単に誰でも参加できるような自転車置き場の議論があると盛り上がるところ なので、新バージョンリリースとかだとさほど盛り上がらない事も多いです(実際に そこそこ使われている言語であっても)
スラドjは、とんがった人はほとんどいなくなっちゃったから。
とんがった人はどこにいったの?
次世代Javaはこれで決まりみたいな惹句が書いてある書籍売ってるけど、これが 主流になる世の中なんて絶対来ないよな(笑)
スラドの読みづらさは異常
X[-Z, +R] の-Zとか+Rってなんですか?
共変・反変
パラメータ化された型
Perlとかもそうなんだけど 記号を使いまくる言語はググり難くて困る
>>820 > 記号を使いまくる言語はググり難くて困る
だけど、記号じゃなくて、長い単語だったりするのも困るし、、。
どこかに、
記号 → 意味
の一覧表はないのかなあ。
英語と日本語(正式名称, 通称 ) 付で。
たとえば
+ ; PlusOperator ; プラス演算子
+ ; ????? ; 共変を示すなんとか
+ ; ??? ; 正規表現のうんたらなんとか
みたいな感じで。
PlusOperator(笑)
それほど探すの難しいところじゃない。 リファレンスマニュアルで検索すればすぐ出てくるし。 まあ索引がないのはどうかと思うが。
公式のPDFにEBNFあるが、そういう目的には使いづらいね
inferred type arguments [Hoge,Hoge] do not conform to method ~'s type parameter bounds [AA >: Hoge,R] ってどういう意味ですか?
>>826 具体的にどんなコードを書いてそんなエラーが出たんだ?
fscで初回や、しばらく時間を置いたときに Could not connect to compilation daemon. となるのは何故ですか? scala2.8.0 windowsXPです
タイムアウトしてるから まあ、起動が間に合うくらいのハイスペックマシンでないと scalaを使うのはつらいね
APIマニュアル見てると、メソッドに打ち消し線が入ってるのがあるけど、これって非推奨とか廃止予定とかって意味なのかな? scala.io.Source.getLineとか。
deprecatedって書いてあるじゃん
>>828 sbt使ってるけど、ビルドがタイムアウトしたことなんてないよ。
起動でしょ?
Rubyのブロックに相当する部分って何か呼び名ある? 後置クロージャーとか?
クロージャにどこに置くもなんもなかろう
>>814 動的型付け言語みたいのなんかよりはJavaの次世代候補としては可能性高いと思ってるけど
838 :
デフォルトの名無しさん :2011/05/22(日) 21:56:24.00
普通にJava 7, 8, 9.... じゃねぇの?>次世代候補
Cに対するC++みたいにならないか心配
>>840 大成功じゃん
そこまでは行かないかと。
ScalaでOS書くことは可能ですか。 問題があるとすればなんでしょうか。
>>842 可能だろうし特に問題はないんじゃない?
Java製のOSもあるにはあるしね。実用的かはともかく。
> We are keen to receive applications from recent, top quality graduates with good all round > programming knowledge who are excited to work in a multi-language environment that > includes Java, Scala, and C++. We are also looking for more experienced developers as follows: まぁ、もっと専門的な経験(分散処理とか)を持っていることが大前提なわけだが。 業務での一番基本的な技能として位置づけられるところまで来た、と見ることはできるか。
OSとかは、素直にCで書けばいいんじゃない。 ああいう基礎的で要求が変化しにくいものを、わざわざJVM言語で書く意義は無いと思う。
そこはバイトコードをネイティブに変換すればよくない?
ああいうのって、速度とか稼ぐためにCPUとかハードウェアべったりなんじゃないのかな。 OSって、根本的なアーキテクチャに大きな変更が何度も起きるものじゃないわけで、 アセンブリとかCとかで書いた方がメリットがあるものだと思うよ。 # APIがクルクル変わるOSとか、悪夢以外の何物でもない。 んで、アプリとかサービスになるとまた話は変わってくるわけでさ。 Scalaの力が発揮できる領域はそこでしょ。
まあ実際にはそうだろうけど記述力の検証にはなるんじゃ?
世の中にはカーネル書くのが趣味という暇人…もといハッカーが結構いるみたいだから、 そのうち誰かが試すかもね。
Javaにはjnodeってのがかつてあって、 ブートに使ってる若干のアセンブラ以外は全てJavaで書かれてた。
>>839 電話面接で英語できねーっていったらそこで面接終了された。
電話切られたの?
関数型でOS書くってのが、何か新しいものが見えてきそうで面白そうだけど・・・だめ?
チャレンジはいつ何時でも尊いと思うよ。車輪の再発明という言葉はあるにせよ。
車輪なんて何度発明されてもいいの。 だって再発明ってすごく楽しいじゃん。 関数型言語で作られた関数型OS。なんてクールなんだ。 プロセスを起動してもいつ実行されるか分からないぜ。
( ;∀;)イイハナシダナー
Operating systemの働きをmonadで記述したのがあったと思う。 Prologで書いたOS、荘園ってのもあったはず。ICOT!
関数型と言ってもlazyじゃなきゃ、システムプログラミングは他の言語と大して変わらんと思う
でもモナディウスはすごいな。
>>860 荘園はOSってよりその中の独立したプロセスみたいなもん
OSはPIMOS、言語はKL1
>>865 勝ち馬に乗ることしか考えてない冷笑主義よりは100倍マシな態度だと思うよ。
もちろん、実際に有用な結果が出るかはまた別だが。
再開発は自分のスキルアップのためにも良いことだと思う。 ただし再発明はただの世間知らずということだ!
こりゃ迂闊に面白そうとか言えねえな。
2.9.0.1とか…
何の冗談かと思ったら本当にリリースされてるのかw
なんか致命的なバグでもあったん?
2.8系のときと同じように、しばらくは新しい機能入れるよりも、バグフィックスとか、細かい調整になのかな
ま現状では、一番まともな言語だと思うよおれは。 代数データ型あるし、ファーストクラスの関数あるし、パターンマッチあるし,imuutableあるし だけど、オブジェクトあるし、破壊的代入あるし、継承あるし で、こんだけあったうえで型推論がんばってるし。
加点法でいくなら C++0xとかCommon Lispとか最強じゃないですか
もっと古い例だとMULTICSとPL/Iかな
878 :
デフォルトの名無しさん :2011/05/26(木) 03:49:09.77
ただ、id:α→α くらいは推論してほしいな。 もう型推論にもレベルみたいなのいれて、選べるようにしてほしい。 このコードは型推論Lv2以下でコンパイル可能とかww あと、もっと組み込みの代数データ型を増やしてほしい。色々なGraphとか、
GraphはIncubatorにあって、そのうち入るかもしれないよ
883 :
デフォルトの名無しさん :2011/05/27(金) 22:44:10.39
ヒント:不人気言語
ヒント:みんな882のように思ってる
Scalaに代数的データ型なんてなくね?
オダちゃんはいずれ オラクルの金権攻撃に負ける
( ´_ゝ`)フーン
こんな言語が普及するわけがない。
な、なんだってー
>>880 Scalaの日本のユーザーグループだからブックマークされてて当然だろ JK
インストールにえらく時間かかるなー
892 :
デフォルトの名無しさん :2011/05/29(日) 16:43:59.87
エクセプション時のメッセージが長すぎてやってられん。 しかもJavaのだし。
最初の10行くらいで十分だよな sbt0.9.xだと表示する行数指定できて便利よ
例外のメッセージは冗長な方が助かると思うのは俺だけか…
長くてもいいが、scalaの言葉に直して表示して欲しいな。
無名関数があると読みにくくなるのは確かだが変に省略されても困るね
sbt0.9って最近聞くけど、何が変わってんの?
>>880 ,890
のサイト立ち上げた張本人です。ちょっと誤解がありそうなので、サイトの立ち上げ経緯を説明しておこうかと思います。
とはいっても、本当にサイトの冒頭に書いてある通りなので、ほとんど重複した説明になってしまいますが。
現在、Scalaの日本語情報はあちこちのブログとかに散逸していて、しかも、誤った情報も少なくない状態です。こういう状態では、英語が苦手な人が Scalaを新しく始めるのは敷居が高いだろうと思います。その状況を草の根レベルでいいので、少しずつ改善していきたい、というのが一つ目の動機です。
二つ目の動機は、これまでScalaに関する疑問に勝手に首つっこんでいる内に蓄積された、FAQとかTipsとかの情報整理です。結構、皆同じようなところではまってる、 という事に今更気づいたので、それならサイト作ってFAQやらまとめておいた方が、レスして回るよりは効率的だろうなあと。
てなわけで、ユーザーズグループとかなんか大層なものでは全然無いです。もちろん、可能な限り正確&鮮度の高い情報を提供するつもりですが、あくまで私含む 少人数で、草の根的にScalaを普及させようという目的で(&趣味で)運営しているだけのサイトです。
その2が2つある…だと…?
ふいた。
代数データ型あるだろ、 (1,2,3)とかのタプルとかSet,Seq,Mapなど、でも自分で作るときはオブジェクト経由して定義しないとだめ。 ML風の代数データ型の定義を導入してほしい
>>897 scala-2.9対応とかじゃね?
正直SBT設定ファイル書くだけならバージョンとか気にならんよな。
しかしsbtまじ便利。scalaの弱点だったコンパイル速度が気にならないくらい
一瞬で結果を返してくれる。ガチで開発効率が良くなった。
Web開発者もAndroiderも、Scala開発者は全員sbt使うべきだと思う。
>> ◆CgacaMDhSQ さん 乙です。リンク集のライブラリへのリンクと解説がイイ!(・∀・) Scalaでなんかやりたいときに逆引き的に使えるね!
結局scalaはrubyに勝てるんですか?
911 :
Scala初心者 :2011/05/30(月) 15:02:02.21
Scalaのパターンマッチを勉強しています。 新しいデータ構造を定義するときは、できればcase classで定義しておくと、 そのあと、パターンマッチしやすくて、そのデータ構造を探索するような処理のときに便利そうということはわかりました。 標準添付のライブラリのなかに、case classで定義したような クラスってありますか? まだ勉強中ですが、unapplyメソッドを自分で定義すれば、case をつけなくても良いような気がしますが、 標準添付のライブラリはそんな感じでしょうか? 理解が不十分で申し訳ありませんが、case classのよいサンプルを探しています。
ProductNとかTupleNとか
913 :
Scala初心者 :2011/05/30(月) 16:00:47.09
むずかしぃ〜ということがわかった。
他はxml.Elemとか
一番メジャーなのはOptionかな 知ってると思うけど、case classはapplyとunapplyが自動で定義されるだけだから 基本的に他の関数型言語の代数的データ型と同じような機能と考えられるから、 使い道もそんな感じになる
>>912-915 ありがとうございます。
教えてもらったキーワードについて、理解を深めてみるよことにします。
リストは,組み込みなんだっけ?
いや、ただコレクション系はcase class一辺倒で、 unapplyのみの場合と対比して理解できない。
919 :
デフォルトの名無しさん :2011/05/30(月) 22:34:28.80
NetBeans、eclipseの重さに耐えかねて、vim + codefellowってやつを使おうと思ったんだけど、更新が去年でとまってるのね。 誰かこれの行方を知ってる人いないかな。ただ更新止まっただけなのかな。
そんな無駄な方向で時間を無駄にしないでPC買い換えろ
>>917 コップ本P416によると、組み込みじゃないらしいぜ。
922 :
デフォルトの名無しさん :2011/05/30(月) 22:55:37.22
Scalaってどこが偽関数型なんですか? F#に比べてクソって書いてありますが・・・
NetBeansは、7.0になって、何かマシになったの?
F#は1980年台から開発してきた究極の関数型言語 Scalaはなんちゃって関数型言語ってことであってる?
関数定義の順番に依存するF#の方がクソな気がしますが・・・
F#はかなり有力な言語だよ 高速だし
>>924 Scalaがなんちゃってなのはモナドまわりに関してですか?
>>911 他の人も言っているけれど Option型はちゃんと使い方を知っとく多くの関数型言語で役に立つよ。
代数的データをうまく生かした好例だと思う。定義はこんな感じでとってもシンプル。でもベリー役に立つ。
sealed abstract class Option[A]
case class Some[A](x: A) extends Option[A]
case object None[A] extends Option[A]
HaskellならともかくF#に言われる筋合いはない
よく知らんが、#が付いているだけで残念な感じです。 いや、きっと究極なんだろうけど。
F丼
>>927 ScalaのモナドはHaskellそのまんまだぞ
F#のモナドは・・・非常にMS的というか
あのでかい表をみてHaskellerがどう思うか聞いてみたい
MS的ってocamlと違うのかな? それとMSとMSRって別もんじゃね?
sbt0.9で run すると↓のようなログが出るんだけど、 > [error] {file:/C:/.../hoge/}default/test:run: java.lang.RuntimeException: No main class detected. 0.9では run = test:run ということなの? run したときは mainClass in (Compile, run) test:run したときは mainClass in (Test, run) で指定したクラスが実行されるもんだと思ってたけど…。 というかそのようにしたいんだけど、どう設定したらいいんだろう。 コンパイルは早いし設定も楽になったから是非0.9を使いたい。 しかし実行に関する部分がイマイチわからない…。
F#だけが唯一Haskellに対抗できる 至高の言語だよねぇ
ぶっちゃけF#使ったことないわ 開発環境よく知らんからなあ Scalaはsbtがあるし、OCamlはOMakeがあるんだけど monoと一緒に使える、似たようなのがあれば、使うかもしれん
VisualStudioっていう一級品の開発環境あるだろ・・・
OMakeってネーミングにちょっと惹かれた
>>936 Simon Peyton-JonesとDon Syme、
開発者同士は、同じケンブリッジのMSRだから結構相談しあってるようだね。
つーか、Simon Peyton JonesはMSに居たよね 今でもいるのかは知らんけど
>>934 sbt 0.9は、まだちゃんと実装されてない部分があるので何とも。
何ヶ月か前に試した時は、consoleが実装されてなかったりとかした。
C#の補助としては有用かもね、F#
simonpjはCLRのboxing/unboxingをやってた。 今はたまにLINQに言及することがあるくらいで、 MSの製品とは直接関係ない昔と変わらない研究してる。 今は無きHaskell.NETにも関係していたはず。
まんまだな
>>947 ありがとう。
バグなのね。
直るの待つしかないかな。
>>950 PlayってJava前提だからScalaで使いにくいんじゃない?
nullが平気で出てくるから関数型言語なのに実行時エラーがでまくりって聞いたけど。
Play Scalaは全然使い物にならないよ 一度でもエラー発生すると、nullばかりでどうにもならないし 関数型言語っていうよりRoRパクッた駄作だと思う
結局LiftとPlayとScalatra+Scalateのどれがいいの? それとも他に選択肢あんの?
Wicketでやってる人も居たような
956 :
初心者 :2011/06/04(土) 02:35:42.66
Scala 2.9 でScala勉強しています。
ListとArrayを見てるんですが、それぞれ、Immutable, mutableの違いがあるようです。
また実装の仕方も違うので、同じことをするのでも速度が違うということがわかりました。
それで、どういうメソッドがそれぞれ使えるかを調べていて、継承関係など見ていますが
コップ本やネットの記事をみてると、
ArrayもListもSeqを継承しているように書いています。
ちなみにネットの記事は
http://goo.gl/NXgoR を参照しました。
しかし、APIをみてみると、Arrayは、Seqを継承していないようです。
http://www.scala-lang.org/api/current/index.html これは、2.9 で仕様変更があったのでしょうか?
(ちなみに、コップ本(日本語)は、Scalaのバージョンいくつですか?いろんなページみたけど書いてません)
ご存じの方、情報ください。
よろしくお願いします。
ArrayとListのメソッドの違いを理解するのに苦慮しています。
エラそうな奴だな。
ちゃんと敬語使ってるのに! ArrayとListの区別もつかないやつはもっと基礎から勉強したほうがいいよ
それがエラそうなんだろ。
Scalaユーザはキモい人が多いの?
俺もscalaユーザになったからさらにキモくなるよ。 フヒヒ、すんません
次世代Javaとか言ってるけど、C++みても分かるように既存の言語になんとか風味をくわえた 折衷言語って結局失敗するよね。JavaとかC#みたいなのが出てくる。 Javaに関数型言語風味を、なんて失敗するのがオチ。
C++が失敗?
じゃあJavaもC#も失敗だろ
>>956 コップ本は2.7.7対象。2.8.0以上対象の第2版が英語だけど出てる。日本語版はまだ。
配列に関しては
>>957 を配列の項を読めばおk
ArrayOpsとListで使えるメソッドの違いって::系ぐらいだと思うんだけど……
解決しました。まずsbt-appengine-pluginをローカルにインストールする必要があることに気づきませんでした。 だってsbtは設定を書くだけで必要なパッケージを自動で取ってくる優れたツールって聞いてたし、 このpluginの本家READMEを読んでもインストールが必要なんてこれっぽっちも書いてないんだもん。
>>953 Grails/GRuby on Rails のJavaで作ってた部分をScalaで置き換え。
おまえらscalaで最強のフレームワーク作れ scalaを流行らせてくれ
>>971 なるほど。Goが最も優れてるけど今更引くことは出来ないと
974 :
デフォルトの名無しさん :2011/06/06(月) 15:47:57.02
2.9でも相変わらず List((1,2),(3,4)).map((a,b)=>a+b) 的なことはできないんですか? ちなみに正解は List((1,2),(3,4)).map({case (a,b)=>a+b})
>>974 下の書き方で何も問題ないと思うが。もしかして数バイトが惜しいとか。
976 :
デフォルトの名無しさん :2011/06/06(月) 16:52:28.15
>>975 しばらく使ってないと、必ず上のように書いてしまう。
caseがウザイと思いませんか?これなら許せる。
List((1,2),(3,4)) map {(a,b)=>a+b}
>>976 いまさらそんなこと言ったってしょうがない。
確かにそのように書けたら、ちょっと短く書けて便利かもしれないが、
そんな数文字省略できるくらいで、それほどすごい利点があるわけではない部分が、
この先変更になる可能性はかなり低いと思う。
どうしてもそうしたいなら、自分でコンパイラのソースでもいじって、省略できるようにするればいいのでは?
しかしまあなんでこうScalaの構文ってこんなにセンスが悪いんかね
>>977 うむ・・、残念。
>>978 ちなみにセンスいい言語って何ですか?
Haskellはウネウネするしなぁ。
カッコいい言語ならLisp
Lispはね、書きやすいけど読みにくいのよ
引数と戻り値がスタック上に暗黙のうちにあってぜんぜん字面にあらわれないForthとかぜんぜん読めない
983 :
デフォルトの名無しさん :2011/06/06(月) 21:30:37.43
scalaのnullをjavaのGraphics2Dに渡したらjava.lang.NullPointerException になっちゃったのですが、何を渡せばいいんですか? 具体的にはjava.awt.Graphics2Dのclip(null)ですが。
setClip(null)だとうまくいったので、ライブラリのバグっぽいです。
>>975 タプルと引数リストが互換になると見通しはよくなると思うが、何か技術的困難があるのかしら。
case は我慢できても、無名変数 _ がかっこのなかで使えないのは我慢ならない
>>985 タプルと引数リストの変換は3.0かどっかで入るんじゃなかったか
>>987 昨日のおだちゃんdayでもそんなこと言ってなかったけど?
>>988 ごめ、違ったっぽい。スルーしてください
去年のScalaDaysで話されたロードマップにはあったよ
JVM版C++って解釈であってる?
どこを見たらそんな解釈になるか教えてほしい
たしかに、メタプロできると見せかけて、実際は(凡人の)生産性を下げるところとかは似てるかも・・・。
更に阿呆な感想かよ
JavaからScalaになって生産性下がるやつは首にしてもいいレベル
Java(C)に対する後方互換性があるマルチパラダイム言語がScala(C++) って意味では合ってるんじゃないの?
C++がいかに嫌われてるかよくわかるな 誰も誉め言葉として受け取らないw
>>997 それはC++のC互換性維持の努力を侮りすぎじゃ
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。