・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とC++って互換性低いぞ…
は?
なんでAkka 1.1で永続化消えたの?
Javaが遅いっていつの話よ
Netscape Navigatorで「Javaを起動しています」に待たされた人たちが作った伝説が ずーっと一人歩きしてただけ。
今でもJVMの起動にイライラさせられてますけど?
PC買い替えた方がいいんじゃね?
ベンチマークの話をしてるのに、JVMの起動がどうとか言いだす男の人って
>>7 Apple 製品でよく使われているイメージ
Mac にも標準で含まれているし、OpenGL の最適化や
iPhone SDK, MacRuby などで採用しているらしい
あとは Google の NaCl も LLVM なんだっけか
スーパーなコンパイラっていうのがあるらしい
>>16 しかしフレームワークとしての素性や周辺ツールとの親和性は置いといて
生成するx86バイナリの質だけみるとICCには及ばないし、gccやhotspotと
比べても微妙なところっぽい
LLVMはJVMを除いたVM系ではダントツに速い、 ただしgcc等に比べるとまだまともな最適化は行われてない。 その上llvm-gccはお亡くなりになってしまった。
お亡くなりになったというか、もう必要なくなっただけでしょ。
「スカラ」って、ラテン語で「階段」って意味なんだね。 それであのロゴマークか。
コップ本以来ようやくまともに読める本が出そうだな
おお〜来週か。買うぜ キンドルで読めると幸せなんだがなあ・・・
Scalaではじめるプログラミング ―「Java」「.NET」のソフト資産を生かして開発を効率化! (I/O BOOKS) 赤間 世紀 (著) というのも6月発売だが、、、、 中身をみなくても、中身が想像できちゃうのがなんとも。。
俺もiPadで見たいんだが。そういうのは秀和はやらないだろうか。
>>21 ・概要編
1章 Scalaの概要
2章 文法・構文・言語としてサポートする機能
3章 関数型プログラミング
4章 他言語との比較、関連
・実践編
5章 開発環境
6章 Webフレームワークを利用してアプリケーションを作成してみる
7章 デザインパターンとScala
8章 現場でのScala
9章 Javaとの連携
10章 特徴的なライブラリ
・付録:標準API簡易リファレンス
だって。
こういう実践的な本がでることで、現場への採用がすすむと良いなあ。
まだAmazonない
どっちかっていうとF#が持つ表現力と美しさ が業務開発で魅力的だろうね。 Scalaは採用されないと思うね
>>28 美しさならHaskellやSchemeが一番だろ。
美しいだけでは業務開発で使われない。ScalaはベターJavaとして業務開発では
ますます注目されるんじゃないかな。
Javaがずっと主要言語であり続けることはないだろうし。
>>29 > Javaがずっと主要言語であり続けることはないだろうし。
いや、FORTRAN, COBOL, C並に長生きすることはもう間違いない。
Javaは、JVMにとってのCとして生き続ける。
でもJavaって自由度あんまし高くないから、基盤として使い勝手良くない気がするんだけどな… (ex.Friendクラスが無い) 安全性が高いのはいい事だと思うけど。
馬鹿も生きていくためには必要なんですね
>>30 , 31
確かにjavaが無くなることはないと思う。しかし主要言語ではなくなるだろう。
新しいプログラマがいつでも使い続けるような言語でもない。
そうなるには最低でも10年はかかるかと。
>>35 oracleの出方によっちゃ10年ももたない気がする
とりあえず代わりがないんだもん Monoがブームにでもなれば別だが
>>38 monoのコア開発者の移籍先のXamarinも、Unity3Dと同じスマートフォン開発中心に進めてるから、
.net4.0でしばらくペンディングかなあ
>>39-41 3回も貼らんでええがな…。
いや面白かった。
確かにあるなー、そういうの。
まだScalaそんなに扱ってないから(他言語もそんなに知らないし)そういう所に意識が回らなかったけど、
あるある。
いくつかは今後改善出来る所だと思うから、そういう所はどんどん出てくるといいよね。
>>39 >forのネスト
>for(i <- 0 to 10; j <- 0 to 10; k <- 0 to 10) {
>ループが一つなのか、三つなのか、ぱっと見で分からない。必要だったのか?
これは三次元ループが一つでしょう。
for文をif文とgoto文に置き換えずにそのままの形で理解すべきであるように
これも三重の一次元ループに置き換えずに理解すべきだと思います。
45 :
デフォルトの名無しさん :2011/06/12(日) 00:13:04.08
Perl や Tcl は普及してるな csh も大抵の環境で使える
F#は普及するね
見てみたら、もう先に水島氏がガッツリ反論してるから言うことない
そうね。 指摘されてから、知ってるけどあえて書いてるって…
しかしいつも思うんだが ミズシマさんはネット上のコミュニケーションが上手ではないですねえ…
たしかに。 絡まれた方は誰一人有益な議論だったとは思ってないんじゃないかと。 matzさんしかりkなんとかさんしかり。
forの誤解は結構多いのかな Haskellのdoをforと呼ぶというのはなるほどと思ったのだが まあ、forの中の構文が特殊というのは当たってるな というかLispのloopをはじめ、内包表記にありがちなことなんだが
ええ?いい人じゃん、面識はないけどさ あんなに真面目に議論する人なかなかいないと思うよ
自分のわかっていることでも、あそこまで書けないよね、面倒で。
俺なら2chのどこかにRubyistってほんとに頭の悪いクズが多いなって書いて終わりだわw
Rubistじゃないんだね。Rubyist Magazineとか。
>>54 議論が目指してる方向についての認識が双方で一致してるんならね。
自分があんな絡まれ方したらもっと早いタイミングでブチ切れてるわ。
過去の人たちもそうだけど、よくあんな紳士的な態度で付き合ってるよな。
そういう人は最初からコメント閉じてるんじゃないの? 何を期待してコメント書き込めるようにしてるの?
>>56 そっちの方が双方の時間を浪費しないぶんましだが、
Smalltalkって思いきり書いてるぞ…
確かに大人な人間ならいつかのmatzとか今回のkaminamiみたいな 明らかにScalaに悪意のある人間には何を言っても無駄だとわかるから何も言わない でもそこでちゃんと言うほうがえらいじゃん 最近のTwitterのScala TLとか気持ち悪いわ Scalaが複雑かどうかとかさ 普及のためには関数型のアピールやめろとかさ バカに媚び売る必要なんてないよ 頭の悪いやつはどんどん置いていけ
あえてこのスレにも書きます。今回の件に関しては反論の仕方が挑発的であり、大人げ無かったとは 自覚しています。それについては、批判されても仕方無いでしょう(実際、Twitterで、自分の言葉の 選び方に関して批判的なTweetがありますし)。それ以上の部分はここで書いても陰口 と取られかねないでしょうから、そこはTwitterなりブログなりで、隠さずに書きます。
自分にとって今まで勉強してきた言語のなかでScalaは圧倒的に覚えにくい。 何でだろう? 省略してよかったり良くなかったり規則性が見つけにくいとかかな? タプルとか優先順位なのかグルーピングなのか...
今までどんな言語を学習してきたんだよ
学習中の人間の認識なんて中途半端なもんだろう それをもって「覚えにくい言語である証明」って言うのは飛躍じゃないか? その線でいくなら(できるだけ公平な基準で)他の言語の学習曲線と Scalaの学習曲線を比較しなきゃ
自分が理解できないから言語が難しいという論法はもういいよ
どなたか教えて欲しいのだけど、 これからscala始めるのにコップ本でも 2.9との差異に困ったりしない? それとも2.9対応本が出るまで待つべき?
2.9は並列コレクション以外は2.8と大して変わってないから気にしなくていいよ まあコップ本は2.7なんだけど 2.7と2.8はコレクションライブラリが総取っ替えのレベルで変わってるからなあ でも言語の基本的な部分はあまり変わってないからコップ本は今でも十分に参考になる
今でもScalaを一番効率良く学ぶ方法はコップ本をキッチリ読むことだと思う
>>70 久々にコップ本で技術書をキッチリ読んだ俺に言わせると、他の方法は必要だと思うよ。。
>>44 「どう動作するか」と、「何を記述したいか」の違いだねぇ。
もちろん、プログラマとしては前者も理解しておくべきだが、
後者の方が簡潔で本質的な記述ができるのも事実。
そうかな、でも一番効率はいいと思うんだよねー ここがへんだよの人も読んだのがコップ本ならもうちょっとましなエントリ書けたと思うし
ほとんどの本が並列計算まで扱ってるから難しくて当たり前。
>>73 何のかんので、読破にすごい時間かかったからなぁ。
一見さんを引っ張り込むには、言語のエッセンスを端的に伝えられる、もっと薄い本が必要。
その意味で関数脳本は悪くなかった。
インスタンス生成の記法として、newとobjectのapplyが混在しているのは見通しが悪い、 というのはああそうかもな、という感じはする。 まぁでも、「objectのapplyメソッドを使うとこんなことができます」という説明の問題か。
あと、ラムダ式のプレースホルダの問題については同意見だなぁ。 "ACBED".sortWith(_1 > _2) みたいな書き方はできるようにして欲しい。
C++の式テンプレートか あれは最初から意図したものじゃなくて、 仕様作成後に発見されたというのが凄すぎる。 よくあんな仕様作れたな。
水島さんのコメントまで辿り着いた。 まぁ、内容はともかく、キレちゃだめだよ。 自分が入れ込んでる言語をハンパな知識で貶されて気分が悪いのは分かるけど、 それをScalaに何の思い入れもない人間が見たら、ということは考えた方がいい。 (あと、水島さんにだけ言ってるんじゃないよ、と一応)
批判するってことは、少なくともその言語に対して関心を持っているわけだから、 うまいこと誤解を解きほぐせば、支持者に変わってくれる可能性もあるわけだ。 Javaに異なるパラダイムを持ち込んでいるのがScalaなのだから、 誤解が生まれる事自体は受け入れるしかない。 そこを橋渡しできるドキュメントや人間がいるか、こそが問題。 まぁ、うまいことやろうぜ、ということです。皆さん。
Scalaはライブラリも含めて面白い言語だし、いい設計も随分あると思うが、
普及してくれるといいとかそういう気持ちは全くないな、俺は。
>>79 の言うような書き込みもしたことはないが。
主観的な意見ですが、Scalaの学習曲線自体はさほど急ではないと思います。 ただ、教え方というか、現状Web上にあるScalaチュートリアルとかがイマイチ 学習向けじゃなくて、それで小難しく感じられているというのはあると思います。 実際の所、Better Javaの部分だけ取り出してScalaを教えるのなら、Javaを 教えるのと比べて、staticって何よ、とか、プリミティブと参照型の違い、参照型で 値の比較に==使っちゃダメ、とかそういったこまごまとして事を教えなくていい分 楽な気がします。
結論としてScala禁止でいいんじゃないか? 日本人に理解困難な言語を輸入しても悪影響しかでないよね?
>>79 ご忠告ありがとうございます。コメントの書き方については自覚的に挑発的に書いたので
あって、さほどキレていたわけではないです。
実際の所、ああいう書き方をしたのは、あのブログエントリがTwitterでのやり取りの
続きであると考えていたからなのですが、ブログを読む多くの人はTwitterでのやり取りは
見ていない、ということは失念していました。
>>82 んだ。
というわけで期待してますよー(人任せ。
はぁ? てめぇが理解できないもんは他人にも理解できるはずがないとか思う超ド級のバカか?
そもそもの問題はJava依存した言語だってこと これを改めない限り1つの言語として認知されない
ほとんどの言語処理系がCやC++に依存しているが? 一部の言語処理系では他言語は古い世代でのブートストラップにしか利用してないが。
いや違うな、Javaに媚売った仕様が反感買ってるのか
>>89 主語は明確にしよう。
何度も言われてるが、JVM言語である以上の限界はあるわな。
その分、ライブラリとか開発環境とか、メリットも大きいわけだが。
まぁ、今の言語の大半が、X86処理系の限界に縛られているのとそう変わらん。
>>87 そもそもの問題は
そんな話してないのに、そっちに話持っていこうとすることだろ…
結局Javaを知らないと書けないから複雑、マルチパラダイムだから複雑 これはいいんだよ、完全に事実だから だからJavaと関数型を勉強してから来いよ LLしか知らないようなやつがいきなり理解できるわけねーんだよ
Rubyは勉強しないといけないなぁ、とは思っている。 プログラマとして上を目指すなら、色々な言語を知っておいて損はない。 それと、初心者に門戸を広げるというのはまた話が別だけどね。
94 :
デフォルトの名無しさん :2011/06/12(日) 12:50:02.02
勉強したくないからRubyやってるんだろ
いやまてまてRubyはRubyで色々勉強しなきゃいかんし というか抗争を煽ろうとしてる人間がスレに混じってるようで嫌だな
97 :
デフォルトの名無しさん :2011/06/12(日) 12:57:32.95
最近の言語バトル的盛り上がりはいいねー。 ガンガンdisられてこそ伸びるだろう
プログラミング言語に愛を持っていて、まともな指摘のあるdisならね…。 歴史の浅い学問でまだ発展途上なんだから、 現在存在する全ての言語は後に置き換えられるべき通過点に過ぎないと考えるべき。 どうのつるぎみたいな。
>>96 CTMCPは衝撃だった
マルチパラダイムであっても核言語を整理すれば
あそこまで簡潔になるんだなあと
じゃあScalaはっていう話になるが、どうしても複雑だという印象を拭えない
Ozとの違いでいくと、静的型付けって所が影響してるのかなあ?
歴史の浅い学問でまだ発展途上?
Scalaがまずすべきことは
>>39 みたいな人を追い出すことだと思う。
C#みたいに(またはVB.NETみたいに)
LINQすら読めないのにC#得意ですと言いだす人間ばっかりの言語なんていやだ。
排他的になってもライブラリや対応環境は増えないけどな。
I/Oライブラリ無い時点で終わってる
別に追い出せとは思わないが 入ってくる気がないからああいうこと書くんだろうし
Scalaについてどう思う? 好き 1% 嫌い 1% なにそれ? 98% みみちい争いは空しい
106 :
デフォルトの名無しさん :2011/06/12(日) 13:40:16.50
>>88 例外発生時にJavaのエクセプション出す依存っぷりは、
同列に語れないレベル。
Scalaの知名度って低いよな この間クラスの女子に「Scalaって知ってる?」って聞いたら 「は?誰おまえ?」って言われたよ 一般的にはその程度の知名度
>>88 ScalaがVMをきちんと開発しないかぎり
永遠に同列にならない
神は言っている グダグダ言ってないで手を動かせと
>>96 つーかOzってCTMCPを読むための言語ってイメージだが
それならCTMCPを読めばええやんって話だから誰も翻訳しないんじゃね
なんでVMを自前で持つ必要があるんだ 意味わからん
Haskellみたいに他と激しく違いすぎる言語だと、VM(抽象機械と言ってるけど)も 専用に設計されたものだったりするが。
>>112 そしてライブラリが無くて普及しない地獄が始まる。
>>110 Scheme(SICP)は沢山入門文書があるのにね…。
原文読めよって話になるんだろうけど、それを嫌がる人にもCTMCPに触れてもらいたいのよ。
800P超える本に手を出す人が英語読むの億劫、ってのもレアケースかもだけど、
日本語文書で概要掴んで好きな所だけつまみ食いをもっと気軽に出来るようにしてほしいなって思って。
技術英単語にもっと明るくて時間があるなら、俺がやってもいいけどさ
Sっcala菅
>>107 Scalaについてどう思う?
好き 0%
嫌い 0%
は?誰おまえ? 100%
>>97 あの程度でdisだとかFUDだとか、被害妄想も甚だしい
FUDにもなってないわ 書いてる本人が自分で間違いに気づいてないんだから
少なくとも、初学者へ正確な知識を体系的に伝えるためのドキュメントが まだまだ未整備なのは事実だし、それは何とかしないといけない。 「お前の意見は間違いだ」といっても、間違った理解をする人間の方が多いなら、 それが言語に対する評価になってしまうわけで。
紛らわしい言語仕様が原因なのか?
なめられてんだよ Haskellならそんな難癖つけてくるやつはいない Scalaなら俺にもできそう → うわイミフ → 言語が複雑すぎるから悪い この流れ
地方だが、帰りに書店に寄ってみるか
ないな
C,C++,Delphi,Ruby,Java,JavaScript,VisualBasic,FamilyBasic,PockeconBasic,MASM,PICASM,VHDL,SystemC,SystemVerilog, Matlab,Scilab,R,Maxima,BSH,CSH とかいろいろな言語やってきた(やらされてきた)が、言語disっている暇なんてないぞ。 言語そのものに対する不満とか、言い始めたらきりがない。 職場のコーディングルールに従わなければいけない縛りの方が理不尽だ。 言語のバージョンが上がっても、職場では何世代も前のバージョンしか使えないとか。 Scalaをすべての人に使わせようと思ったら、コーディングルールで縛りを設けるべきだな。 C、C++とかは一時期「変数名はシステムハンガリアン以外認めない!」みたいな時期があったけど、 Scalaにもそういう時期は必要だな。「プレースホルダー使うときはコメントで説明がないとNG」、みたいな。 個人的には、Scalaはまだ発展途上なところが楽しみな言語である。 どんどん要望だそうぜ!
微妙な言語ばっかだな、おい
>>125 > PockeconBasic
disってんじゃんYO!
いくつか言語を知ると、今度は言語に必要な要件とか、どんな条件を満たすセットで定義できるんだろうとか、そっちに興味行かないかい? 自分はProgramming Language Pragmaticsを読んでるところ。って、Scalaの話じゃないなw
>>126 ハードウェア屋の人には多そうな取り合わせじゃね?
>某所の まぁ、そんくらいにしといた方がいいよ。 批判者をコテンパンに論破しても、別にScalaの普及には繋がらないんだしさ。 筆頭の論客は、どっしり構えるくらいでいた方がいい。
>>131 おそらく自分の事かと思いますが、ご忠告、痛みいります。おっしゃる通り、論破しても無益ですし、
むなしいだけですね。というのを、反論書いてから実感しました。これからは、議論の方に時間を割くより、
Scala日本語情報サイトのコンテンツ充実の方に時間を割いて行こうと思います。
>>133 いや、あれが無益かどうかは読み手によるんじゃ。
少なくとも自分にとってはScalaへの理解について、曖昧にしてあった部分が少しわかったし。
他言語との対比があるんなら見たいかも
エバンジェリスト なんだったらその自覚をもった対応をしたほうがいいよ。
scalaコミュってまだ未成熟で子供と言う印象を与える原因になってるから。
誰を見本にしろというのはあまりいいたくないけど、schemeやlisp方面での
shiroさんから態度を学んでいったらいいんじゃないか?と思うよ。
scalaが他の関数言語より難しくなりやすいのってJavaの人々を取り込もうと
する仕様にあるように思うよ。オブジェクト指向と関数言語というのを
合わせようとする発想はいいんだけど、それがかえって難しくしているところ
がある。せめてCLOSやRのようなゆるいオブジェクト指向の仕様なら第三者か
ら見てわかりにくい概念が山ほど出てくるというのは少しは避けられたかも
ね。もとが複雑な言語を拡張して自由度を増やそうとした場合更に複雑な仕様になるのは自明の理なんだから、scalaが難しいということで怪気炎を上げる
ような行動は褒められたものではないよ。それより
>>131 さんの忠告を心から
理解することが大切じゃなかろうかね?
Java に対する Scala の立ち位置って COBOL に対する PL/1 に似ている。
141 :
131 :2011/06/13(月) 08:08:46.95
>>138 まぁ、きつい言い方をするとそういう事になるね。
「易しい」「難しい」「使いやすい」「使いにくい」なんてのは、
技術的に白黒つけられる類の議論ではないのだから、どうしても不毛になりがち。
それよりは、分かりやすい日本語ドキュメントを整備して、
「よく理解できる」という声を増やす事に注力した方が、結果的には実利にも適っている。
ともあれ、これからの仕事にも期待しているのでがんばって下さい。
正直、松本が「最悪手」って言ってるものはrubyの日常だろって思う。
基地外乙
>>142 matzが最悪手なんて言ってたっけ? ググってもよくわからん。
技術の話より政治の話のほうが盛り上がるな
いやいや今回の水島氏を攻めてるやつは何様なの? shiroみたいになれって? 自分のこと棚に上げて口だけなら何とでも言えるわな 向こうが屁理屈を並べたら理屈できっちり返さなきゃいかんだろ それもできない連中はしょぼいコミュニティだと思うよ プログラムを書くにはプログラミング言語の仕様を熟知しないといけないということをわかってないやつが多すぎる 今回の話についていけないようなやつはJavaやC#の仕様をちゃんとわかって書いてるのかね 細部を突ついたら似たような話になると思うけど
>>146 率直に言って、仕様を熟知している人というのはごく一部ですよ。
それを踏まえて、いろんなことを言う人がいる。
shiroさんの名前を出したのは、彼もいろんな事で反論や説明は
良くしているけど、その立ち回りは大変上手だよ。だから見本になるだろう
といってる。
今回のことを見てて大変まずいのは、反論をするにしても一見丁寧に対応し
てるように見えつつも、技術的なことも書きながら、相手をなじるような記
述が度々見られる点かな。これでは、議論をする人も適当にあしらってさっ
さと関わらないという行動をとるだろう。つまり、論者としては二流ってこ
とさ。
ちょっと考えれば分かるだろうけど、相手にしてみればこれほどめんどく
さいと思うことはないよ。それに加えて、やや粘着な傾向も見られる点が
きがかりだね。
具体的に言うと >、kaminamiさんは、Scalaにおける基本ルールを中途半端にしか理解されて いません。そのせいで、特例で無い事も特例としてとらえてしまっているの でしょう(中には的を射た指摘もありますが)。以下、一つ一つ説明していき ます。 とあるけど、上手な論者ならば、中途半端に理解されていないというところ をオブラートに包むか、具体的な説明で暗にそれを示すかといったストレー トにやらない方法をとるもんだ。言い回しを少し注意するだけでもずいぶん 違うと思うよ。 かなりきつい記述も含めたけど、このほうがこの人にはいいのかなと思って 書いてるけど、こうゆう書き方も反発はくらいやすいのは理解してる。133さん がいってるようにきついですよ。
気質っつーのはどうにもならんもんだし、うるさがたタイプ(たとえばRuby界隈だと mput氏)みたいな存在もそれはそれで有用ではある。 まぁ問題は懐かしのJavaHouseみたいに、その言語自体に対する評価において、 人に対する印象が先行しちゃう、ということだけど、それで言語に対する評価を 誤る奴なんてのは所詮そういうレベル、という見方もある。 hyuki氏やMatz氏のようにふるまえ、ってのを誰にも要求するのは無茶ってもんだと 俺は思うけどね。
shiroに比べて2流って、ジョブズみたいな経営者になれ的な戯言にしか見えんわ そりゃ処理系を作ってる日本の第一人者という言葉の重みがあれば、 説得力はまるで違うと思うよ それと同じ次元で比較してるお前は何様なんだよって話だよ matzと今回のkaminamiに共通するのは、動的オブジェクト指向言語の信奉者であり、 静的型や関数型に対して理解する気がない、 それなのに主観的な次元で良し悪しを論じているということ Scala固有の話ではなく、静的型や関数型に対する偏見がまず先にある 要するに不毛だとわかってる宗教戦争を仕掛けてるのは向こう まずは向こうが攻められるべき
foreachがあればfor式はいらないとか言ってるのがウケたけど コップ本は1章割いてforの説明してるけど他で勉強するとこの程度の理解になっちゃうのかな
責めるとか責められるとかどうでもいいよ。 Scala勉強したいな、って思った人が勉強しやすい環境を提供してあげるのが最優先じゃないかな? それが出来た段階でScalaを知らない人に訴求していく。 「あいつは分かってない!俺が論破してやる!」これじゃ何も得るものが無いよ。
Schemeは有名だけど仕事に本気で導入を考えているやつは少ないだろ。 だいたいが好きで使ってるようなやつだけだ。 Scalaはよくも悪くも、いろんなやつから注目されつつあるっていうだけ なんじゃないかな。水島氏はそういう相手でもまじめに対応しててまぁ がんばりやさんだと思うよ。
154 :
デフォルトの名無しさん :2011/06/13(月) 13:50:40.03
Scalaにも PerlのCPANみたいなのがあるといいなぁ。 Rubyのgemみたいなのがあるといいなぁ。 とプロフェッショナルな人達は思わないのかな ^^;
155 :
ゆるよろ :2011/06/13(月) 14:01:55.47
maven-repositoryがあるけど分散してるし mavenは滅びてもいいけど、maven-repositoryが滅びると現実的には困るんだが perlやrubyやpythonや他の言語にある、「ここで調べれば欲しいもの出てくる」的な セントラルリポジトリは、Javaのころから憧れていた理想郷
>>146 お前どういうtweetから始まったか見てねーだろ。
>>155 CPANが「理想郷」だって?
「夢の島」と言うのならまだ分かるが。
まずは各々がブログなりなんなりで、 「Scalaでファイルの入出力」とかレベルの記事を書いていくのが簡単で良いんじゃない? それらを纏めるのは後からでも出来るんだし。 情報が分散して云々で何も進まないよりは生産的だと思う。
オダスキー文書やAkkaのドキュメント訳してくれたほうがありがたい
ぷセーフ
>>150 (=146?)
反論はありがたいけど、まずはお茶でも飲んで落ち着いたほうがいいんじゃないか?あまりにも狭くなってる印象がある。
この状態なら他言語やっていてScalaに興味を持ったとしてもやりたがらない
事になりかねないぞ。実際にgoogleで"Scala 怖い"でリアルタイム検索してみ
てはどう? 潜在的に何倍になってるかわからないが。b.hatenaのコメントも
よく読んだほうがいい。それが今回の騒ぎでScalaってどんな言語なのか?と
いう印象を持たれたかよく分かるだろうよ。
すぐに、二分化しちゃう思考って、考える能力を衰えさせるものだ。あまり、
敵味方みたいな発想にならないようにしたほうがいいと思うね。
そもそも、Scalaの感想を書かれたからといって、関数型への冒涜みたいな
捉え方はどうかと思うよ。
すぐそういう反応をしたがるはてなブクマーみたいな層を相手に右往左往するのもどうかと思うが
163 :
≠161 :2011/06/13(月) 19:30:34.76
>>162 「あいつらは愚かだから無視して良い」というのも二元論的思考だけどね。
今回のことが決定的だとは思わないけど、あまり何回もこういう事が起こるのはよろしくないと思うよ。
だからそういう空気読めみたいなことが気持ち悪いって言ってんの これでScala怖いなんて言っている連中はプログラミングをなめてる これだけ材料を与えられてるのに話の真偽を見極められずに、 態度とか口調とかで物事を判断しようとする連中がエンジニアなのかと思うと泣けてくるね
理論的背景で語ることが世の中に蔓延している風潮なら、 主観で語ることが重要だと言うことはアンチテーゼになるが プログラミング言語を巡るほとんどの言説が感覚的なのに、 主観が重要だとあらためて言う意味はあんの?
>>164 俺も含めて、大半の人間は、個別の論争の是非を精査してるほど暇ではないんだよ。
もっと抽象的な言い方をするなら、自分以外の人間に、何かに対して自分と同じだけの
コミットメントを要求するのは良い態度とは言えない。
特に、ネット上の発言は、何かに対して責任を負って為されるものではない以上、なおさらね。
一人一人の人間が、何かに興味を持っていたり、持っていなかったりすることは
当然のことなのだから受け入れるべきだし、
それこそが相手の人格を尊重するということだ、と俺は思うよ。
>>166 当たり前だけど、そのプログラマのマインドセットと一致しない記述体系を強制しても不幸になるだけだからな。
で、新しいマインドセットを広めたいと思ってる我々の側としては、彼にそのメリットを「布教」するところから始めなけりゃならない。
そこで「悔い改めよ!」とか言って説伏させようとしても、周りから眺めてるだけの第三者にしてみれば「何あの人怖い」になるのは
避けられない。
つまり、うまくやろうぜ、ってことですよ。
我々の目的は、抗争での勝利ではなく、ハッピーなプログラミングライフでしょ?
>>164 松本さんが最悪手だと発言してる真意もたぶん理解できないのではないか?
たぶん、松本=極悪のボスキャラという捉え方なのだろうよ?
コミュニケーションの問題を書いてるんだけど。異文化の人たちと会話を
成り立たそうとすれば、どんなことがあっても誤解などは当然あるよ。
それでも、話し合いが成り立つ人たちとそうではない人たちが世の中に
いるけど、後者にはならずに、考え方が違っても信頼関係が生まれる工
夫をした話し合いをしろよって事。殺伐として、対外的に強硬な態度を
とるのがよしとするコミュニティにするのが理想ならばそうすればよいが
その代償は高くつくことは覚悟したほうがいいよ。
要するにコミュニケーションにも頭を使えってこと。
言語の中身と関係なく水島氏の口調が怖いから Scala使わないと考える程度の連中に対しては 無視するのが正しいコミュニケーションだと思うけど matzの静的型ディスは前科があるから言ってることなので ボスキャラというか、言語開発者なのによく自分から宗教戦争起こすなと思っただけで あと、これは半分冗談だけど、別に今回の件が最悪手だとは思わない 『Scala実践プログラミング』のいい宣伝になってんじゃないの kaminami氏に献本すればいいと思う 受け取るかどうかは知らんけどw
>>170 が、日本のScalaコミュニティを、顔見知りだけの「エリート」集団にしたいと
思っているのだとしたら、俺は全く賛同できない。
このオープンソース時代に、周囲から孤立したエリートなんか目指しても、
すぐに行き詰まってしまうのは目に見えている。
「俺はエリートの一人だ、愚かな奴らとは違う」という自己満足しか残らんよ。
水島さんの口調が怖いと思う人は、レベルの低い技術者ということになるの? エンジニアなら、技術的な真偽以外は気にしないとでも思ってるのかな。
松本は正しさで論破して打ちのめすのは逆向きマーケティングで最悪手だと言っているんだろ? けど、俺にはRubyの方がその手のことをやっちゃう武闘派()が多いと思うんだよな。 自分の家で出来てないことを、別の家の子供に説教してる大人もどうかと思うよ。
>>173 他人の愚行を、自分達が真似る必要なんか無いじゃない。
俺達は、俺達だ。
やめて! 私のために、争いなんてやめて!! 技術的な話題には、ほとんど食いつかないのに、 政治的な話になると、食いつきすぎです! 組み込み系にC++が導入された初期のころ、 コーディングルールに、「継承はなるべくしない。」とかあったよ。 Scalaも最初のうちは、↑こういう時期が必要だろうと思う。
さすがにそろそろ飽きてきたなw まず大前提として、はてブも2chも言語の趨勢には 全く影響がないということが意識として共有できてない気がするがw だからちょっと暴論っぽく書いてるわけだし だいたいジョブズやストールマンみたいな奇人変人が跋扈してる世界で、 なにみみっちいこと言ってんだとしか言いようがない まあ、程度の低い意見は無視するのが正しいというのは間違いないが、 それに対して熱り立って反論するのも別に悪いことじゃないという話 それでもう俺からは終わりにします
奇人変人で許されるのは彼らが天才だからであって、 そうでない凡人は他人とわざわざ波風立てないようにコミュニーケション力をつけろってことだな。
そういう話はマ板でやれよ。 レス皆無のほうがまだまし。
あーうざいうざい 誰がどーしたあーだこーだって お前らはてな民(笑)かよ きもちわりい まじきもちわりい 誰がどうしたって? 知らねえよそんな奴www あーきもいきもい 芸能ニュースにかじりつくババァを見てるみたいだ
今日のscalaスレは、ム板のスレのなかで断トツ一位できもちわるい
ゆろよろさん流石っす
みんなLiftの作者が書いたScala本はスルーなの?あんまり話題に上がらないみたいだけど... 俺は今それで勉強してる。
SS本のこと? いい本だと思うよ。
誰か新刊買えたやついる?
185 :
デフォルトの名無しさん :2011/06/13(月) 21:51:17.01
今度はmatz vs kmizuかよ
SS本は応用寄りだから最初の一冊には向いてないかも
俺はwebフレームワーク系全く興味ないから読んでない。 Liftにも全く触れてない。
そうしてる間にLiftにオワコンの気配が…
Tomcat でJavaの資産と共存できるかどうかしか興味ない
192 :
デフォルトの名無しさん :2011/06/13(月) 22:31:11.15
liftは最近斜め上の方向へいってるからなぁ
3者とも本売るために相撲みたいな八百長やってるだけだぞ 裏じゃ3人仲良しこよしだぞ?
>>136 >>138 丁寧な忠告、ありがとうございます。実際の所、元々私は単なるScala好きであり、
Scalaエバンジェリスト(笑)という状態だったのですが、本当にScalaエヴァンジェリスト
であろうとするなら、おっしゃるとおり、態度を改めるべきだと思います。shiroさんは
技術的にも凄いだけでなく、やわらかい言い方で、人を説得するのが非常に上手な
ので、その点は見習いたいですね。
ちょっと長くなるので、複数レスに分割します。
モナドは象()だって、for文の解説でもあったのね。 初めてよんだ。(翻訳ありがとう)
> もとが複雑な言語を拡張して自由度を増やそうとした場合更に複雑な仕様になるのは自明の理なんだから、scalaが難しいということで怪気炎を上げる
>ような行動は褒められたものではないよ。
端的に言って、これは間違いです。まず、ScalaはJavaのad hocな仕様をいくつも削っています。たとえば、プリミティブ型、static, break, continue,などなど。
その上で、関数型とオブジェクト指向を統合するために必要な仕様がScalaに付け加えられました。ですから、更に複雑になるのは自明の理ではありません。
これは、別に論破したいわけではなくて、Scalaはそういう言語ではないよ、という話です。
> それより
>>131 さんの忠告を心から理解することが大切じゃなかろうかね?
心に刻んでおきます。
関数型を統合なんて言い方はおかしいよ。 関数型言語で特徴的だった機能の一部を取り込んでいるだけ。
あんまり問題起こすなら 削除依頼出すよ?
F#のSeq C#のyield for みたいな機能ってScalaにありますか?
>>196 横レスですが、あなたはずれています。
>>65 のまつもとさんのtweetが食い違いを明確に指摘しているのに
どうして「言語(ルール)の複雑さ」の話を続けるのでしょうか。
JavaやC++がオブジェクト指向という新しい概念が増えたために
それ以前の手続き型言語より覚えにくくなったように、
Scalaが関数型の概念という新しい概念が増えたために
Javaより覚えにくくなりました。
ad hocな仕様が削られて暗記量が減った事による覚えやすさは
新しい概念の理解が必要な事による覚えにくさと釣り合いません。
ですからScalaを覚えようとする人にとって
ScalaがJavaより複雑で難しい言語なのは自明の理です。
関数型が加わっているから複雑になるのは自明って、 それこそそんな自明な話は誰もしてないんじゃね
>>202 新しい概念を使って「構文要素をシンプルに」しているんだから、
手続き的なパラダイムにのみ親しんでいる者の視点から見れば「複雑」に見えるってことでしょ。
「プリミティブ型、static, break, continue」みたいなのは、それが以下にad hocな仕様であろうと、
広く知られている既存のC/C++的な概念に含まれてるから、学習コストはゼロで済む。
しかし、関数型パラダイムは、たとえそれがシンプルな記述を実現するものであっても、学習コストを払う必要がある。
楽園に辿り着くには、乗り越えなければならない壁があるわけで、それを無視した議論をしてもあまり意味はない。
だからこそ、関数脳本みたいな「新しいパラダイムへの導入」を目的とした書籍の役割が重要になる。
#今度の新しい本も、Scalaプログラマとしてのレベルアップという意味ではとても期待してるけどね。
だからこいつらごちゃごちゃ言ってるけど 結局単に関数型がわからないだけだろってのは 俺も最初からそう思ってるけど とか書いてたら「Scalaはオブジェクト指向言語です」か 真面目だなあ
>>198 そのページ、超役立つよね。
口論する暇があったら、こういう仕事をするべき。
>>193 炎上マーケティングという奴ですね。流行りの。
「オブジェクト指向プログラミングとは何か」論争みたいなもので、Smalltalk由来の メッセージパラダイムを実現している言語が真のオブジェクト指向言語だ云々、 みたいな話に、実利的な意味があまりないのと似ている。 俺達は、要件をよりシンプルでかつメンテナンスしやすい方法でコードに落とすために、 オブジェクト指向のパラダイムを活用しているわけで、理論的な美しさや構文要素の 完成度みたいなものために使っているわけではない。 例えば、時々Javaのinterfaceを「盲腸的な仕様」だと看做す議論がなされることがあるが、 「インタフェースを決める」という作業の重要性を考えれば、 構文要素の追加を遥かに上回るメリットを持った仕様であることは、容易に理解できるだろう。 俺達は、『手続き・分岐・ループの三要素のみで理解できる言語が「シンプル」で 「実用的」な言語だ』という世の中の趨勢に対して、布教活動をしなければならないわけだ。 それをやるためには、「関数型のパラダイムで記述すると、あの面倒な記述が、 これだけシンプルでメンテしやすいものに変わるんだよ」というところを地道に見せていくしかない、と俺は思う。
赤間世紀って一冊も読んだことないけど、とんでもない量の本書いてるな
確かに。何冊あるんだよw。
>>208 真のオブジェクト指向言語が何かというのは非常に重要な話だと思うよ
個別の言語を越えたパラダイムの世界があって、
優れた言語というのはまずそのパラダイムを過不足なく実装していなくちゃいけない
言語の流行り廃りに比べて、パラダイムというのは長いスパンの寿命を持っているし、
有用性、弱点も広く知られている
これに沿うことは目先の主観的な判断より上回るメリットが得られる
matzが口ではどう言っても、Rubyなんかは真のオブジェクト指向にめちゃくちゃ拘ってるでしょ
彼の静的型嫌いは本質的に動的でないと真のオブジェクト指向とは言えないという
原理主義的な背景があると思う
個人的な感想だけど、その点において、Scalaは
オブジェクト指向としても、関数型言語としても筋がいい
Javaの機能拡張で、かつ、プリミティブがないから静的型オブジェクト指向としては問題ない
関数型言語としては、型推論がHindley-Milner式ではないから違和感を感じる人はいると思うけど
機能としては一通りある
パラダイムを知っている人間なら、Scalaの機能が
どのパラダイムの機能なのかピンとくるようにできている
それを何もわかってないやつがごちゃごちゃとまあ(以下略)
>>212 パラダイムを知っている人間なら、Scalaの機能が
どのパラダイムの機能なのかピンとくるようにできている
ってのを、例えば何がどれとか、教えて欲しいです、先生
まずはそのパラダイムの常識的な用語を使ってるってことだよ 高階関数の名前が関数型でよく使われるものになっているとか あとこのパラダイムなら当然この機能があるだろうというのがある たとえば関数型言語においてはパターンマッチが非常に重要だけど、 知らない人間にとってはなんでそんなに重要なのかわからないかもしれない 他には、case classが代数的データ型であるとか、forがモナドであるとか、 ああOption型はMaybeのことね、とか概念を先に知っていればすぐに理解できる まあ、この辺は知らないと難しいというのもわかる たとえばいまどきのオブジェクト指向言語でカプセル化のための アクセス制御がなかったらびっくりするけど、 オブジェクト指向を知らない人間には複雑に見えるかもしれない それで「protectedって何だよ。複雑すぎるだろ、この言語」とか 言われたらイライラするだろ
>>212 大筋では反対ではないけど、あるパラダイムに沿った言語設計が良しとされるのは、
そのパラダイムの有用性が既に証明されているからであって、パラダイムの理論的背景
そのものが「良い」からではない、というところは間違っちゃならないと思うよ。
結局のところ、一口に「真の」といっても色々と流派があって、それぞれメリットとデメリットが
ある状況だったりするわけだし。
F#のSeq C#のyield for みたいな機能ってScalaにありますか?
forとIteratorを組み合わせるとそれっぽいんじゃないかと… for(x <- Iterator.range(0, 10)) yield (x, x * x) 一回しかyieldできないからちょっと違う?
どちらかというとActorとIteratorじゃないの?
1つ質問なんだけど雑魚SmallTalker論破するけど 赤間本批判しない理由なんなの?結局、権威には逆らえないか 本を売るための売名という認識で正しい?
221 :
デフォルトの名無しさん :2011/06/14(火) 20:59:14.08
権威とかの前に誰も読まんだろw
いくら糞でも読んでないものを批判するのはちょっとw
Scala本出すぎだよね たぶん世界で一番出てる国なんじゃないの
>>217 C#のyieldみたいなのは、Scalaだと限定継続、というちょっと小難しいライブラリを使えば
実現できます。ただ、一度ライブラリ作ってしまえば後は使いまわせるので、そういう標準ライブラリを
Scalaチームの人が作ってくれれば、限定継続を知らなくても良いかと思います。
>>220 本を売るための売名、という指摘はちょっと意図をつかみかねます。あと、赤間氏の
本はそもそも購入していないですし、赤間氏の本には特に権威はないかと思われます。
>>225 まえにはHaskellの本がまとめてでた時期もあるから、一種のはやりなんでしょう。実際に有利な風も吹いてる(twitterなど)もあるからね。日本の中って
右に習えが普通になってるから、どこか大手が積極的に使い出すと、右も左も
Scalaとなることはありえるよね。選択する人たちがプログラムを作る人とは
限らないし。Javaで糞コードに悩まされる人は多いけど、
同じ事は起こるんだろうね。
みなさん殺伐なのが好きみたいね。いっそのことscala-house.jpなんて
作ってみてはどうか?
いちいち殺伐とかうぜーな 2chをなんだと思ってんだ
clojureの本はあんまり出てないのは何故なんだろう?
>>220 お前、いったい誰とケンカしてるの?
雑魚Smalltalkerなんて誰も興味ないし、
赤間本は、このスレで批判されまくりだろ。
赤間博士は情報数学の教授って感じの人で、いろんな言語の入門書を出版しているが、
どんな言語を題材にしても同じような本になるというのが、ある意味すごい人である。
ちなみに、このスレで一番最初に赤間博士の本を発売日前に批判したのはオレだ。
批判しただけでは悪いので買ってみたが、やはり情報数学の初学者向けの本って感じがした。
>>230 Clojureはまだ全体的な人数が少ないところも影響してる。ここでは
Scalaとの比較は書かないが、日本のJavaの人たちから見れば先入観的にも
Scalaのほうが好きなんだろう。海外の方に目を向けると両方共プログラム
を作ってる人は多いみたいだね。planet(Clojure/Scala)ともに同じ人の
記事が出ていることはある。
それにScala以上にClojureは若い言語だよ。今年で4歳だ
明らかな釣りは流せよw
単に人気がなくて売れないからでしょ
Clojureは、オライリーから英語版の書籍が夏に出るところ。 S式慣れ親しんでる(教え込まれてる)のは、CS系の人間ばかりなので 非CS系IT技術者が多い日本では、あまり興味もたれないとおもう。 海外でも、最近はML系が多いしね。
Scalaって関数言語の韓国だな。
クライアントサーバー??
Scala=AKB48
ちなみに、最強の俺流言語はCLなので、若くて俺流極めたい人には、Clojureはメインにならんらしい。 海外でClojure好きの会社は、 Relevance, BankSimple, BackType, FlightCasterといったところ。 あとはCascalog(Hadoopデータマイニング)使ってるデータマイニングエンジニア
和洋折衷なら日本だな。
Groovyこんなに普及してるのか?なんか、日本では実感ないな。 Java FXより少し上程度かと思ってた。
Webフレームワークで結構使われてる。 Javaライブラリのプロトタイピングにも便利だし。
つーか、tomcat でいいじゃん…
えっ
おっおっおっ
Groovyっててっきり滅んだもんだと思ってた
おお、50位以内に復活したか
clojure ,パズルといてるみたいで面白いけどねー。 byflowくらいしかclojureでつくられたとこ知らん。
GroovyやClojureなどの動的な言語は安全性を重んじるJavaの文化にあわないんじゃないか。 それらはJavaが嫌いな人が使っているだけで、ポストJavaという感じがしない。
せやな
257 :
デフォルトの名無しさん :2011/06/15(水) 20:54:21.45
ところで プリミティブ型、static, break, continue が有って困る事って何? ちなみにヘタレプログラマはどんな機能があろうがなかろうがヘタレ。
258 :
デフォルトの名無しさん :2011/06/15(水) 21:02:59.76
Scalaって、Javaのライブラリ使えるのはメリットだけど、 逆に、Javaのライブラリ使えるから、 Scala用のライブラリをわざわざ作らない&公開しない傾向にある気がする。 弱点なような。
>>257 言語としての一貫性の話じゃないかな。
>>258 Java用のだと、やはりScalaの作法とズレてるから、作り直しの需要はあるっちゃある。
実践本売ってないな
今日ぢゃないの?
金曜の勉強会の行きがけにでも買うつもり。
装丁ダサいな 駄目本オーラがすごい 中身はまだ読んでない
264 :
ゆるよろ :2011/06/16(木) 17:55:26.30
すいません
明日頃にはこのスレでもタイポの指摘がでてくるかな。#shuwa_scala
266 :
ゆるよろ :2011/06/16(木) 19:30:30.57
typoしてゴメンナサイ
Wikipediaの例ひどい 再帰的じゃない構造に再帰呼び出しさせて何の意味が
帰納的に定義されているから再帰を使って書くというふうにやりたいんだけど 末尾再帰にしようと思うとそうならない場合が多いね このへん軽くジレンマというか、再帰の例を作る難しさという感じ
本屋に並んでたよー 買わなかったけど
Amazonの謎の登録はなんなの これ、Amazonで売れる系の本でしょ?
>>267 別に対象が再帰的な構造じゃないループを再帰で書いていいと思うが?
文字列は再帰的な構造とまったく言えないわけでもないし。
ただ、
・コード構造が繰り返し版と対象になってないので対比がしにくい
・単純すぎてScala的でない。再帰のwikipedia項目に任せればいい単純すぎる例。
ってところが問題だろう。繰り返し版に合わせるとすると、
def hasA(i:Int, s:String):Boolean = {
if(i < s.length) {
if(s(i) == 'a') return true
return hasA(i + 1, s)
}
return false;
}
か。
まだ買ってないからわからんけど わざわざreturn書いたりelse使ってないのは意味あるの?
WikipediaのScalaの項目のくだらない話だから気にしなくていい
例の本発売日前から予約してたのに入荷しねーメールが届いたのでキャンセルなう。 オモシロかったら教えてくれ。本屋にでも探しに行くから。
再帰的な構造に対する再帰ならむしろ末尾再帰にならない(ことが多い)。 たとえば2分木の左の枝に対してまず再帰したら、そのあと右の枝に対しても 再帰するわけで、末尾再帰には普通はならない(末尾再帰にしようとするなら 継続渡しとかになる)。 きれいに末尾再帰になるのは、単方向リストの処理とか、単純なループ状の 繰返しを再帰にするような場合。
>>276 > たとえば2分木の左の枝に対してまず再帰したら
末尾じゃないのに末尾再帰になるわけないだろw
>>277 再帰は通常末尾じゃない、
っていう話じゃないの?
Scala関係ないな。
関係あるけどScalaに限定された話じゃないな
Scalaは末尾再帰じゃないと最適化してくれないんじゃなかったっけ
それは違う。 末尾再帰に「末尾再帰の最適化」という技法がある、というだけで、 末尾再帰じゃなきゃダメ、というものではない。
というかJVMはtail jumpサポートしてないから、 tail jumpする処理系作りたければ独自スタック管理。 効率目指してtail jump導入してもかえって遅い。
赤間本良質過ぎて感動した。
一方ロシアはループを使った
Scalaのmapとかもループ使ってるしね
そのBot、検索の邪魔になるから消えてほしい
俺も検索してみたら、一つ目が、 > FAIRY TAIL - JUMP大好きっ娘です! orz
tail-recursive jumpと tail jumpは違うの?
tail call/tail jumpは再帰に制限されない。 return f()の形の呼び出しは行きっぱなし。 戻ってきても返値をバケツリレーするだけだし。 ただJVMではclass verifierにおいて、stack増減もチェック対象なので、 tail callを入れるのはかなり大掛かりな改造になる。 LLVMは既に入ってる。
まったりScala実践プログラミング読んでるにょ。 コップ本読んだけど、一応基礎部分も通読しとくかー、と思って読んでるんだけど…。 P26,P27のfor文の例、間違ってね? P27のScalaコードは、Javaと同じ結果を期待するのなら val xs = List(0,2,4,6,8) val ys = List(1,3,5,7,9) for(x <- xs; y <- ys; if x > 3; if y > 4) yield x + ":" + y という記述にして(二つめのifでxとy間違ってない?)、 結果も List(4:5, 4:7, 4:9, 6:5, 6:7, 6:9, 8:5, 8:7, 8:9) になるんじゃないのこれ? あと、P25について細かい事なんだけど、 for( n <- 0 to 10 if n % 2 == 0;if n % 4 ==0 ) {print( n + "' "} って、一つめのifの条件、すごく意味ないよね…。 なんで互いに素である2と3とかにしなかったの? …うーん、これは…なんか不安になってきたぞ。 やはり秀和クオリティは伊達じゃなかったか…?
>>292 読んでるにょ(笑)
にょ(笑)
ばかじゃね
読んでるにゅ
フヒヒ、サーセンwww キモオタなんでつwww P34にも2つスペルミス発見…。 val str = new String("aaa")" fref? fret? P28のチェック例外のが採用されなかった理由は一言理由について言及すべきだよね。 P33の高階関数の初歩の説明で def int2EvenOrOddString(f:(Int)=>Boolean, n:Int)={ if(f(n)) "偶数" else "奇数" } ってのは関数のネーミングがちょっと良くないよね…。(というか、返す値を"真","偽"ぐらいにすべきじゃね?) うおおおおおおおぉぉぉぉぉぉぉぉ………!!!!!!!
ああ、興奮してて俺もミススペルしたぜ。 でもこれ、まともに校正されてないでしょ…。
あれ、sbtってもうみんな0.10に移行してんの?
移行しようとしてんだけど、プロジェクト定義のフォーマットがだいぶ変わって、 しかもその対応がよくわからんから移行できないでいる。 定義のエントリの間に空行入れないと文句言うし、 かと言って依存するライブラリの List のエントリでは空行入れるとダメだったり。 DefaultWebProject も plugin になってからうまく動かないし。
>>292 まず、1件目はバグです。これは全く申し訳ないしか言いようがありません。
> for( n <- 0 to 10 if n % 2 == 0;if n % 4 ==0 ) {print( n + "' "}
については、共著による弊害というかなんというか…。意味が無いというのは
ご指摘の通りです。
> やはり秀和クオリティは伊達じゃなかったか…?
その辺りは、一通り読んで判断していただければ。実際の所、共著の弊害として、
章・節ごとに内容・品質にばらつきがあります。本の末尾に執筆分担があるので、
その辺りを参考にしていただければと思います。
>>295 > P28のチェック例外のが採用されなかった理由は一言理由について言及すべきだよね。
その辺りについては、あえて言及すべきだったかどうかは、微妙なところです。
> def int2EvenOrOddString(f:(Int)=>Boolean, n:Int)={
> if(f(n)) "偶数" else "奇数"
> }
これはその通りですね。よろしくないネーミングです。
>>296 校正はされてます。ただ、校正の方法に問題があったのは確かです。その点については申し訳ない、としかいえません。
空の場合もあるIteratorから先頭の一要素を取り出したいときって
iterA.toTraversable.headOption
がベストかな?
>>298 同じく
> iterA.toTraversable.headOption IteratorをtoTraversableすると、実際はStreamになってるみたいだが、 そのちょっとした無駄なオブジェクトが生成されることを気にしなければ、短くかけるしそれでいいんじゃないのかな
Streamってリソース無駄遣いで問題有りすぎるだろ
ite.find(true) なんてどうだろ
305 :
302 :2011/06/18(土) 21:18:31.10
http://bit.ly/kQhsgz >>303 リソース無駄遣いというのがどういう意味で言ってるのか知らないが、
Iteratorのコードは上記の様になっていて、
Stream.consは2番目の引数は遅延評価されるから、どんなにIteratorのサイズが大きくても、
Streamを生成する時間がO(n)になるわけではなく、定数時間しかかからないはず。
という意味で「ちょっとした無駄なオブジェクト」と言ったんだが。
それさえもったいないなら、IteratorのhasNextを直で呼んで調べる的な方法になる
>>304 コンパイル通らないよ?
意図を汲んでやれよ
>>302 ソース読んでなかった…
Iteratorのみで書くなら
>>304 もいいですね
scala> "hoge".iterator.find(_ => true)
res0: Option[Char] = Some(h)
>>299 レスありがとうございます。
うん、でもこの1件目のバグはかなりアウトやでぇ…。
「開発とデバグ終わりました。エビデンス取りました。」
で、エビデンスが間違った結果出してたのに納品したレベル…。
とりあえず通読する予定です。
何かおかしいと思ったらまた書くわ。
>秀和クオリティ
翔泳社・オームなんかと比べると、あま〜い仕事してる気がするよ…。
罵倒した所でいい仕事が出来るようになるかっていうと違うんだけど、
「これ目通してないだろ?」っていうレベルのものが頻出するとちょっとね…。
版を改めずに刷で改められないかな?
ごめんね、文句ばっかりで。
俺も一人前のScala戦士として前線に立てるように頑張るから…。
>>299 ぶっちゃけすぎだろ。
共著者にバカがいるってことかよ…
>>309 オレにもそう読めた。
著者の一人が書く事じゃないよな。
>>309 >>311 いや、そういう意図ではありません。
共著であり、チェック体制に若干問題があったために(これは、もちろん詳細はかけません)、そういう部分が残ってしまった、
という反省です。内部の事情についてはさすがに書かないようにしています。書き方がまずかったです。末尾に各執筆者の
担当箇所一覧があるとはいえ、基本的に書籍の間違いについての責任は、共著者の共同責任だと考えています。
ちょっとあらためて。 ・共著だから自分の担当箇所以外についてのミスの責任は自分には無い、とは考えていない。 ・ただし、チェック体制に若干問題があったので、書籍としての品質については、担当者ごとにばらつきがあります。 ・私の担当箇所以外でミスがあったことについて、その著者がどうとかそういう憶測はやめていただけると助かります。これは自分の書き方がまずかったですが。 ・ミスの指摘には可能な範囲でお答えします
>>308 1件目については、これはほんと平謝りするしかないです。改めて製本版を
通読しましたが、これ以降、このレベルの間違いは無かったので、大丈夫かと思います。
>「これ目通してないだろ?」っていうレベルのものが頻出するとちょっとね…。
>版を改めずに刷で改められないかな?
その辺りは検討してみます。ただ、少なくとも正誤表には皆様のご指摘は可能な限り反映します。
あと、これはお願いなのですが、ミスの指摘だけでなく、内容についての感想も書いていただけると助かります。 ミスは確かに問題ですが、それ以上に重要なのはコンテンツだと思うので。
誤解されることをつい書いちゃう様な気の利かない人だから 共著担当関係なくそういうクオリティになるんだろ
つか2chに書き込むのは控えた方がいいと思うがな。
>>317 Scala初代スレを立てた人に「2chを控えた方が」はいまさら過ぎると思います。
2chの方が別人のふりして書き込めるから便利だと思うの。
プログラムは嘘か本当かすぐに自分のPCで確認できるから2chで十分
>>317 やっぱそうですかね。2chユーザであっても本を買ってくれたお客さんだから
指摘には対応したいな、とか思ってしまうのですけど、それで誤解を
招く発言しちゃうようなら、2chで発言しない方がいいですね…
アドバイス通り、しばらく2chはROMに徹しておきます。
お疲れさま。 余裕があるならROMらずに発言して善導してもらいたいけどね。 >2chユーザであっても なめんなよ、と言えよう。 ここもコミュニティの一つとして扱った方がいいと思うよ…。 あなたが出てくる必要なないかもだけど、低く見てるのが透けて見えちゃう発言は良くないと思われ。 P58の上の方のソース記述部分の補助コンストラクタって、 new HttpURL(host,port,path)じゃなくて new HttpURL(host, path)なんじゃねーの? あとP144のコードの例なんだけどさ |n = 1; |println(n); //1 |m = n; |n = n + 1; |println(m); //2になる言語があるか? って書いてて、その後に >中にはそのような「変態的動作」を行う言語もきっとあるでしょう とか書いてるけどさ、…これは論理変数がdisられてるのかな…?
ごめん 名無しのくせに態度でかかった。 反省してる…
やっきどーげざっ! やっきどーげざっ!
俺と同じ性格っぽいから、言及されてると返答しないではいられない、 みたいな気持ちは分かるけど、一覧性の意味でも、その辺は自分の サイトでまとめて書いた方がいいんじゃないかな。 どうせ、ここを見てる連中ならサイトの方も見てるだろうしw
日本のscalaコミュニティは育ちそうにもないなw
>>323 Prologならn=n+1がfailするから無問題
>>323 C++でmがリファレンス型だと2になるな。
ただ宣言と定義を同時にしないといけなくて、
参照先の変更は不可能だから、字面上はそうならないが。
int& m = n; となる。
scalaの暗黙の型変換で実現できそうな気がする
Scala難しいから一般向けじゃないよね
…これはウザい発言がdisられてるのかな…?
沈黙の型変換
Javaのころは、 なにがなんでも、Setter、Getterメソッド書けって言われました。 でも、Scalaでは、Setter,Getterは書かないよね。 どうして? なぜ、Javaでは、クラスのフィールドに直接アクセスするのが悪とされてたの?
書かなくても定義されるとか?
Javaでも class MyClass{ int a; } MyClass m = new MyClass(); x = m.a ; m.a = y; というように、書かなくてもget,setできるけど、 どうちがうの?
なんかのフレームワークだか、公式のドキュメントだったか、ツールの関係だった気がする
>>338 EffectiveJavaを買って読んでみよう!
>>336 自分で書かなくていいってだけで
外部に公開される変数を宣言したら自動でsetter/getterが定義されてる
直接変数に代入してるように見えるのはsetter呼び出しのシンタックスシュガー
class MyClass {
var a: Int = _
}
val m = new MyClass()
val x = m.a
m.a = y
上のように書いたら実際は下のように展開される
class MyClass {
private[this] var aa: Int = _
def a = aa
def a_=(value: Int) { aa = value }
}
val m = new MyClass()
val x = m.a
m.a_=(y)
>>341 ありがとうさぎ。
でも、それって、Javaでも同じじゃないの?
Javaも自分で書かなくても、setter/getter できるでしょ。
>338の
x = m.a ;
m.a = y;
みたいなのは、自動でsetter/getterが定義されているのと違うの?
もちろん、
・Javaでは、自動setter/getter 定義しているわけでない。
・Scalaでは、自動setter/getter 定義されていて、シンタックスシュガーで、そうかける。
というのは良く言われていることだけれども、
両者の違いって、なんなの?
Scalaの自動setter/getter って Javaのpublicフィールドに直接アクセスするのと比べて
何がうれしいの?
C#の自動プロパティでも、確かに楽ですむけど なら結局これってpublicフィールドとどう違うんだよ という議論があったね。
>>342 じゃあ仮に、後になってaは0より大きい数値でなければいけないとなったとする
class MyClass {
private[this] var aa: Int = _
def a = aa
def a_=(value: Int) {
require(value > 0)
aa = value
}
}
と修正するだけでOK。呼び出し側は修正の必要がない。
Javaでpublicフィールドに直接アクセスしてた場合、メソッド呼び出しに書き換える必要がある
>344 IDE使えよ。
修正しなくていいってことはコンパイルし直さなくていいってことだろ
フィールドをメソッドにかえたら呼び出し側はリコンパイルが必要 最初からメソッドにしとけば中身が変わっても呼び出し側はリコンパイルが不要になる なのでScalaの見た目はフィールドだけど実際はメソッドって方が変化に強いはず ちなみにC#のフィールドもプロパティにかえたら呼び出し側はリコンパイルが必要
>>342 Effective Java読めつってんだろ
Dire Wolf DigitalでScalaプログラマ募集してるね RT @functionaljobs: Full-time: Java / Scala Developer at Dire Wolf Digital (Denver, CO)
http://bit.ly/lUvtfx
スカラってやっぱり冗長だなと思った。もっと簡潔に書けるんかな? scalaでプログラムは組んだことがないんでよく知らん。だけど、無 限ストリームを使って、他の言語でよく取り入れられてるフィボナッチを 作ってみた。でも型宣言が足を引っ張ってる感じがある。 この手のストリームを作るときにはかえって足かせになってるのかもな。 scala> def ite (f:(Tuple2[Int,Int])=>Tuple2[Int,Int],t:Tuple2[Int,Int]):Stream[Tuple2[Int,Int]]=Stream.cons(t,ite(f,f(t))) ite: (f: ((Int, Int)) => (Int, Int), t: (Int, Int))Stream[(Int, Int)] scala> def fib (t:Tuple2[Int,Int]):Tuple2[Int,Int]=(t._2,t._2+t._1) foo: (t: (Int, Int))(Int, Int) scala> ite(foo,(0,1)) take 10 print (0,1), (1,1), (1,2), (2,3), (3,5), (5,8), (8,13), (13,21), (21,34), (34,55), empty mapを使って第一要素だけ取り出したら完了だけど、scalaのmapはまだ知らんので こうやって見てると、一応関数型言語の心は少しは持ってるとは思う。
こうやって作ってみると、haskellの影響はかなり感じるけど、haskellほど 洗練されてないという印象も持ったな。
scala> Stream.iterate((0,1)){case (a,b) => (b,a+b)}.take(10).toList
res0: List[(Int, Int)] = List((0,1), (1,1), (1,2), (2,3), (3,5), (5,8), (8,13), (13,21), (21,34), (34,55))
scala> Stream.iterate((0,1)){case (a,b) => (b,a+b)}.map(_._1).take(10).toList
res1: List[Int] = List(0, 1, 1, 2, 3, 5, 8, 13, 21, 34)
こんなのも
def fibFrom(a: Int, b: Int): Stream[Int] = a #:: fibFrom(b, a + b)
参考URL
http://eed3si9n.github.com/scala-collections-doc-ja/
ちなみにTuple2[Int,Int]は(Int,Int)って書いてもいいんよ
Haskell様がやって来たときには全力でスルーして耐え忍ぶ OCaml野郎がやってきたときにはここぞとばかりに反撃にでる
ちなみにiteってのはiterateを意識してますねん。
だから、タプルからタプルを返す関数ならなんでもおkです。
>>352 をみると::でそれを実現してんねんな。
iteを短く書くにはこうすりゃいいよ def ite[A](f: A => A, start: A): Stream[A] = Stream.cons(start,ite(f,f(start))) Stream.iterateの再発明になったけど
>>359 ありがと。皆さんのアドバイスに色々勉強になりました。
Stream.iterateってあるんですね。どうせあるんだろうなとは思ってたんですよ
(なければないでまずいような関数ですしね。)
361 :
デフォルトの名無しさん :2011/06/25(土) 01:52:50.34
lazy val fs:Stream[Int] = 0 #:: fs.scanLeft(_+_)
362 :
デフォルトの名無しさん :2011/06/25(土) 01:53:59.22
間違えた lazy val fs:Stream[Int] = 0 #:: fs.scanLeft(1)(_+_)
みんな凄いな... 全く分からん
364 :
デフォルトの名無しさん :2011/06/26(日) 08:57:38.91
代数データ型が貧弱すぎる。もっと色々な代数データ型をデフォルトで用意すべき。 そうでないと相変わらず set, seq, map, タプルとかから作り上げることになる。 いろんなGraphの代数データ型とかデフォルトで用意しろー>おだ
そんな使用者層の偏ったデータ型追加してったらきりがないだろうな 自分勝手なクレーマーの典型例を見た
366 :
sage :2011/06/26(日) 14:26:36.37
>>364 そんなに必要だと思って自信があるなら、自分でライブラリ作って、
それを本家にマージしてくれって言うくらいのことやってみればいいんじゃないの?
基礎がなかなか身につかん! // 何かの関数 def func () = { println("in the func()") "executing func()" } // 名前渡しされる関数 def hoge(f: => String) = { println("in the hoge()"); f } 実行すると↓ scala> hoge(func) in the hoge() in the func() res33: String = executing func() hoge関数の引数のところは、「Stringを返す関数をfという名前で受け取る」 っていう認識であってる? あと、 def piyo(f:Int => String) = f(10) っていうのも名前渡しになるんだよね? この場合はの引数の意味は「Intを引数に取って、Stringを返す関数を、fという名前で受け取る」 ということ?
>>367 名前渡しは、引数に渡した式を評価せずにそのまま関数に渡し、
関数内で参照するたびに式を評価するという方式。
引数の式がその場では評価されず、
hoge()内でfが参照された時点で評価されるため、
以下のような結果になる。
scala> hoge({println("in the arg");"executing arg"})
in the hoge()
in the arg
res0: String = executing arg
しかし、piyo()では引数を評価せずに渡しているわけではなく、
あくまで評価した結果の関数を渡しているだけなので、
名前渡しではない。
(違いが分かりやすいようにpiyo()を改変している)
scala> def piyo(f:Int=>String) = {println("in the piyo()");f(10)}
piyo: (f: (Int) => String)String
scala> piyo({println("in the arg");_.toString})
in the arg
in the piyo()
res1: String = 10
>>367 >hoge関数の引数のところは、「Stringを返す関数をfという名前で受け取る」
>っていう認識であってる?
f は引数を取らないので関数ではない。(内部的には関数で実装されているかもしれないが)
hoge() 内の f の後ろに () を追加するとエラーになることからも、関数でないことは明らか。
あくまで参照するたびに式が評価される特殊な String だと考えるのが無難だと思う。
371 :
デフォルトの名無しさん :2011/06/27(月) 01:21:33.68
>>367 > f
returnが省略されているからややこしいのかもしれないが、
単に引数fを返り値にしているだけだぞ。
ただ名前渡しだから、その時点で評価されるというだけ。
>>367 名前渡しは実装上では
Function0のシンタックスシュガー
def hoge(f: Function0[String]) = {
println("in the hoge()");
f()
}
hoge( new Function0[String] {
override def apply() = func()
})
のように展開される
thunkっていう昔からの実装方法だな。 ただ自由変数とか細部まで、実装方法で操作的に把握しようとすると、 結局ややこしいので、名前渡しをちゃんと理解するのがいい。
374 :
367 :2011/06/27(月) 14:58:24.82
みんな色々ありがとう! 教えてもらったことを咀嚼してるけど正直まだよく分かっていない。ごめん。 取り合えず今読んでる本を最後までちゃんと読み切ってみることにした。 そうすれば過程で感覚的に分かることもあるだろうし、それをさらに深めていく。
名前渡しを実装方法でもって理解しようとすると、
>>373 が書いてるように、
かえってややこしくなるだけなので、概念を理解するのが良いと思う。実際にややこしくなる例:
class RichAny[T](block: => T) {
def until(cond: => Boolean) {
while(!cond) block
}
}
implicit def enablePostUntil[T](block: => T): RichAny[T] = new RichAny(block)
var i = 0
{ println(i); i+= 1 } until (i > 10)
こんなもん誰もつかわねーよと言われそうだが、Streamは実際にこのテのimplicit conversion(consWrapper)使ってる。
隣の言語はherokuでサポートされたらしいね。
もうすぐ、Java7がリリースされるけど、 Windows環境では、OracleのVM を使った方が速いのかな?
JRockit使うってのは?
Java7は、JRockitも付いてくるみたいね
HotSpotとJRokitの統合ってどこまでできてるんだっけか?
JRokitって有償版のみ提供なの?
383 :
デフォルトの名無しさん :2011/07/10(日) 11:15:39.91
>>380 今度のJava SE(まだ6)から付いてくる。
>>381 別のJVM実装として付いてくる。
>>382 報道を読む限り全てに付いてくる。
有償のみ付いてくるのはJRockitの開発運用系ツール。
続きは別のスレか板でやってね。
あれ、xsbtってもうstableになったの?
0.10でstableになったよ
386 :
367 :2011/07/11(月) 04:43:18.80
Scala用のwebフレームワークってLiftとPlayの2つがメジャー?
あとScalatraと、最近なんか話題になってたよな、Unfilteredだっけ どんなもんか知らんけど
Liftはかなり勉強したが結局好きにはなれなかった。Playは面白いけど、ただそれだけって感じ。
じゃあどれつかえばいいんだよう
Liftが圧倒的ユーザ数なんでまずLiftで。 圧倒的と言っても相対的な事でマイナーだし。 他はもっとマイナーってこと。
Scalatra 派生の Bowler Play! を許すなら grails も Scala plugin がある
liftは他に選択肢がないからつかってたケース多そうだけどどう?
高階関数の「中」で何かエラーが起きた時に、それを外に伝えるにはどうすればいいんだろう。 ("" /: lines) { (acc, line) => acc + line match { case "hoge" => "hage" case _ => // エラーなのでfoldLeftの外にそのことを伝えたい } }
例外か継続を使うしかないでしょうな
foldLeftを使わずに自前で末尾再帰するとか
あらかじめforallでエラーが起こりそうかチェックしとくとか それが無理なパターンならEither型使うとか
どんだけ亀やねん
>>394 エラーが起きた時点で、残りの計算が必要でない、無意味なら例外、
とりあえず全部計算したいなら Either だろうね
401 :
394 :2011/07/19(火) 06:39:42.26
よく考えると、多重ループからの脱出問題の類似になるんだね。 だとすると、計算コストが問題にならない場面なら例外を使うことになるのかな。 Scalaってgotoやbreakはないよね。。
>>402 breakableも、内部的には例外をスローしてやってるんじゃ?
限定継続で実装したbreakを颯爽と置いていく神はまだですか?
このスレ的にはKotlinってどうよ
なにそれ、おいしいの?
コトリン?可愛い名前だな
今まさに彼の方がハッシュタグ付きで語っておられるではないか!
もっとメジャーになってから飛びつくことにするよ
Scalaに飛びついてる奴が何染みったれたこと言ってんだ
.net scalaのことが公式ページにでてるね。
使い物になるレベルだといいな、今までも一応Scalaは.netでも使えるってふれ込みだったけどアレだったし
>>412 でも英語たからなんて書いてあるかんからないね。
EclipseのプラグインでJavaみたいに使ってるクラスをショートカットで自動的にインポートしてくれる機能ってある?
つまるところ、Microsoftがfundしてくれるという話は真実だったというわけか。
限定継続のgotoも結局は例外投げるよね
今回のscala for .netは、ikvm使ってるみたい? 昔ながらのikvmで動的にトランスレート+scala向けの機能追加なのか? それともilasmにコンパイル出来るのか?
StreamかIteratorか継続使ってyield実装するかのどれかでしょうね
scalacに対してはfscがあって、VMの起動を省略してコンパイルを高速に行える。 だけどscalaコマンドの高速版(fs?)はないのかな?
423 :
デフォルトの名無しさん :2011/07/23(土) 23:02:11.65
Scalaって難しいと思うんだけど、 おまえらの学歴ってどんな感じなの? 生物系の学部卒の日曜プログラマには、難しいかなぁ。
いや、別に難しくないと思うけど。習得に使ってる本かHPが良くないんじゃ…
>>423 機械系の学部卒の底辺プログラマでもやってるから気にすんな。
学歴とか関係ねぇ、多分。
とか言っても情報系院卒とかいう人にはコンプレックス持っちゃってるな、自分…。
スタートラインが違いすぎて…。
たった6年しか差がないじゃん。
Fランニート
>>426 そう思うだろ?
でも自分、大学までPC触った事ほとんど無くて、彼らはかなりの数が小学生から触ってたりするんだぜ…。
6年の差、どころか10年以上の差があると感じてるんだぜ…。密度の濃い10年以上の差が。
しかも自分は引きこもってて多留してるから余計にコンプレックスです。
ごめんなさい最近Scala触ってないです。
実践Scalaのデザインパターンの章面白かったです。
Scalaはイテレータないからな これじゃメジャーになれないよ
>>429 あるものを無いといってもネタにすらならないなあ
>>428 就職してから初めてスターエンジニアやってる人もいるんだから、
まだまだこれからだよ。
馬鹿同士が励まし合うスレ
Ceylon最強だなぁ
>>428 プログラミングなんて「正しい考え方」が身についてるかどうかだ。
何年やってても、スパゲッティコードを量産してドヤ顔してる奴なんていくらでもいる。
>>434 俺がそれだな
最近良いコードと設計って何だろうってのが本当に分からなくなってきた
まずはコードを短く書けばいいんだよ 最小のサイズで書かれたコードが駄目なことはほとんどない だから言語も短く書けるものを選んだほうがいい
んなこたぁない。 重要なのは、見た時に意味が明瞭なこと。 長いコードが駄目なのは、見た時に意味が分からないからであって、 意味もなくワンライナーで書かれたコードもやはり有害。 特に変数名は、多少長くなってもその変数が置かれた文脈において、 意味が明確であるようにつけるべき。中途半端に省略しようとすべきではない。
その意味で、過度なポイントフリースタイルの利用はよくない。 関数型っぽくてカッコいいいけど、そのコード片が何をしているのか分からなくなる。 これは、複雑な正規表現が暗号みたいになってデバッグ不能になるのと似ている。 呪文を操る魔術師(ウィザード)を気取りたいなら別だけど、それは俺の見えないところでやってくれ。
あと、今思いついたこと。 変数名が長くなるのは、それが属しているコードブロックが扱おうとしている処理の範囲が広すぎて曖昧だから、だな。 だとすれば、変数名を短くしたいなら、そのコードブロックの位置づけを見直せばいい。
言語の話をするなら、既知の概念をシンプルに記述できるのが良い言語。 コレクション操作を考えてみればいい。 Javaのfor文まみれのコードと、Scalaの高階関数を使ったコード、どちらがシンプルだろうか。 これは、単純に人間がコードをタイプする量を少なくすることとは全く違う。 ネットに転がっているScalaで書かれたコードを見ると、 変数名を過剰に省略したり、ワンライナーで書いてドヤ顔しているものを散見するが、 Scalaの記述力は、そういうことをするために使うものではない。
scalaにfor文があるのはその方が可読性が高いから
くだらね
>>440 >ワンライナーで書いてドヤ顔
これは同意。
あれはワンライナーでどれだけ書けるかっていうゲームを楽しんでいるものだろう。
俺もそういうゲームには興味がない。
> 変数名を過剰に省略したり、
この辺は、昔と今でパラダイムシフトがあったところ。
最近は、変数名は、短ければ短いほど良いとされている。
長い変数名をつけなければいけないようなコードは、たぶん、全体設計がうまく行っていない。
この辺は、
>>439 も言っていることだと思う。
変数名は長く、、っていうのは、昔の言語は、いちいちそういうのを気にする必要があったから。
変数名が短くても良いように、言語の記述力が上がってきたからね。
C言語からC++になった時、あるブロック内で完結しているローカルな変数は、
短ければ短いほど良いはずなのに、いちいち長い名前つけている人がいるねえ。。
( C言語はブロックのスコープが広くなりがちだから、長い変数名で区別する必要があった。)
>Javaのfor文まみれのコードと、Scalaの高階関数を使ったコード、どちらがシンプルだろうか。
C言語の時代では、コレクション操作は自分で配列のインデックスを意識してfor文回すのが美しいとされてきたものだねえ。。
時代によって、良いコード・良い設計の指標は変わるものである。
444 :
440 :2011/07/24(日) 21:19:53.88
>>443 > C言語の時代では、コレクション操作は自分で配列のインデックスを意識してfor文回すのが美しいとされてきたものだねえ。。
データがメモリ上でどう展開されているのか、意識したコーディングが要請されていた時代の産物だなぁ。
ソフトウェアの複雑さが上がるに伴って、下のレイヤを抽象化することが必須になったことで、変わらざるを得なくなった。
Cでは今でも美しい > for文回す 美しさはその言語が提供する抽象化レベルや構文の一貫性などに依存する
どちらにせよ、OSやデバイスドライバを書かないプログラマには関係のない話だな。
447 :
440 :2011/07/24(日) 22:04:53.89
>>445 なるほど、自分がやろうとしているのが何か、によって、良いコードの定義が違うのだなあ。
ところで、
>>438 の言うところの、
「過度なポイントフリースタイルの利用はよくない。」 っていうのは分かる気がする。
( PointfreeってHaskell界隈の言葉らしいけど、Scalaでもそう言うのか?)
クラスによるオブジェクト指向が流行った時、変なクラス設計する人が多くて萎えた。
下手にクラス使っても、関数に比べて遅くなるだけだしね。
でも、GoFのデザインパターンで手本が提示されることで、有効なクラスの使い方が皆書けるようになった。
Scalaも、何か指針が欲しいところだね。
コードを短く書けというと、わかりづらいから駄目とか、 Perlのワンライナーがどうのこうのと反論するやつが必ずいるよな あえてコードを長く書いてまでわかりやすさに拘るとか、 そんなに自分の主観に自信があるのかね 大体変数名とかワンライナーとかは瑣末な話であって、 名前は統一されていればよいし、ワンライナーくらい好きに書かせてやれよ よっぽど変態的でない限り読めないほうが悪い まず全体でコードが最小になる設計をして、 そこからトレードオフで拡張性や速度を考慮していくというのが 筋のいい考えでしょう 最初から自分の主観のわかりやすさなんかを優先するのは信じられないね と言うとオブジェクト指向のメタファー全盛の時代では反動的なのかな
450 :
デフォルトの名無しさん :2011/07/24(日) 23:07:16.40
>>449 チーム開発とかしたことない人間が言いそう
関数型だって、長らくわかりづらいとか難しいとか主観的にディスられてきたのに、 よくまだ暗号とか魔術的とかそういうこと言えるよ 自分の知らないイディオムじゃないかとは思わないのかね 過渡期にありがちだから、まあ、いいけどさ
454 :
438 :2011/07/24(日) 23:28:14.59
>>449 >>452 これまで、コード行数を最小化する方向に振っていいことなんか一つも無かった、
とプログラミング歴十数年の俺が言ってみる。
それが必要なイディオムなら、名前をつけてドキュメントをきちんと整備するべき。
「みんなが知らないイディオムを駆使してる俺カッケー」って悦に入りたいだけなら、
俺には関わらない場所で一人でやってて欲しい。
>>455 へーそれは意外だね
よほどプログラマの腕の差がある職場なんだろうね
低レベルのほうに合わせなきゃいけないのは勘弁願いたいところだ
関数合成だって、そのうち平気でみんな書くようになるかも知れんぜ?
まあ、俺も2.8が出たときに、関数型言語なのに標準ライブラリが
こんなに読みづらいのはいかがなものかとここに書いたことあったけどねw
>>456 それなら、君のやるべきことは二つのうちのどちらかだ。
『「低レベルの奴と一緒に仕事をする気はない」と宣言して、必要な知識を持ったプログラマだけを集める』か、
『低レベルの人間でも理解できるようにドキュメントを整備する』か。
まぁ、この先もずっと一人でコードを書き続けるなら、今のままでもいいんじゃない。
俺の職場やオープンソースには来ないでくれよ、迷惑だから。
>>457 たぶん俺と君では職場のレベルが違うのだろう
そこらにあるオープンソースのプログラムなら十分高レベルだよ
大抵こういう仕事だと、わかりづらく圧縮されたコードに悩まされるより、
糞みたいなコードを書き直したら何分の一になったとかそういうほうが
多いもんだと思ったがそうではないようだ
まあ、俺は、良い設計がわからなくなったという
>>435 に
シンプルなアドバイスを書いただけだから、君との論争は本位ではない
ここで終わりにするよ
Scalaのfor式は、仕様チェックしないで記事書く人にはトラップだよな
昨日、kmizu氏と延々とやり取りしてたな。
>>458 それは大いにやればいいんだが、コミュニケーションを拒絶するようなやり方は、
やはり問題があるという、それだけのことだよ。
コードは単なるロジックの塊ではなく、設計図であり、またコミュニケーションの媒体なんだよ。
コードの意図を読み取れない人間が多いなら、他の手段で意図を補足するのが、
コミュニケーションとして良いやり方。
>>436 のいう事をあくまで設計時の話だと解釈して、
モジュール内のコードをそれぞれ最小化できるように、モジュールを構成(設計)するって話なら、指針の一つとしてはまあいいんじゃないかな?
ここでいう最小化は可読性を損なわない範囲でってことな。どこまでやったら損なわれるかは、使ってる言語やら現場の文化やらで変わってくるけどな。
@m_k28
鬱陶しい。
>>463 >使ってる言語やら現場の文化やらで変わってくるけどな。
同意。
最近、統一したコーディングルールを厳密に守って記述するなんてばかばかしいってことに気付いた。
割とコーディングルールがきっちり決められているJavaでさえ、
プロジェクトごとに独自ルール設定しているものだよ。
極端な話、1ソースファイルごとにコーディングルール別々にしても、全然可読性は損なわれないし、
プロジェクト全体に対して迷惑かけることもない。
ここで、俺様が、過去10年間読んだ中で、もっとも影響を受けた読み物(2分で読める)を紹介する。
コーディングスタイルの常識をぶち壊せ
http://codezine.jp/article/detail/3055 http://codezine.jp/article/detail/3055?p=2 ということで、この論争の元である
>>435 に対する答えとしては
「435が何をやるかによって良い設計の基準が変わる」、のだから自分が美しいと思うとおりに設計すればOK!
っていうことで、どうかな?
>>436 だったらClojureにおいで。Scalaよりずっと短く済む。
率直に言ってScalaもオブジェクト指向なんて使わずに書けるところを
増やせば簡潔に書けるようになるんじゃないかと想像してるがどうなん?
特に、Scalaに敵意を持ってるわけじゃないんで誤解されちゃ困るんだが。
もうちょっと補足しておくと、最初は簡潔に書いて作って、そのあと プロファイルしながら、高速化していくってのが関数型プログラミング のいいところだと思うんだけどね。関数にいきなり複雑な操作を加えようと してつくろうとしたところで簡潔にはならないし、デバッグも難しくなるし さっさと作れる関数型プログラミングの良さは出ないんだよな。
ClojureがScalaよりずっと短く済むだと? それはさすがに具体例を挙げてもらわんとただでは帰さんぞ
また補足しとくけど、scalaをdisる気はないんで、これでコメントを控えときますわ。
括弧と中括弧の使い方というのはよくわからんし、常識だとも思わんが、その記事はちょっと読んでみるわ
型宣言が不要な分短くなるのは確かだろうけど、せいぜいそれくらいでは? 両方とも似たような高階関数持ってるし、サポートしてるデータ構造に ついても、大して変わらんし。マクロをうまく活用できる人なら、確かに 「ずっと短く出来る」かもしれんが。
closureが他と比べて短いのはここだね。 (defn distribution [items] (persistent! (reduce #(let [lowcase (.toLowerCase #^String %2)] (assoc! %1 lowcase (inc (%1 lowcase 0)))) (transient {}) items))) (defn process-newsgroups [dir] (let [format #(str-join \newline (map (fn [_] (str-join \tab _)) %)) data (reduce #(merge-with + %1 %2) (pmap #(distribution (re-seq #"\w+" (slurp* %))) (filter #(.isFile #^File %) (file-seq (java.io.File. dir)))))] (spit "/home/lau/Desktop/alphabetical" (format (sort data))) (spit "/home/lau/Desktop/decending" (format (sort-by val > data))))) しかし、最速なのはpythonなのが意外。
>>466 誤爆してたので
ttp://codezine.jp/article/detail/3055?p=2 switch(month){
case 1: tsuki= "一月"; koyomi= "睦月"; break;
case 2: tsuki= "二月"; koyomi= "如月"; break;
case 3: tsuki= "三月"; koyomi= "弥生"; break;
case 4: tsuki= "四月"; koyomi= "卯月"; break;
case 5: tsuki= "五月"; koyomi= "皐月"; break;
case 6: tsuki= "六月"; koyomi="水無月"; break;
case 7: tsuki= "七月"; koyomi= "文月"; break;
case 8: tsuki= "八月"; koyomi= "葉月"; break;
case 9: tsuki= "九月"; koyomi= "長月"; break;
case 10: tsuki= "十月"; koyomi="神無月"; break;
case 11: tsuki="十一月"; koyomi= "霜月"; break;
case 12: tsuki="十二月"; koyomi= "師走"; break;
default: tsuki= ""; koyomi= ""; break;
}
こんな単純な処理ならマルチステートメントなんか使わずに構造体の配列にしろよ馬鹿
>>474 元ブログも読んだんだけどさ。結局
1.Clojureのライブラリの関数名が(Scalaに比べて)短いので行数節約できてる
2.ClojureがScalaとかに無いライブラリ使ってるので短くなってる
3.Clojureバージョンは一時変数使わないようにしてるので短くなってる
これだけにしか見えんのだが。なんかトリッキーなマクロ使って短くしてる
かと思っただけに拍子抜け
Scala と Clojure のどちらも一通りなめてみたけど、 自分も、表現力や問題の本質をシンプルに記述する、 という点では Clojure に軍配が上がるかな、という印象。 Scala は、もともと複雑になりがちな継承ペースの OO をフルサポートしつつ、表現力を高める ( 関数型的な表現も可能にする ) ために、 更に implicit などが導入されて、 どうしてもややこしくなってしまっている ( コーディング中に考慮しなければならないルール、暗黙の前提が多い ) という印象。 複数のパラダイムをサポートしつつ、 型安全を得るためにはしょうがないのかなあ。 とはいえ、 Scala を学ぶのは楽しい。
Scalaはいかにもインテリの作った言語って感じ
行数が少々多い、少ないってのはどうでもいいけど
「表現力や問題の本質をシンプルに記述する」で差があるのは気になるな
RubyやScalaもいいとこいってると思うので、どこらで差がついてるんだろ
>>470 みたいな比較だとScalaにioライブラリがないのがもろに響くなw
うぜえ
うぜえ
めずらしく 幼稚な反応だ♪
487 :
デフォルトの名無しさん :2011/07/26(火) 12:36:03.67
Scalaみたいな言語は、数値科学演算の分野に合いそうな気がする。 MatlabとかScilabは文法的に限界に来ているからね。 ScilabとかはVer6で従来のMatlabライクな文法を捨てるって公言しているし、 この機会に、Scalaとか採用してほしいなあ。 ScilabとScalaって結構合うと思うんだ。 ScilabはJava(JVM)で大半書かれているし。 ScalalabとScilabが協力してくれれば、、。
Rとかjavascriptに近くなったりしてな。なんちゃってJavaに なるのは喜ぶのは一部だけっしょ。
>>488 なんちゃってJavaが嫌ならIncanterで良いのでは?
http://incanter.org/ >Incanter is a Clojure-based, R-like platform for statistical computing and graphics.
Scalalabは型を書かせる代りに速いのが売りでしょう。
http://swik.net/scalalab >scalalab provides the ScalaSci scripting engine,
>based on the new Scala programming language,
>that obtains scripting speed by resolving method calls at compile time (“statically typed”).
>The scripting code is extremely fast, close to Java,
>and about 20-40 times faster from equivalent Matlab .m scripts!
@m_k28鬱陶しい
>>489 まず、
Matlabって、数値計算では有名なソフトだけど、商用。
クーロン版は、3つくらいある。OctabとFreeMatとScilab。
他の2つがMatlabの完全互換を目指しているのに対して、
Scilabは独自路線を進もうとしている。
組み込み関数が異なるのはもちろん、基本文法も、ちょっと違う。
で、今のMatlab系文法はそろそろ限界にきている。
1)実行速度が遅いし、
2)ちょっと複雑なのを書こうとするとクラスとか書きたくなる。
実際、Matlabでクラスとか疑似実現している人はたまにいるけど、
仮想関数の実現がクラスの識別を文字列比較してからメソッド呼び出しみたいに
やるので、普段から遅いのが、さらに遅くなって使えない。
と、これまでは、スレ違いなんだけど、
Scilabは、一部Javaで書かれているだけあって、Javaとの連携は強いということろが重要。
JavaからScilabを呼び出したり、ScilabからJava呼びだしたりできる。
。。。。ということは、Scalaとの連携も容易にできるはず、、、、。
もっと言えば、ScalalabとScilabが連携してくれれば、やれることが無茶苦茶広がるのだが、、。
Rとまったく同程度の機能を持った Scalaのライブラリ無いですか? Rの腐った実装は使い物にならない
SCALAコミュって大門軍団って感じがする。
COLT使わんの?
>>492
scalaのインストーラ滅茶苦茶遅いな
あれは本当に遅かった。 インストーラ実行してる間にアーカイブの方を 解凍して配置してpath通してREPL起動して遊べちゃうレベル
ドキュメントの展開が糞遅いんだよな。 ドキュメントなんてローカルにインストールしなくていいって人いっぱいいると思うけど、 なんでオプションになってないんだろうな。
一番最近のリリースでは直ってたような。
サーブレット用にコンパイル(Tomcatのservlet-api.jar)したらクラスファイル名にServletって付くのね。 ちょっとハマった。 @WebServletアノテーション付けたらコンパイルエラーになってまたハマりそうだったから切り上げた。
500 :
ななし。 :2011/07/27(水) 23:16:12.18
カ オ ス ラ ウ ン ジ ゆ る せ な ぁ い ー
板違い死ねばいいのに
@n_k28鬱陶しい
おまえらファウラーのDSL本読んだ? まあ翻訳でるらしいし、それからでもいいかもしれんが。
>>503 それどんな本?ファウラーはもう害悪でしかないが?
ちょお ファウラーってそんなに悪く言われるような事したっけ?
全然知らんけどDSLってそんな一般論で語れるようなもんなのか? 言語能力に激しく依存する気がするのだが
「もう害悪でしかない」なんてことを言う奴の9割はそいつが害悪。
Java7あればScala不要なのか
仮にクロージャさえあればScala要らん、という奴がいてもJava8待ちだろ。
Java 7 でちょっとだけ switch 文が拡張されただけで、 Scala のパターンマッチングになんて程遠い。
Java7はあんなしょぼい進化でよく出せたな 移行する意味をまるで感じないのだが
>>512 Oracle による政治的判断によるリリースってやつだろ。1.4 の次が 5 になったみたいに。
移行する意味っつったらNIO2があるだけで十分のような。
>>514 commons-io とか使ってればいまさらって感じもするけどな。
try が C# の using っぽく拡張されたのはちょっとうれしいけど。
Commons IOだけじゃパーミッションにフルに触れないし非同期IOも不完全なままだし。
@n_k28似合ってねえよ
はいはい場外乱闘でも野次でも2chでやるのはやめましょうね
-nobootcpつけないとエラーになる件、いいかげん直してほしい
何が出来るんです?
525 :
520 :2011/08/01(月) 17:12:04.67
こいつなんもわかってねえな
翻訳系指向な言語で実行時に型安全じゃないジェネリックの方が珍しいけどな。 程度の差はあるとはいえ。
>>525 正解はなんなの?リンク先は絶対間違ってるのはわかるけどw
532 :
デフォルトの名無しさん :2011/08/03(水) 15:52:38.20
本腰入れて覚えたいんだけど、今からやるならどの本が良い?
>>532 まずは言語仕様。Webで。
分かりにくいところ、疑問点を
書き出したあと、本屋でそれに
触れている本を購入。
Listのcase class,::をカリー化したいのだけど、 unapplyの返り値の型がわからない 使い型としては、::と同じ様に、 case Cons(hd)(tl) => ... としたいんだけど
東京いいなぁ。地方の書店のプログラミングコーナーにscalaなんて置いてねぇぞ
>>534 unapplyはカリー化しても実質的に意味が無い。というのは、
case Cons(hd)(tl) => ...
みたいなのは「構文レベルで」駄目なことになってるので。ちなみに、unapplyの
返り値型は Option[(A, List[A])]。これは個別に覚えて無くても大丈夫で、
case classで自動生成されるunapplyの型は、プライマリコンストラクタ引数
列をタプルとして、それを単にOptionでラップしたものになる。
>>535 今はamazonがあるからまだいい方だよね
539 :
534 :2011/08/04(木) 11:55:55.43
>>536 ありがとうございます
構文としてダメ、ですか…
別の方法を考えてみます。
unapplyの返り値がOption[(A,List[A])]になるということは、
カリー化しないunapplyと同じ返り値型、ということになりますね
すると、case Cons(hd,tl) => ...ということですか。
すごく気持ちが悪いような…
ちなみに、case classではなくて、
Listをextendしない(sealedだからできない)、
objectとしてConsのapply,unapplyを定義しようとしていました。
def apply[A]:(A => (List[A] => List[A])) = {
hd => tl => hd::tl
}
def unapply[A] (ls :List[A]) : Option[ ??? ] ={
if (false == ls.isEmpty){
Some( ??? )
}else{None}
}
>>532 と
>>535 は同一人物?
立ち読みできない環境ならOderskyの、
Scala本の2nd Editionを買っておけば間違いないと思うんだけど…
本腰を入れるか迷ってるならもっとライトウェイトのもいいと思う
540 :
532 :2011/08/04(木) 12:07:56.48
>>535 とは別人
Scala本の2ndはProgramming in Scalaってやつかな
Webで言語仕様をちゃんと見るのはやったほうが良さそうだね
写経して感じを掴みたいのでオライリーのもいいかなあ
webでやるより本から入ったほうがいいと思うんだがな。 虫食い的な知識じゃなくて、網羅的に基礎を作ったほうが 後々に効いてくる。これは学習全般に言えることだよ。
>webで仕様書 だよ。仕様書読んで使い方わかる人は少ないけど、 一般人でも機能や定数、制限事項は分かる
>>542 基礎を作るならば、それが向いてないといってるの。
はじめから大風呂敷を広げるようなものだから、挫折しやすい原因になるし
どこが大切か?というところのポイントが均一化されすぎて
掴みどころがない状況になり得る。いわばでっかい海に放り出されて
およげ、筏とオールをわたすからおよげといってるようなもの。
最初は入門書でひと通りやったほうがいいんだよ。
プログラミング初心者、または経験者でも 異なるパラダイムのプログラミング言語を学ぶなら本が良い それ以外ならWebのチュートリアル読んで仕様書読めば十分
なんでもええねん どっちかやってみてあかんかったらもう片方やってみたらええねん
>>545 それは一理ある。似た言語を触ってる場合、チュート&仕様書で十分
書けるようになるからね。
100%純粋な旧日本人の遺伝子で身体が構築された俺には 大陸から渡ってきて日本人に成りすましている似非日本人たる 関西人。その関西人の言語「関西語」は遺伝子的に我慢できない。 特に「大阪弁」
チラシの裏にでも書いてろ
日本列島に日本人と関西人が住んでいる。
>>546 わかってくれたらいいんだよ
もうそんな気持ち悪いしゃべり方はするなよ?約束だぞ?
関西人排除すんのがscala言語のコミュニティなんか レイシスト集団みたいやな。 別に、東北弁やろうが九州弁やろうがかまわんやろう?
入門書をざっと読むのを基礎と言われても…
じゃあ、何が基礎だよ?
TAPLを読むのが基礎、とか?
プログラミング初心者なら入門書から入れ Scala初心者ならWebで十分
もういいよその話は よその板でやってこい
でも本格的にやるなら、定評のある本でやったほうがいいよ。 コーディングスタイルもわかるし 注意点や考え方がわかるって大切だからね。 持っておけば辞書にもなる。
EffectiveやGood partsレベルの本なら辞書にもなるんだがな。 入門書じゃ辞書にはならんだろ。
動物本かprogramming in scalaのどっちかでいいんじゃない。どちらもある程度まで読み進めば、 あとは適当にwebで調べるなりどこかで聞くなり、どうにでもなるレベルに至るはず
日本語縛りか。
ああ、そういうことか 日本語縛りなら本のほうがいいかもね 日本語の情報が豊富なJavaとかならともかく、英語使えないのにScalaなんかに 手を出す奴ってなに考えてるの?
人格否定するほどの事じゃないだろ・・・
569 :
デフォルトの名無しさん :2011/08/05(金) 00:14:27.70
>>532 > 本腰入れて覚えたいんだけど、今からやるならどの本が良い?
◆1冊目 〜 入門編
「Scalaで学ぶ関数脳入門」
CとかJavaは多少分かるけど関数型言語なんてさっぱり、という方はまずこれを見てみよう。
もしくは、ある程度知っている人でも復習として読むのにおすすめ。
大変読みやすく書かれているので、短い時間で読むことができます。
◆2冊目 〜 Scala文法やライブラリの詳細
「ボクらのScala 次世代Java徹底入門」 または
「Scala実践プログラミング―オープンソース徹底活用 」
日本人が書いた本なので読みやすい。
和訳本にありがちな変な言い回しなどないのでサクサク読める。
Scalaの文法やライブラリを一通りざっと知ることができる。
◆3冊目 〜 Scalaマニアック
Scalaをマニアックにマスターするなら、次の2冊は定番中の定番なので押さえておくこと。
ただし、本の厚さとか重さもヘビー級なので手が疲れるので要注意だ。
「Scalaスケーラブルプログラミング 」
日本語版は表紙の絵がコップなので通称「コップ本」と呼ばれている。
「プログラミングScala 」
最新の定番本。
バージョン2.8の情報もあるのでぜひ読もう。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
532に対してのベストアンサーは、オレ様で決まりだな。みんな不親切すぎるぜ!
最初から3冊目のだけで十分でしょ
どうでもいい
また下らんのが出てるなw
>>569 がベストアンサーに一票。
FAQの回答ご苦労さまです。
>>570 いきなり3冊目からで済む人も少なくないのでしょうけれど、
関数型言語が初めてなら関数脳入門は外せないと思います。
コップ本ペラい紙使ってるから裏面の字とか透けてウザいっす
紙って薄いほうが高級なんじゃないの?
「本腰を入れる」ってもともとは真剣に子作りのために性交で腰を動かす というところから来ているって中学生の息子がしどろもどろに言ってきて、 町内会の会合で父さんあんまり「本腰を入れて頑張りましょう」ばかり 言うのは恥ずかしいからって・・・・。そうか?そうなのか?? 「褌をしめてかかる」「本腰を入れる」ともに古い日本では、特に重要な 子孫繁栄の辺縁から派生した言葉らしいのだが、そうか? そうなのか??
横からだけど、もう本当に学習時間を 短縮したい場合、最近はcheatCheet っていって、まあアンチョコなんだけど 検索してみると結構分かりやすいのがたくさんある。 これをざっと、ながめるだけでも この言語のポイントをおさえることができるのでみといて損はないと思う。ただし、いけてるものは英語です。 以上、参考まで。
>>569 取り合えず今日は一冊目を買って帰ろう。
ありがとう!
三冊も読むのか? 一冊で充分だろ。読むだけ君かよ。
いらなくなったら俺がタダでもらってやるから心配するな
>>581 無駄にたくさん買う奴も必要なんだよ
出版社に、scalaは金になるって思わせないとw
俺はコップ本だけでいいけど
Scalaの本を三冊も読むくらいならコップ本とHaskellの本を一冊読めよ
俺がscalazの旨みがわかんねーのはHaskell理解してないからなのかい?
ファイルを読んで一行ずつ処理するとき、どうしてる? コップ本のように scala.io.Source.fromFile("test.txt").getLines とやっても empty iterator しか帰ってこない… 結局JavaのFileReaderを使ってる。
手元の環境だと、普通に動くけど?
そうなの? こちらはバージョン2.9.0.1です。
resource(test.txt)へのパス指定が間違っているんじゃね?
Scalaの短縮表記?についてのまとめとかってある? conf setOutputKeyClass classOf[Text] とかいうコードを見て吃驚したんだけど、これって conf.setOutputKeyClass(classOf[Text]) と同じだよな?
TMTOWTDIなのがScalaのイヤンなところ しかもPerlよりも酷い
また頭の悪いやつが発生しとる
ゆろよろのアイコン見るたびに微妙な気分になる人いる? ほんとは不細工なのに、それなりに見える写真をがんばって選んだんだろうな、とか 何十回撮ったんだろうな、とかいろいろ考えてしまう ていうか笑ってしまう 俺ゆろよろをフォローしてるけど、アイコン見ると気が散るから、ほんとはつぶやかないでほしいんだ
そんな事をここに書かれても困るんだが
おまえどう見てもJava顔だろって奴がScalaを触ってたりする マジで不思議だ……鏡のない国に住んでるのかも………
なんかの改変コピペか?
java顔とscala顔の具体例を挙げてもらおうか
不細工なのに角度で誤魔化そうとするなんて… スイーツ思考^^;
マ板でやれ
>>578 > 横からだけど、もう本当に学習時間を
> 短縮したい場合、最近はcheatCheet
Cheat Sheet って、本来の意味は、カンニングペーパーのこと。
つまり、カンニングペーパーみたいに、箇条書きで要点をまとめたシートのこと。
個人的には、文法のCheat Sheet は要らねえから、
日常処理に使えるカンニングペーパーが欲しいなあ。
>>580 「Scalaで学ぶ関数脳入門」は、Scala以外にも役立つから、お勧め。
何かを素早く学習したかったら、複数の本を速読で読んじゃうのが効果的と思うよ。
もしも、業務で必要ですぐにマスターしたいのなら、
最初から5冊かって平行して速読しちゃうという手もある。
大学教授がそういう本の読み方をやっていた。
大学教授が「高校生でもわかるxxxx」みたいな超入門本を買っているから何かと思ったら、
その方が理解のスピードが全然違う。
お金よりも、時間の方が貴重だからな。
>>602 > 大学教授がそういう本の読み方をやっていた。
> 大学教授が「高校生でもわかるxxxx」みたいな超入門本を買っているから何かと思ったら、
> その方が理解のスピードが全然違う。
ごめん途中で送信しちゃったから追記するけど、
物事を速攻マスターしたければ、
厚くて詳細な本だけでなく、超簡単で平易に書かれた本も同時に買うのがおすすめってこと。
ただし、Scalaの場合、上述に上げた本よりも、ずっと超簡単な本が実はあるにはあるけど、
さすがにあれを買うのはおすすめしない。 あえてタイトルは伏せるけど。
改行馬鹿
電子メール準拠
超入門本で「マスター」かよw
文化ギャップのるつぼだな。
改行馬鹿はよくしゃべるなあ
>>608 ごめんな。
ここは2chだから、改行とか句点とか誤字とかはあんまり気にせず書くんだ。
ていうか、ここの連中、文句言う暇あったら、ちゃんと答えろよ。
>>590 への回答:
「そのとおり。省略するとそういう書き方もできる。
だが、省略しすぎは察しの通り可読性を下げるので、お勧めできない場面の方が多い。」
ネガコメして荒らそうとしてるの一人だろ。
出たよ可読性馬鹿 読みやすいように「Javaっぽく」書いたらいいと思うよ^^
>>612 じゃあ、>590の2つの書き方を比べたら、 上の方が良いって言っているわけね。
conf setOutputKeyClass classOf[Text]
conf.setOutputKeyClass(classOf[Text])
この2つの例で、ドット . と () の省略をしたがる人(
>>612 ) ってどういう考え方してるか教えてほしいな。
先に予想してみるけど、612は、大して有益な情報を出せない。
少なくとも、これまでは、612よりもオレ様の方が、>590にとって有効な回答をしている。
>>613 有効な回答(笑)
短縮表記のまとめとかってある?
↓
可読性が下がるので短縮しないほうがよい(キリッ
有効な回答ありがとうございます(笑)
Scalaのソース覗いてみればわかるけど 一つしか引数取らない場合は省略してることが多いよ その程度で読みづらいと感じるのは慣れてないだけ
慣れの問題じゃない 品質が悪くなる
品質っていうのは統一されていることが重要で、短い長いの問題ではない
糞に統一されても意味ない
620 :
デフォルトの名無しさん :2011/08/07(日) 11:24:11.35
この殺伐した雰囲気も含めてはやくScalaをマスターしたい
>>614 話そらすなよ?
614みたい話は誰も書いてない。 作り話を作って、逃げただけか。
お前の不親切な回答と、オレ様の回答とどっちが >590 にとって有効かどうかってことだ。
それは、>590が決めてくれればよい。
ただ、一点、オレ様も誤りがあった。 >612に謝罪したい。
「読みやすいように「Javaっぽく」書いたらいい」という 612の回答は褒めてやる。
590への回答としては、55点くらいの出来だ。
できればやれる子なんだから、 611より前に回答しろよ。やればできる子なんだから。
なお、 >532 へ最も有効な回答を示すことができたのは、オレ様である。
いっておくけど、 >569は、 >570 みたいな意見が出るのを知っていて、
でも敢えてあの行数でベストアンサーを出したのである。
(で、敢えて改行いっぱいつけたけど、これはスルーカを試してるんだからね!)
>>620 いや、この頭の悪そうな文体のやつは明らかにScala初心者だから一緒にしないでくれ
Scalaにも、 VBのOption Explicitみたいなのがあるとうれしいのだが。 個人的には、 行末の ; は、必須の方がうれしい場合がある。 たまに、改行を構文区切りと誤解されて、意図しない結果になることがあるので。 でも、; を省略して書きたいときもあるので、 VBのOption Explicitみたいなので切り替えれるとうれしい。
624 :
デフォルトの名無しさん :2011/08/07(日) 11:41:18.34
結論としては、Java 7でOK?
ScalaってJava7ぱくってる?
釣り針でかすぎんだろ
スルーしてくれって書いてから、自己レスしちゃいます。ごめんなさい。ごめんなさい。
>>615 > 一つしか引数取らない場合は省略
> その程度で読みづらいと感じるのは慣れてないだけ
確かに。この程度なら、慣れの問題かも。
いずれにせよ、省略を良しとするか悪いとするかは、時と場合によりますよね。
すみませんでした。殺伐としたふんいき(←なぜか漢字変換できない)になるくらいなら、スルーしてください。
>>623 REPLでもF#みたく;;で評価、みたいにしてくれた方がありがたいと感じる事あるな。
まぁ無いならしゃーないと諦めるしかないけど。
vimにfscとscalaコマンドをキーマッピングしてからメッキリREPLを使わなくなった。
>>630 REPLで、ユーザが思った「ここからここまで」をひととおりまとめて評価して欲しい場合は、{で入力を始めるのが有効かと。
ちなみに、最近のEclipse Scala PluginのREPL連携機能は結構便利。エディタ上で選択した行や範囲をREPLで評価して結果表示してくれる。 Emacsとかにもあるけど、IDEとかでもそういうのをしたいときはあるので、お勧め。
eclipseのplugin もう一息かな
技術ではなく心構えでプログラミングをしようとする人がいますね
>>629 メソッドが二項演算子的に作用する時は、ドットを省略しても良いと思う。
それ以外の場合は、あまり意義を感じない。
637 :
590 :2011/08/07(日) 16:11:34.34
みなさんありがとうございます まとめ、っていうほどでもなく、 ・「ソース読んで慣れろ」 ・「もしくは省略すんな」 というスタンスなのかな? 関数適用の()の省略なら、 関数型言語と言えば当たり前かもしれないんですが、 "."まで省略するのはすごく抵抗が。 conf setOutputKeyClass classOf[Text] だと、confっていう関数に順次適用してると、 パッと見、見えてしまいました。 (それに加えて"."が省略可能だというのも初見でした)
638 :
590 :2011/08/07(日) 16:19:28.33
"."を省略する部分に関する説明を見つけました Programming in Scala,2nd,p82(Sec5.8) When you write "s.indexOf('o')", indexOf is not an operator. But when you write "s indexOf 'o'", indexOf is an operator, because you're using it in operation notation.
>>637 可読性が下がると思えば省略しないけど、Java厨のためにわざわざ省略しないでおくってことはしないスタンス
省略はx.op(y)をx op y、z.op()をz opと書くための シンタックスシュガーなので、必要に応じて使い分ければいい。
実際はいかにもメソッド的なもの(例えばappendとか)も 省略記法で書いてあることが多いから、 自分のコーディングルールはともかく、 普通に読めるようにしておいたほうがいい
>>637 オレ様君が困ってるだろうが
もっとプログラマ初心者のように振る舞えよ
DSLは難しいねー。表面的な可読性の高さは良いことなんだけど、 トラブった時にデバッグが難しいのでは本末転倒だし。 浅海さんも、エラーメッセージが暗号になるのは良くない、みたいなことを言ってたな。
DSL?
DSL危険だろ Java7で我慢しろ
sealed classとパターンマッチとNothingがあればJavaでもいいんだけど
>>643 matzはどうしてこう素人みたいなイチャモンをつけるかね
こんなものが困難なわけないでしょ
RakeみたいなRubyのDSLは「きれいなDSL」で、 Scalaの括弧省略は「困難」な記法なのかね その基準なんなんでしょうね
x should not be zero は should と be がメソッド x should be zero になると should と zero がメソッドか こんな書き方されたら嫌だな
実際にはScalaもRubyも糞なのにね
>>649 フラットすぎるという印象はあるなあ。英文を読んでるみたいだ
Rubyの場合はメソッド呼び出しのドットが区切りになるのと、
あとはちょっとした文法上の省略ができるってだけなので、
呼び出し関係は読み取りやすいように感じる
ただ、Scalaのルールであれば、
より自然言語に近い記述ができるかもしれない
しばらく自重していたのですが、それなりにやわらかい書き方も覚えてきたので、ちょっと復帰してみます。
>>648 matzさんとは一応顔見知りではあるのですが、matzさんご自身が本当にイチャモンをつけているとは思っていないです。
今の自分の考えは、メンタルモデルの違いが、私とmatzさんのすれ違いの原因ではないかというものです。
私は、一応構文解析屋出身なので、パーズルールが明らかに簡単なScalaの方が、パーズするのも楽だと思って
しまうのですが、matzさんはパーズルールの複雑さとは別の観点で、「パーズの困難さ」を考えているのではないかと思います。
エヴァンジェリスト(笑)が来たぞーー!!!
>>656 うっとうしいようでしたら退散します。エヴァンジェリスト(笑)というのはその通りでしょうね。
まだまだ色々訓練が足りてないです。
なんか最近荒らしが来てるからスルーした方がいいよ、うん。
>>655 > それなりにやわらかい書き方も覚えてきたので、
どこがだよw
ってかなんか根本的に勘違いしてるよ、うん。
ルールが簡単と言われても、Scalaという言語内では簡単なだけで、門外漢の人には異様に映るってことをいってるようにも思える。 Javaから来た俺にはScalaもRubyも異様に映った。ルールが簡単かどうかより慣れが重要だった。 つまり、この件ではmatzは自己否定を含んだ批判をしているように見える。
メソッドチェーンを英語みたいに読めるようにしてるのがキモいってRailsでも言われたことなんだよね こういうのはアメ公がよくやることで、matzの近視的な批判は全部ブーメランなんだよね
まああれだ、いわゆる「Lispはパーズし難い」みたいなノリだ もちろんLispのパーズルールは単純極まりないが、 凡人にはあの入れ子がパッと見でパーズし難いという感じ
しかし単項メソッドでそこまでやっといてifやwhileの条件式にかっこを要求するのはどうなのよ? もちろんJavaとの類似性を重視したのだろうけど、中途半端だ。
ifを関数で定義するならシグネチャこんな感じでしょ(elseのことは考えないとして) def myIf[T](b: Boolean)(block : => T): T = ... この関数条件式のかっこ省略して呼びだしたりできないのでまあいいんじゃね?
TとUnitのスーパークラスか...
久々に、「Scala 日本語情報サイト」見てみたら、ドキュメントの和訳が増えていた気がする。 バグ報告窓口って言うのはあるけど、要望窓口とかいうのはないのかなあ? 上述のOptionExplicit 欲しい。 他には、逆引きScala みたいなまとめってないのかなあ?
>>658 2chのレスの80%は、たったの20%の人が何度も投稿した結果によるものです。
2chを見る人の80%はReadOnlyで、書き込みする人はたったの20%にすぎません。
これを2chにおける パレートの法則といいます。
荒らしの書き込みする人って、一匹見かけたら影に大量に隠れているかのような印象を持つかもしれないけど、
実際は、一匹がなんども出現しているだけ。
その一匹がまき散らした汚物のせいで、スレ全体が荒れて汚染されてしまうので、しっかり駆除することが重要だ。
>>667 荒らすなよクズ
これだから自覚のない馬鹿は
人の少ないスレは、煽り耐性の低いクズが一匹いるだけですぐゴミスレになるな
関係ないけど、色んな感情を溜め込んでるくせに 2chで発散しないでロムってるだけの奴って現実で何するのか怖い
俺は溜め込まないキリッ 俺はww発散すwるぞwwwデュクシwwwww とか言ってれば、スレ違いが許されると思ってる馬鹿 関西人や韓国人と同レベル こういう馬鹿にプログラミングは無理
頭から論理がスッポリ抜け落ちたウヨにも無理
また御大に喧嘩売ってる
>>673 お前自身が、Twitterフォローするのやめればよいのでは?
いちいち他人に気にし過ぎなのでは?
あと、お前、わざわざ2chに書き込まなくて良いから。
>>666 バグ報告窓口がまだちゃんと出来ていないので、まずそこを設置する予定です。
これは、JIRAのライセンスを買ってあって、サーバも借りてあるので、今度の休みくらいに
やりたいところです。要望窓口も、設置したいところですが、どういう形式がいいでしょうか?
Scala日本語情報サイトは、多くが自分一人で更新していて、人手と時間が足りないので、要望
出してくれるだけでも助かります。特に、翻訳が稚拙な部分はなんとかしたいところ…
逆引きScalaみたいなのは、あちこちに散らばってる気がしますが、まとめたいですね…
個人的にWikiオンリーだと、あまりうまく行かない気がしてるので、日本語情報サイトの中に
Wikiを設置する、という事を考えています。もちろん、他の方が好きな場所でやってくださっても
構わないと思います。
REPLで、 > val a = new DynamicVariable("a") > val a.value = "b" > val a.value ってやると"a"が返ってきてしまうんだけど、これは何で?
>>654 Eclipseは知らんけど、IntelliJのプラグインだとスペース入れたらメソッド補完してくれるよ
以前getLinesについて質問したものですが、こういう報告って どこにすればいいんでしょう? 本家? --- scala 2.9.0.1で以下のようにgetLinesがうまく動きません。 環境はwindows XP, cygwinからです。 scala> val s = scala.io.Source.fromFile("t.txt") s: scala.io.BufferedSource = non-empty iterator scala> for(l <- s.getLines) print(l) scala> for(c <- s) print(c) abc def ghi なおt.txtはShift_JISで改行コードはCRLFです。
>>678 REPLじゃなけりゃ動く
あるいは
val s = scala.io.Source.fromFile("t.txt").getLines
でもOK
詳しい説明は任せた↓
>679 おお、確かに! 不思議ですね。
TLSによる実装でREPLのスレッドの使い方と親和性無いんじゃないかな。 scala> {val a = new util.DynamicVariable("a"); a.value = "b"; a.value} res7: java.lang.String = b
REPLは問題山積だな。 しかしpackage宣言くらい通らんものか。
clojure→シンプルなのに表現力豊か scala→無駄に複雑
無駄と感じるのは勉強不足。
F#ならまだしもClojureはもう眼中にないわ
オブジェクト指向(笑)
なにやら見えない敵と戦っている人が
イニシャルトーク(笑) 使えない特定厨だな(笑)
本人にダメージが入ればおk w
どうでもいいから技術の話をしろ。
>>692 しろってなんだよ
お前がすればいいだけでは?馬鹿?
x技術 o言語
変なのが湧く程度には有名になったってことだよなScalaも
誰かStack Overflowの日本語版作ってくれ。そっちに移住するから。
しまった asInstanceOf[] より type ascription 使うほうがいいのか
matchにおきかえれるように構造を見直すのがベスト
2.9.1 RC2
-nobootcpのバグが治ってるー という夢をみた
;;
class Rational(n:Int, d:Int) { private def gcd(x:Int, y:Int): Int = { if (x==0) y else if (x<0) gcd(-x, y) else if (y<0) -gcd(x, -y) else gcd(y%x, x) } private val g = gcd(n,d) val numer:Int = n/g val denom:Int = d/g //略 } 本やWeb上で見かける例なんだけど、gは初期化の時しか使わないからフィールドである必要ないんだけど プライマリコンストラクタで一時変数みたいのは定義できないのですか? Rationalがgをフィールドに持つのは無駄なんですけど
>>704 locallyというのがあるのですね。ありがとうございます。
しかしlocallyの中でgを定義しても
val numer:Int = n/g
の所ではgはスコープの外になって未定義になってしまいます。
numerをvarで宣言してlocally{}の中で値を設定すればできますけど。
706 :
デフォルトの名無しさん :2011/08/16(火) 15:31:47.56
nもdもgcdに渡して戻り値をタプルにするか、 nもdもgも受け取るメインのコンストラクタにするかって解決策しか浮かばない もっと良いやり方がのかもだけどそこまでscalaを使いこなせてない。
>>705 ありきたりだが、こんなのとか。
class Rational(n:Int, d:Int){
private def gcd(x:Int, y:Int): Int = {
if (x==0) y
else if (x<0) gcd(-x, y)
else if (y<0) -gcd(x, -y)
else gcd(y%x, x)
}
val (numer: Int, denom: Int) = {
val g = gcd(n, d)
(n / g, d / g)
}
}
>>706 >>707 ありがとうございます。タプルにすればできました!707をそのまま打ち込みました。
こんなふうにできるとは知りませんでした。
コップ本の第2版が出るのか 前からあんまり時間経ってないから買う気しないな
良書には下手に入門帯を付けないでほしい 「言語設計者がその思想を解説」でいいんだが コンセプト&コーディングじゃ掴みがわるいですかそうですか 編集「とりあえず入門って買いときゃ売れるんだよwwww」 みたいな出版はノーモア
4830円とか何様のつもりだよw
誰か炊いてくれ
当然自炊 最初から電子書籍だといいのだけどこの国は
716 :
デフォルトの名無しさん :2011/08/19(金) 01:46:25.66
2.9.1 RC3
こないだScalaスケーラブルプログラミング買ったばっかなんだけど・・・・
経費で落とせるから問題ない
>>717 Scalaアンバサダーに任命してやろう
720 :
デフォルトの名無しさん :2011/08/19(金) 10:47:22.52
だから代数データをもっとふやせよぼけおだ。 毎回毎回Seq,Set,Mapでつくってかなきゃならないからボトムアップ的にならざるを得ないんだよ。 Javaのオブジェクトではなくて、代数データ型でもっと色々なライブラリを用意すべき、 そうでないとボトムアップ的なプログラミングしかできない。 そうでなくても関数型はボトムアップになりやすいのだから。 すべてのぼけどもへ
いまさら
はっきり言って、強く型付けされていない言語なんて使い物にならん。 もっとはっきり言えば、型とか知らない連中がわかった気になって型なんかいらないとか言ってるだけ。 もっともっといえば、「自由」でなくなるとかいってるやつは、本気の馬鹿?型があっても何も不自由になりませんし、 そんなところに[自由」とか持ち出す完成がまじ引きこもりの中2病 こんなところだな。
楽な部分がいっぱいあるよ。 例えば数字が記入されてるテキストファイルを読み込んで、合計を求めるとか使い捨てツールを作る時とか。 PHPとかならサーバの環境構築も楽チン。 もちろんしっかりした物を作る場合はバリデーションするから結局、型ありと同じになるからそれなら最初から...って話になるけどね。
実際スクリプト言語(弱い型付)で書かれた使い物になるものが世の中にあるわけなんですがね。
型をガチガチに固めてしまうと、色々な型に通用するような汎用的な処理が書きづらい。 例えば、filterやmapcarみたいなリスト処理(中身の型は決めることが出来ない)とかね。 ジェネリクスとかで多少の対応は出来るが、型を考えてる時間が長くなるし。 それだったら本筋のロジックに集中したいよ。
おまえらが勝手に頭の中で作り上げている型にたいして、いちゃもんつけているだけwww filter,map, リスト処理、型付きでもまったくがちがちになりませんwww ジェネリクスとか型の世界で言えば風のヒューィレベルwwww
風のヒューイて何?
>>723 みたいな頭の硬い人はSIErに多い気がする
sierはぷろぐらみんぐなんてしないだろ
実際頭が固くて&頭が悪くて&自分が理解できないものをけなすことで自己保身しているのが どっちなのかなんて明らかなんだけど。型なしが良いとかいってるのは そのほとんどが狭いコミュニティでなれあってる引きこもりプログラマw
732 :
デフォルトの名無しさん :2011/08/20(土) 17:07:17.64
Ruby 厨が必死に CoC の素晴らしさを伝えてる姿を見ると、 そうだその先に静的型付言語の世界があるのだ、あと一歩だ頑張れ、と目頭が熱くなります。
>>731 いやどっちが良い悪いではなく、どちらにも長所短所があるという話よ
いやどっちも長所短所があるというはなしじゃないんだよ。 そこがもうほとんどまちがっている。 どこからどう見ても、型があった方が良いという話なんだよ。 わかってないやつばっかw
>>730 前から不思議に思ってたんだが、System Integratorの略がなんでSIerになるんだ?
SI は System Integration だろう。違うのか?
>>735 System Integrate をする人って意味
(´-`)。o0(なにか嫌なことでもあったのだろうか…)
静的なScalaスレで何言ってんだ Rubyとかそれ系のコミュニティで発言して来いよ そもそもお前のいう使えない言語を作ってるのはどんな人間でどんな言語で作ってるのかってーの
スクリプト言語+作り捨てWebフロントでバカにも雇用ができて喜ばしいことだが、 バカ故に自分たちが時代の最先端開発とか勘違いしてる奴が多すぎて萎える。
そのとおり、ぽっと出の馬鹿が何も知らずに最先端きどっって、さらにエンジニア、プログラマ気取り、 すくいよーねーなw
糞スレに誘導すんな
ま、いまどき、ruby,perl,pythonとかいってるやつは少なくともプログラミングと言う観点からは素人だなw
Unix系のやつらはCを補完する形で使ってるよ
解決策を1つの言語に詰め込もうとしていた日々は、消え去ろうとしています。 私たちは、JavaとCLRという優れたマネージド・ランタイムを持っているので、 よりよいツールを使ってそれらのプラットフォームを利用するべきです。 多言語プログラミングは、重要な仕事をする既存のすべてのコードを捨てることなしに、 解決策をミックスし適用する事を可能にしてくれます。これらの2つの実績あるプラットフォームで 爆発的に新しい言語が開発されています。開発者として、仕事により適したツールを使って、 より良いコードを書くことが出来るように、この正調を活用する方法を学ぶべきです。 [The ThoughtWorks Anthology 4章 多言語プログラミングより]
>>744 Perl,Pythonはともかく、Rubyは興味深い所を持ってると思うし、簡潔で強力だと思うよ。
matzが多言語の良所を把握出来る言語オタで良かったと思う。
静的型付けが無いのは個人的にいただけないけど、そう馬鹿にしたもんでもないかと。
Perl,Pythonにしても、バッドノウハウの轍を踏まないようにその悪所を見る意味はあるかと思う。
んで、玄人様はどんな言語を使ってるんで?
素人のぼくちんに教えちくり
matzは型については素人に付け焼刃つけた程度w
具体的に何がダメなのか全く説明が無いよね この時代に言語単位レベルでよくもそこまで人を馬鹿にできるな
人を馬鹿にしてるんじゃない、型があるほうがないよりいいって言うあたりまえのことをいってるだけw これくらいで人を馬鹿にすることになるなら、どんな人だってどれだけの人を馬鹿にしていることになるか かんがえたほうがいいよwwwwwwwwwwwwww
だから何でなのかその理由をかけよ
ないよりあるほうがいいにきまってるだろ。 むしろ無いほうがいいとかいってるやつの方が理由を書くべきだろ。あほかw
オライリー本は難しそうで避けてきたけど、Scalaのやつは理解出来そうかも
静的型付けだとヘテロなリストとか作るの面倒くさいだろ…
ヘテロなリスト(笑)で問題起きた時の分析のほうが面倒臭いわ。
756 :
754 :2011/08/21(日) 00:09:10.55
いや「だから動的型付けを使うべき!!」とか言ってるわけじゃなくてね… 使い分けたらいいんじゃないですか、って言ってるんですよ ちょっとした使い捨てツール書くときでも型に縛られたいマゾヒストさんなんですか?
たまにそういうドMを見かける
ちょっとした使い捨てプログラムの話は動的vs静的でありがちなネタの1つだな そのうち静的型チェックとテストの話やリファクタリングの話になるのかな
強い型付けと静的型付けが混同されている気がしてならない
動的で強い型付けなんてあんの?
python
静的な型づけでもヘテロなリスト簡単に作れるだろ 強い型づけというのは”強さ”が何を意味するのかわからん
subtyping, gradual typing , parametric polymorphism こんなんどんどんいれていけば、 もう強い型づけと弱い型付けのちがいはあるにしても、明瞭なくべつはなくなっていくだろう。 int , float, string のリストをつくったとき 型システムA⇒タイプエラー 型システムB⇒int,float,stringのleast upper bound 型のリスト … 全て静的な型づけだけど、その強さはちがう
Scala等で↓のような関数を定義しようとすると、 型システムを黙らせるためにクラス等を持ちださなければならないので面倒。 def f(a:Int)(b:Int) = (a+b, f(a+b))
それバグってるから黙らせちゃアカンがな
静的型言語で実行できないプログラムはすべてバグですかそうですか。 これじゃ動的型言語で簡単に書けるケースをいくら挙げても無駄だわな。 ちなみに、こうすればScalaでも実行できるけど、わざわざこんな風に書き換えるのは面倒。 case class f(a:Int) { def apply(b:Int) = (a+b, f(a+b)) }
いや、もうちょっと役に立ちそうな例を挙げろよ アホすぎて突っ込む気にもならん
反論できないと「役に立ちそうにないから」とか言い訳を始めるとか、予想通りすぎるw このプログラムは、副作用を使わずに合計を保持する関数。 自分がPDFのラスタライザを作ったときに問題になった箇所のエッセンスを取り出したものだ。 PDFのラスタライザが役に立ちそうにないとでもいいたいのか?
つまりカリー化をそなえた動的型言語が最強ってことですね、わかります でも、Perl, Ruby, Pythonってそうだったっけ?
>>770 それがエッセンスかどうかは、PDFのラスタライザ作った事が無いので判断できませんが
静的型付けで型が付きにくそう、という点でうまいところをついていると思います。ただ、これが
静的型付け言語で実行できないか、というとそういうわけでもなく、equi-reqcursive-typeという
型システムがあれば、実行できます。Scalaはequi-recursive-typeそのものをサポートしてない
のですが、OCamlだと-rectypesを付ければ実行できます。たとえばこんな感じです。
>ocaml -rectypes
Objective Caml version 3.11.0
# let rec f a b = (a+b, (f (a+b)));;
val f : int -> (int -> int * 'a as 'a) = <fun>
# f 3 4 ;;
- : int * (int -> 'a) as 'a = (7, <fun>)
# fst (f 3 4);;
- : int = 7
# (snd (f 3 4)) 5;;
- : int * (int -> 'a) as 'a = (12, <fun>)
このスレでOCamlを出すなんて酷いw
さあ、次は first class polymorphism の例を探すんだ
Rubyが最強ってことだろ
バグではなかったw
>>772 -rectypesを使わなくても似た事は出来るしね
> ocaml
Objective Caml version 3.12.1
# let rec f x y = `F(x + y, f (x + y));;
val f : int -> (int -> [> `F of int * 'a ] as 'a) = <fun>
# let `F(a, g) = f 3 4;;
val a : int = 7
val g : int -> [ `F of int * 'a ] as 'a = <fun>
# let `F(b, h) = g 5;;
val b : int = 12
val h : int -> [ `F of int * 'a ] as 'a = <fun>
型なんてある意味無いだろ 複雑化するし有害
動的型付けでも型はあるんだぜ
で、Scalaでこのようなのを定義したい場合、無理やりequi-recursive-typeをエミュレートすることもできますが、 それやると型が複雑になるので、これくらいでとどめておくのが良いような気がします。 scala> case class FTuple[X](_1: X, _2: X => FTuple[X]) defined class FTuple scala> def f(a: Int)(b: Int): FTuple[Int] = FTuple(a + b, f(a + b)) f: (a: Int)(b: Int)FTuple[Int] scala> f(3)(4) res0: FTuple[Int] = FTuple(7,<function1>) scala> res0._1 res1: Int = 7 scala> res0._2(5) res2: FTuple[Int] = FTuple(12,<function1>)
>>777 はい。Polymorphic Variantでエンコーディングはできるだろうなーとは思ってました。ただ、一応
直接的なサポートが静的型付けで可能ということで、-rectypes使ってみました。Scalaで同様の
エンコーディングをしようとすると、型推論が弱いせいで、型注釈が複雑になるのが欠点ですね…。
どうして、Scalaは再起の返り値を型推論してくれないんでしょう? なんか理由がある?
静的つっても型システムは一種類じゃなくて 言語やオプションによっても変わりうるのに だた「型」としか言われない不思議
>>782 再帰型じゃなくて、再帰関数の返り値型を推論してくれるかどうか、ですよね?
理由としては、Scalaの型システム上で一般的に再帰関数の返り値型を推論する、
健全で完全な型推論アルゴリズムを作るのが困難(ひょっとしたら決定不能かも)だからかと。
再帰関数のテキトーなサブセットについて推論するアルゴリズムを構成するのは難しくないと思いますが、
中途半端に頑張られても帰ってややこしいので、今くらいの割り切りで丁度いい気もします。
>>783 おっしゃる通りですね。「静的型付け」 VS. 「動的型付け」論争がよくありますが、実際には、
一口に「静的型付け」と言っても様々なシステムがある、という事はもう少し知られても良い気がします。
786 :
766 :2011/08/21(日) 12:23:28.12
>>772 ,777,780
以前静的型言語でこの問題に引っかかって、
>>768 の方法で回避したけど、
もっといい方法があるんじゃないかとずっと気になってた。
結論としては、OCamlなら可能 (Scalaだと作りこみが必要) ってことかな。
OCamlはやったことないけど、今度処理系を入れてみるわ。
>>784 多分そうだと思うんだけど、むずむず気持ち悪いので証拠が欲しい。
推論できない反例とかある?
「この論文に書いてあるから嫁」でもいいよ。
>>787 反例はちょっと考えて見ます。
論文については、何らかの型システムを対象にして、完全で健全な型推論アルゴリズムを構成できる/できない
とかいう「全体的な」話が書いてあるものはよく見かけますが、「返り値型の型推論に限定」した場合の型推論アルゴリズムの
決定不能性についてはちょっと読んだことがありません。自分は型システム専門じゃないので、あるいはそういう論文が
あるかもしれませんが。
でもこういう再帰を返り値とする構造ってScalaのコンセプトである スケーラビリティな方向への拡張性を活かせないんじゃないの 線形なリストにしてmap/reduceって作りにするのじゃだめなんですか?
791 :
766 :2011/08/21(日) 17:38:01.08
>>789 もしかして私へのレスでしょうか。
PDFは内部的にパス描画モードやテキスト描画モード等を切り替えで描画しており、
さらにモードごとに異なる内部状態を保持しなければなりません。
そのため、モード切替の命令が来たら、そのモードを専門に処理する関数を返すような設計にしようとしたのです。
できるだけ副作用に頼らないという方針だったのでこのような設計になりましたが、
副作用を使っても構わないのであれば、線形なリストにすることも可能だと思います。
でもそれだと、自分の当初の方針から外れてしまうのです。
で、結局この言語の読み方はスケーラなの?スカラなの?
>>791 本題からそれてしまいますが、その話だけ聞くと、あえて
>>766 のような構造にしなくても良いように感じてしまいます。
>>772 でレスした時点では、静的に型付けしづらいサンプルという意味で面白かったのと、
>>766 のようなコードの
実際の使用局面がよくわからなかったため、本当に必要かどうかは問いませんでしたが。
794 :
766 :2011/08/21(日) 18:14:32.62
>>793 まず、
>>770 では実用コードで直面した問題だったと主張したかっただけで、
それがPDFを解釈する上で必ず必要になると言いたかったわけではありません。
あのような構造にしたのは私の趣味の部分が大きいです。
>>769 に反論するために誇張してしまいました。すみません。
実際の構造としては、ここの「なんでも再帰」にあるような相互末尾再帰的な作りにしようとしていました。
ttp://practical-scheme.net/docs/tailcall-j.html しかし、一般的な言語だと、末尾再帰が必ず最適化されるとは限らないため、
スタックオーバーフローを防ぐために、
次に呼び出したい関数をいったん呼び出し元に戻り値として返し、
呼び出し元から呼び出すという作りにしています。
PDFの解析にこんなむちゃくちゃな 実装必要なのかメンドイな
PDFの元になっているPostScriptが、スタックマシーンだった。
また静的型付けの勝利だなwwwwwwwwwwwwwwww
>>794 なるほど。了解しました。それなら話は理解できます。
>>766 のような構造が本質的に
必要、という主張なのかと思っていました。すいません。
> 次に呼び出したい関数をいったん呼び出し元に戻り値として返し、
> 呼び出し元から呼び出すという作りにしています。
これは、Scalaだとscala.util.control.TailCallsで末尾呼び出しの最適化を
エミュレーションしてるのと同じようなテクニックと考えてOKですか?要は
トランポリンの一種ですが。
例えばreduceを使ってて、後で実装を置き換えられるようにreduceを引数で渡す場合、 Scalaではどう書いたら良いですか? 下のはPythonで書いたサンプルです。 def f(my_reduce): g = lambda x,y: x + y a = my_reduce(g, [1, 2, 3]) b = my_reduce(g, ['a', 'b', 'c'])
802 :
766 :2011/08/21(日) 23:11:26.85
>>800 >これは、Scalaだとscala.util.control.TailCallsで末尾呼び出しの最適化を
>エミュレーションしてるのと同じようなテクニックと考えてOKですか?要は
>トランポリンの一種ですが。
その通りです。
ただし、PDFの命令列を持ちまわるのが嫌だったので、単独の命令を毎回渡す仕様にしています。
正直、TailCallsの存在は忘れてました。
命令列を持ちまわるようにしてTailCallsを使えば、あのような構造は必要なかったでしょう。
まあ、このプログラムはScalaで作ったわけではないので関係ないのですが。
ま、うえでいろんな人が形を変えていってたけど、 型システムといっても色々あるってのをわかってないんだよ。 で、自分がわかってないのを棚に上げて、というか、わかってないからこそ、動的!動的!といってるだけw ま、極論を言えば、型なんかいらないとかいってる本気の馬鹿は、syntaxなんていらないといってるのと同じだよw どんな動的言語(なんだそれw)にでも制限はあるからね、その制限が何かしらのinvariantをさしていることがわかってないんだよw
>>801 ランク2多相をどうエンコードするかという問題(Scalaはランク2多相の言語レベルサポートが無いので)ですよね。
とりあえず、解いて見ました。
まず、加算だけできる型クラスがScalaには標準で無いので定義してやります(Numericは必要なメソッドが多過ぎるので×)
scala> trait AddT[X] { def plus(a: X, b: X): X }
defined trait AddT
型クラスのインスタンスも作ってあげます。
scala> implicit object IntAdd extends AddT[Int] { def plus(a: Int, b: Int) = a + b }
defined module IntAdd
scala> implicit object StringAdd extends AddT[String] { def plus(a: String, b: String) = a + b }
defined module StringAdd
問題はその後です。
>>801 の例は、my_reduceを異なる複数の型に適用しているもので、直接的に書くには、ランク2多相性と呼ばれるもののサポートが必要です。
これはScalaでもMLでもOCamlでもHaskellでも標準ではありません(Haskell(GHC)はpragmaでONにできますが)。
これをランク2多相が無い言語でやるのは少し骨が折れますが、書いてみました。
scala> def f(reduce: { def apply[A:AddT] : ((A, A) => A, List[A]) => A }) {
| def g[A:AddT](x: A, y: A) = implicitly[AddT[A]].plus(x, y)
| println(reduce.apply[Int].apply(g, List(1, 2, 3)))
| println(reduce.apply[String].apply(g, List("A", "B", "C")))
| }
f: (reduce: AnyRef{def apply[A](implicit evidence$1: AddT[A]): ((A, A) => A, List[A]) => A})Unit
scala> f(new { def apply[A:AddT] = (f: (A, A) => A, lst: List[A]) => lst.reduceLeft[A](f) })
6
ABC
このコードが何を意図してるのかは、説明すると長くなるので、ランクN多相とかでググってくださると助かります。
806 :
801 :2011/08/22(月) 00:22:18.17
>>804 >>805 丁寧な解説ありがとう。
直接書くとfの引数のところでmy_reduceの型がどれか一つに固定されてしまうのを
Scalaではこうやって避けるんですね。
お前らがなに言ってるのか全然わからん だからお前ら出入り禁止な
難しそうに見えても、言ってることは別段難しいことではないよ。 キニシナサンナ
>>808 そうですね。実際の所、概念としてはランク2多相とか特に難しくはないと思います。
説明の手間を省くために、既存の用語を使っているだけの話なので。
>>753 他のオライリー本と比べて特段どう、ということは無いと思うが
このスレのおかげで、動的型付けの方が ロジックに集中できると再認識できたw
812 :
デフォルトの名無しさん :2011/08/23(火) 17:51:19.50
ランク2多相とか完全な型推論できないしな やっぱ動的型最強だな
scala> res811.replaceFirst("ロジックに集中できると", "自分の能力の限界が")
静的型言語でできないことで動的言語でやって許せるのはダックタイピングくらいだな
>>801 の例もダックタイピングに近いけど
evalとか見ると死ねと思う
動的型付け言語であっても、 evalはかなり抑制的に使われるのが普通だと思う
ロジックに集中ってことばほんと馬鹿っぽいよな 実際、型こそロジックなんだよ。 型を考えるという部分のみがロジックであってあとはアルゴリズム。
んじゃアルゴリズムに集中でいいよもう 何れにしてもどちらも長短あるんだから どっちか片方が優れてるとかは無い
いや、型がある方が無いより優れているに決まってる。 型システムはあったほうがいい、で、オプションでもっとも緩い型システムに変更できるようにすればよいだけ。
緩くしすぎたら型推論が停止しない可能性があるのと違うん?
完全性を諦めればいいだけ、というか、完全性がある型推論持ってるのってOCamlくらいか?
Type system を緩くというのは、単に型なし(というか静的な型チェックをどんどんしない方向)に 近づけていくということなのでは?
そんなに型が嫌いならpythonでも使ってろよタコ。 ところでscalaでオススメのWAF教えてください。
WAFって何よ?
824 :
609 :2011/08/24(水) 00:46:16.48
型システムが決定不能になることはない。アノテーションつければよいだけ。 (型システムが決定不能っていいかたは少しおかしいのかな??) 型推論は決定不能に陥ることがある。
>>822 型を嫌ってる人はこのスレには居ないと思うが…
居るのは、両方に長所と短所あるって人と
型ありが絶対的に優れているって人だけでしょ
Web の画面まわりは Java でもリフレクションでメタ記述しまくりだから 動的型附言語でも変わらんな。
実践なんとかみたいな新刊でてない?
>>822 煽りにマジレスもなんだが、Pythonは、"強い"動的型付言語だから、かなり型を意識しないとロジックを組めないんだが…。
WAFってWebApplicationFrameworkのことか?知名度からいえばLiftなんだが、俺はScalatraのが好きだな。
>>830 そこ、Paul Phillipsもコメントしてるけど、たぶん仕様の範疇内。val 1 = 2は単にパターンマッチで
失敗してMatchErrorが飛ぶだけ。REPLのトップレベルで val 1 = 2がコンパイルエラーになったりする
のはREPLのバグっぽい気がするけど。
Javaから来た人は val がパターンマッチなことに驚き、 関数型言語から来た人はパターンが網羅的でないのに コンパイル時に警告が出なくて驚く
どっちつかずで中途半端なものは結局廃れるってことだよな。
継承するかもしれんから網羅的にこだわるわけにもいかんだろ sealedを付ければチェックしてくれるがな
驚き最大の法則を採用 一度びっくりしたら忘れないから
>>835 お陰で好き嫌いがハッキリ出る言語だが。。。
一度嫌ったプログラマは2度と触ろうとしないんじゃないか?
そうなのか Haskellあたりなら極端な拒絶反応というのもわかるが ScalaとかC#あたりはあまり極度に嫌いというやつは見ない気が
>>837 むしろhaskellは嫌いになる前に挫折するか、壁を超えて好きになるかだと思う
(単純すぎて分からないとかかも。自分もそうだったし)
ScalaはjavaやC/C++に慣れた人にも、関数型言語に慣れた人にも中途半端で気持ち悪く映るんじゃないかと
(Cやjavaっぽい文法のScalaだった方が良かった気がする)
関数型に慣れた人間が気持ち悪いというのは理解できるが、 Javaやってた人間が気持ち悪がる理由がわからない
コンストラクタとクラスのメンバ宣言がまざってるところとか?
そこはむしろ気持ちいい
>>841 そうかなぁ
かなり筋が悪い設計だと思うけど
コンストラクタで何か処理したいときはlocallyで囲っちゃってる
F#使いの皆さんに明示的コンストラクタと暗黙的コンストラクタどっちが好きか聞いてまわれば決着つくかもなw
>>839 TMTOWTDIを良しとするかどうかでしょ
846 :
デフォルトの名無しさん :2011/08/25(木) 22:23:09.00
俺はHaskell使いだったが、Scalaは気持ちいいところがいっぱいあるよ。java見たいに使えるし。
>>846 HaskellかScalaを勉強しようと思っているんですが、
Haskellと比べてScalaの気持ち良いところと、
逆にScalaと比べてHaskellの気持ち良いところを教えて頂けませんか?
848 :
847 :2011/08/25(木) 22:27:08.26
あ、後者はあったらで良いです。お願いします。
sbtのバージョンとかややこしくてよく分からん もういい、sbtなんて俺にはもういい・・・
テンプレ的でいいならいくらでもあるだろ 参照透明性とか遅延評価とか、型推論もHindley/Milner方式だしな 所詮Scalaは関数型の機能をオブジェクト指向言語の中で再現したものだからな キモいっちゃキモい
>>849 よう、一ヵ月前の俺
はやくこっちへきてSpecs2と格闘しようぜ
specs2はテストが並列実行されるから そのへん気を付けないとハマるよね
>>850 Haskellの利点として、
>参照透明性とか遅延評価とか、型推論もHindley/Milner方式だしな
は賛成しますが、
>所詮Scalaは関数型の機能をオブジェクト指向言語の中で再現したものだからな
は、異論があります。これは、関数型とオブジェクト指向を対立軸としてとらえるから
出てくる気持ち悪さではないかと。私は、関数型とオブジェクト指向を直交した概念ととらえているので、二つの概念を
統合することは特に気持ち悪さは感じません。というか、関数型とオブジェクト指向の統合は古くからある研究でもありますし。
型推論とnominalな型システムって相性悪くない?
Scalaは複雑ですね。
コテうぜえ
>>856 そう思うんなら自説の開陳なり適切な論文の提示なりして自分で潰せよ
2chでコテがウザいと思うやつは専ブラでNGするもんだと思うがな
そもそもなにがウザいんだ
>>859 このスレを上から眺めると分かるが、荒らしが1名はりついている。それだけの話。
>>854 凄く相性悪いと思います。たとえば、nominalなシステムで引数の型推論を簡単にやってみよう、ということで、
def foo(x) = x.setSize(200, 300)
とかやったとき、xに適合する型は無数にあって、その中でプログラマが意図しているであろう型を
適切に推論するのはほぼ無理です。しかも、コンパイル時のクラスパスによって型推論の結果が左右されてしまいますし。
また、nominalでなくとも、サブタイピングと型推論の相性自体が悪いという話があります。
strcutural subtypingでも、多相メソッドの推論とかしようとすると色々無理が出てきますし。
簡単な例でいうと、
def foldl(collection, init)(f) = collection.foldLeft(init)(f)
とか。このとき、collection, init, fの型+foldlの型パラメータ+foldlの返り値型を推論しようとすると、複数通りの結果が考えられますが、「最も一般的な
推論結果の型」が存在しないので、困ったことになります。
コテがうざいという方がもし多ければ、名無しになりますが、ことScalaに関しては、自分の言説には責任持ちたいので現在はコテやってるという話
ですね。
ぶっちゃげコテ付けてなくてもわかっちゃうと思うからそのまんまでいいと思うよ。 (私は割と楽しく読ませて貰ってるが)気に入らない人がNGしやすいしね。
多相メソッドの型推論が難しいのは ランク2多相の型推論が難しいのと同じ理由だよね?
サブタイピングと型推論は相性悪い && 関数型で型注釈を書かされるのは苦痛 => 関数型とオブジェクト指向は相性悪い(ただし静的型に限る) 静的型ではどこかでバランスを取る必要があるが そのセンスが言語設計者と一致したときScalaが気持ちよくなる
>>853 強引すぎるだろw
関数型とオブジェクト指向、
HaskellとScalaじゃ重心配分が全然違う。
>>866 重心配分が違う、というのはその通りかと。ただ、Scalaが目指している方向は「関数型オブジェクト指向言語」
(関数型にもオブジェクト指向にも書けるという意味ではなく、関数型(データがimmutable)かつオブジェクト指向(subtyping
polymorphism))であることはおそらく確かだと思います。これは、Odersky自身が何度も強調していることでもありますが、
関数型とオブジェクト指向は別に対立概念ではないです。
ブログ書いてツイートしておまけに長文の便所の落書きまでする それも内容がほぼ一貫してScalaの話題 そのエネルギーを見習いたいもんだよ・・・仕事はやってんのか?
>>868 仕事は普通にやっていますよ。Scalaとは縁が遠い仕事ですけど。
仕事から帰った後か土日で、主にブログ書いたりツイートしてます。
エネルギーというか、Scala関係の事書くのが日常化してしまった
というか娯楽化してしまったので、それ自体は特に苦痛でないですね。
臀痛マソ
ただ、自分の姿勢はまああまり見習わない方がいい気もします。私生活に おける学習の優先度は Scala関係(Twitter) >> その他プログラミング言語関係 > JVMとかの実装読み > 各種論文読み とかなってて、それはそれで楽しいですが、色々いびつな生活な気がしますし、 持ってる技術スキルもおかげでかなり偏ってますし。
>>847 関数型の特徴とか真髄みたいなのを手っ取り早く学ぶならばHaskell、
Java技術者が関数型で自分の仕事がどう変わるか知りたいならばScala、
.NET技術者が関数型で...ならばF#がいいと思う。
Haskellはコンパイラとして実用されている例は少ないが、その言語理論は幅広く
影響を与えていて、特にこれからの言語の行く末を知りたければ勉強しておくべき。
これからの言語の行く末はどこですか?
文脈依存文法に違いない。あれやっといて動くプログラム。
関数型とオブジェクト指向が対立概念でないとしても、 関数型の視点からみると、 Scala は他の関数型言語に比べて、 記述のスマートさや簡潔性で見劣りするように感じられ、 その原因となっているのが、クラスベースOOを、 土台としているために、余計な複雑さが 生じているからじゃないかと思うんですが、 皆さんどう思われますか?
クラスベースOOの特徴というと、 データとそれに対する操作をクラスっていう形で 紐付けたことだと理解しているけど、それだけで複雑になるとは思えないなあ データ型を木(やDAG)の形で整理するのは関数型でもやるわけだから…… シンタックスが中途半端にJavaに引っ張られてるのが 記述上の冗長さを生んでいるんじゃないかなと思うけど
スマートさがないって、ML系のダサ文法見直してから来いよ
特に冗長なOCamlと比べてさえ Scalaの文法は冗長なんだが
>>875 たしかにScalaは他の関数型言語よりちょっとシンプルじゃない気がするけど
クラスベースOOだからというよりJavaとの接続をシームレスにするためじゃないかな
しかし、ScalaはHaskellやMLのような浮世離れした存在ではなく、汚いところも
きちんと面倒を見るような現実的に利用しやすい言語という位置づけになってるんじゃ
ないかな。
Haskellが今後爆発的に利用されることは現段階では考えられにくいけど、
Scalaは確実にシェアを伸ばしていくんじゃないかな。
>>869 > 仕事は普通にやっていますよ。Scalaとは縁が遠い仕事ですけど。
scalaできる企業に転職しろよw
OCamlのダサいところ 文法編 1. 文末がセミコロン2つ 2. メソッド呼び出しが「#」 3. 整数(+ - * /)と実数(+. -. *. /.)で演算子が違う 4. funとfunctionで分ける意味は? 5. 再帰するときはlet rec 6. なにこのトラップ # [1, 2, 3];; - : (int * int * int) list = [(1, 2, 3)]
>>883 良く知らない言語をdisるのって滑稽だなwww
文法じゃねーだろ
え?
じゃあ、Scalaの文法は冗長って、equi-recursive typeがないからということでいいの? つーかequi-recursive type使ってんの?
TreeSetにmutableな奴はないのですか?
>>883 1. 文末が明らかな場合はセミコロン二つを省略できるので、REPL以外では滅多に使わない
2. 型推論でレコードと区別するため
3. ad-hoc多相が無いから(ad-hoc多相を直接サポートするG'Camlという処理系がある)
ただし、Variantでad-hoc多相をエンコードすることは可能
4. functionは引数が一つしか取れないかわりに、引数にパターンマッチが書ける
5. let と let rec が分かれてると、既存の関数をデコレートしたいとき便利
(例:let foo = bar $ foo)
6. リストは[1; 2; 3]
ocamlじゃなくてF#ちょっとさわっただけだけど無名関数にfunが必要なのはうざいな、 F#スレでもうざいって言われててやっぱそうなんだ、と思った
>>892 理由を訊いてんじゃなくて、その設計がダサいって言ってんの
>>893 SMLでもfnが必要だけどね
しかしfunとfunctionの二つがあるのはダサいでしょ
Haskellでも \x -> ... だな たぶん何らかの記号は必要なんだろう
>>895 TMTOWTDIだからダサいってことなら、Scalaは物凄くダサいってことに
いや分ける意味ないでしょ しかも名前がfunとfunctionってひどすぎる まあもういいけどね ちょっと煽ってみただけだから
>>898 funとfunctionは機能が違うから
SMLにはfn一つしか無いけど、SMLのfnはOCamlのfunctionで、funに相当する構文は無い
だから引数が複数ある場合も fun x y z -> とは書けず
fn x => fn y => fn z => になる(別にこれはこれで良いけど)
それはSMLがカリー化をあまり使わない文化だからなのでは? つまり、fn (x, y, z) => と書くことが多いから
SMLでも関数定義では fun f x y z = ... と書ける
Scalaの型推論の話なんだけど、 型を省略したらstructuralな部分型だと見なし、 nominalに型を指定したいときだけ型注釈を書く、という感じで OCaml並みの型推論を得る事は出来なかったのかな?
@n_k28 消えろ
>>902 現実的に色々難しい。まず、現在のScalaのstrutural typeのシステムには、これをメインの型システム
として採用するには重要な欠点がある。たとえば、「+演算子を持ってる任意の型」とかいうのを書きたい
としよう。Scalaプログラマ的には、
type Additive[T] = { def +(other: T): T }
と書きたいところではあるんだが、残念ながら、これはScalaの型システム上許されない。これは、どちらかというと
JVMの上でstructural typeを実現する上での制約ではあるのだけど。あと、structural typeをメインのシステムに据えるの
は、パフォーマンス面とかでも問題がある。
あと、仮にstrcutural typeをメインに据えて、↑のような実装の制限が無かったとしても、それでも型推論は難しい。
mapとかflatMapの多相メソッドを呼び出しているオブジェクト(strctural)の型をどうやって推論するか、ってのを考えると
たぶんその面倒くささがわかると思う。結構簡単なプログラムでも、推論結果が一意に決まらない事がわかる。実際のところ、
OCamlでもオブジェクトシステム使ってそういう推論やろうと思うと、型注釈が結局必要になったりする。
流れとは全く関係ないけど、 ◆CgacaMDhSQさんは、誰かに読ませたい気があるのなら Twitterに書いている長文をブログか何かにまとめて書いて欲しい。 文章の開始部分を見つけるのが面倒で読みにくいです。
907 :
905 :2011/08/30(火) 07:38:15.19
非難されるようなことは言っていないつもりなんだが…
>>905 うーん。確かに、Twitterで分散して書いちゃうと、開始部分がわかりにくて
読みにくいってのはありますね。誰かに読ませたいかというと、読んで
何か刺激を受けてくれたならありがたいけど、そこまで読ませたい、とは
思ってない、という微妙な感じです。どちらかというと、自分メモ的な
ものかもしれません。ともあれ、検討はしてみます。
# あと、書くコストの面からTwitterを安易に選んでしまう、というのが
# あって、これは問題かもしれないなあ、とは思っています。
>>906 たぶん私の事を慮っていただいたのだろうと思いますが、要望は要望
として、それを反映するかは自分で選択するので大丈夫です。
909 :
905 :2011/08/30(火) 08:46:14.93
>>908 メモであればそのままで良いと思います〜
レスありがとうございました。
>>908 はてなのTwitter記法かTogetterで良いのではないかと。
Scalaってモダンな言語で難しいって噂だから 使うの尻込みしてたけど 触ってみたら型付きPerlみたいな言語で とっつきやすいね
F#は良い言語だね複雑じゃないし JavaはダメだったけどC#が良かったように
おれはオブジェクトを使うならScalaだないまんところ、 使わないなら、普通の関数型言語でいい
普通の関数型言語って何だ?
>>914 Haskell様に決まってんだろ平伏せよ
HeHe〜〜〜
ぶっちゃけあれだろ。 Scala, Scala 騒いでるのは、 JavaとかC#上がりのやつばかりだろ? 元々、関数型やLispをやってたやつで、 Scala 最高ですね、なんて言うやつ聞いたことねえわ。
俺はJavaよりは関数型で書いたほうが多いな 研究室で関数型やってたから 仕事はCだけど 関数型は常用しようと思うとライブラリがなくてゲンナリするからScalaに逃げた感じ スクリプトを書くときはGaucheを使う
ScalaってJavaがぽしゃったらどうなるの?
>>919 共倒れ
だが、プログラミング言語は惰性力がすごいからな
一度頂点に立ったものがぽしゃることはない
Scalaのカリー化ダサ過ぎワロタwww
言語としてのJavaが仮にポシャってもJVMって死なないような気がするなぁ
Javaも資産の量が凄いから、この先30年は廃れることはないと思うな。 あるとしたら、JVM自体が何らかの限界に直面するとか、くらいか。
2.9.1の変更点の要約きぼんぬ
925 :
デフォルトの名無しさん :2011/08/31(水) 21:57:53.48
大きなトップダウン的に作成する拡張とかの可能があるプログラムはjavaのほうがいい。 でも比較的まとまった機能をブラックボックス的に作るなら小回りの利く関数型の方がよい。 なのでそのどちらでも対応できるscalaはここちいい。 これってまさにおだのどうきそのままじゃね?おれって。
>>924 ・REPLの起動速度が改善(環境にもよるだろうけど、自分の環境だと7秒→1秒になった)
・コンパイルも速くなってる(これも環境によるだろうけど、テキトーに色々なプログラム食わせてみた感じ、大体1.5倍くらい速くなってる。
・1.getClass()とかできるようになった
・バグフィックス色々
ほー、No more もっさり
コンパイル時間、一秒未満にならないかなぁ。 スクリプト的にちょっと書いて試すような使い方するには辛い。
fscなら...1秒未満は流石に無理か
コンパイルが速くなっても、scalaの起動が遅いままでは仕方ない。
REPLの起動速度は本当に早くなったな。 前が遅すぎたのがあるけど
934 :
デフォルトの名無しさん :2011/09/01(木) 23:29:57.80
REPLってなに
RubyとErlangをパクったProgramming Languageの略 つまりScalaの別名
936 :
デフォルトの名無しさん :2011/09/01(木) 23:41:49.76
ググッたら対話環境ってでてきた ErlangはともかくRubyが関数型言語からぱくりまくりだから
パクりまくり、素晴らしいじゃないか。
パクるならもっとちゃんとパクってくれよ Haskellより後発の言語なんだぞこれ
HaskellってJavaより古いんだぞ 別に新しい言語でも何でもない
940 :
デフォルトの名無しさん :2011/09/02(金) 07:56:06.06
haskellはやくにたたん
ScalaはHaskellはもちろんMLにすら到底及ばない
ナチュラルにMLに喧嘩売ってんな まあHaskellerはいつもそうだけど
>>940 ふざけんなこのクソボケ
寝言は寝て言え
あの表記の簡潔さ、美しさ、その純粋性は現存言語の中でピカイチだろが。
いざとなれば言語の実装母体になっちゃえる実用性を備えてるのに役に立たないだと?
Haskell >> ML >>>>>>> Scala >>> Java
REPL というのは、単に対話型というだけじゃなくて、その言語における、 (loop (print (eval (read)))) という処理が走ってるものを言う。
皆Scalaを何に使ってる? 起動が遅いからクライアントサイドでは使い辛いんだけど トイプログラム書いて遊んでるの?
>>946 > (loop (print (eval (read))))
対話型やん
>>947 言語仕様マニアになるのが目的だからプロダクトやツールなんてどうでもいい
>>948 たとえばBasicの対話環境とかは、対話環境ではあるがreplではない。
そんな俺定義で語られても
Scalaは、機能としては関数型のスタイルを取り込んではいるけど、 対象をその性質のままに記述出来るっていう、 関数型言語の思想的な部分が欠落してるように感じる。 結局OOの世界を介在して表現しなければならないから。 関数型と考えて記述しようとすると、いつもそこに不満を感じるんだよな。 なんで、関数型的なスタイルを利用しつつも、 あくまでOOの視点から考えるのが、 Scalaらしいやり方なのかな、と最近思う。 諦めがついたというか、なんというか。
>>861 古い話を蒸し返して悪いが、
> def foldl(collection, init)(f) = collection.foldLeft(init)(f)
これって型推論できるよね?
抽象論でしか語らないやつは本当にプログラミングしてるのか疑わしい
OCamlで考えると、 # let foldl collection init f = collection#foldLeft init f;; val foldl : < foldLeft : 'a -> 'b -> 'c; .. > -> 'a -> 'b -> 'c = <fun> 一見、推論できているが、 class type ['a] hasfoldLeft = object method foldLeft : 'b -> ('b -> 'a -> 'b) -> 'b end;; class ['a] mylist (l : 'a list) = object (self : 'a #hasfoldLeft) method foldLeft init f = List.fold_left f init l end;; と定義して動かそうとするとタイプエラー # foldl (new mylist [1;2;3]) 0 (+);; (エラーは略) キャストしてもタイプエラー # (foldl :> int #hasfoldLeft -> int -> (int -> int -> int) -> int);; (エラーは略)
当然最初から型を与えれば動くわけだが、 # let foldl : 'a #hasfoldLeft -> 'b -> ('b -> 'a -> 'b) -> 'b = fun collection init f -> collection#foldLeft init f;; val foldl : 'a #hasfoldLeft -> 'b -> ('b -> 'a -> 'b) -> 'b = <fun> # foldl (new mylist [1;2;3]) 0 (+);; - : int = 6 やっぱり最初の型はちゃんと推論できていないのだろう 俺が理解できてないだけなんだろうけど、 strcutural subtypingの型推論って OCamlのせいで印象最悪なんだけど
>>950 MS-BASICとかは典型的なreplじゃん
不細工なだけで
>>956 > strcutural subtypingの型推論って
今時二者択一はない。
>>935 どうせなら"Ruby to Erlang wo Pakkuta Language"にすればよかったのに。
>>947 sbt + REPLが便利過ぎて生きるのが辛い。
>>955 let foldl collection init f = collection#foldLeft init f
class type ['a, 'b] hasfoldLeft = object method foldLeft : 'b -> ('b -> 'a -> 'b) -> 'b end
class ['a, 'b] mylist (l : 'a list) =
object (self : ('a, 'b) #hasfoldLeft)
method foldLeft init f = List.fold_left f init l
end
let _ = foldl (new mylist [1; 2; 3]) 0 (+)
で動くわけだが
>>962 ちょっと今、手が離せないんで後で確認する
やっぱり俺が間違ってたかw
うん、動くな しかし、この方法はポリモーフィックタイプを全部パラメタライズしなきゃいけないのか どうなってんのかよくわからない… OCamlをリファレンスで考えていいのかという問題もあるが でも、strcutural subtypingで型推論ができるのって、OCamlしか知らないんだよな まあ、前座の雑魚は黙って、水島氏の登場を待ちますか
OCamlを正としたほうがいいな
>>953 はい。型推論は「できます」。問題は、推論の結果が「適切な」ものか、どうかです。
まず、原理的な話を。Hindley/Milner 型推論(ML系言語の基礎となる型推論アルゴリズム。
OCamlとかHaskellとかはそれらに色々拡張が加わっているので、そのままではないですが)は、
与えられた「全ての」式に対して、最も一般的な型(principal typeと呼ばれます)を完全かつ健全に
推論できることが保証されています。この事実によって、型推論の結果の適切さを担保することが
できます。
しかし、structural subtyping(+ parametric method)が入ると、principal typeを完全かつ
健全に推論することができなくなります(というか、principal typeが存在しない、というのが正確でしょうか)。
ただ、この辺り、専門外なので、実はできる、という文献があれば示していただけるとありがたいです。
(続く)。で、OCamlは型推論をできるようにするために、メソッドは多相的になれない(単相的でなければいけない)
という制限が設けられています。
>>955 >>966 >>963 >>964 プログラマの意図した型としては、
class type ['a] hasfoldLeft =
object method foldLeft : 'b -> ('b -> 'a -> 'b) -> 'b end;;
class ['a] mylist (l : 'a list) =
object (self : 'a #hasfoldLeft)
method foldLeft init f = List.fold_left f init l
end;;
であったはずなので、おっしゃる事は正しくて、このケースでは、プログラマの意図した型をOCamlの型推論器が
適切に推論できていないように見えます。ただ、OCamlでは、メソッドが多相的になれないという制限を型システムに
設けているため(つまり、そもそもfoldLeft[A]というメソッドが作れない)、OCamlの型推論器としては正しく「型推論できて」
いることになります。
968 :
955 :2011/09/03(土) 01:45:05.88
なるほど、解説ありがとうございます OCamlの型システムについて勉強不足でした
>>962 はい。それで動きます。しかし、それでは、「foldLeftが」型パラメータを一つ持つ多相的なメソッドになっていませんよね。
これは無理も無くて、先ほど書いたように、OCamlでは、メソッドは多相的になれないという制限が設けられているからです(これは、
まさに型推論の問題を回避するためにそうなっています)。ともあれ、Scala的に書くと、
type HasFoldLeft[A] = {
def foldLeft[B](init: B)(f: (B, A) => B): B
}
という(これは、引数の位置に型エイリアスの型パラメータAが出てきているので、正しいScalaプログラムではありませんが)型は
推論できていないわけです。
とりあえず、説明が十分ではないかと思いますが、OCamlでは、Scalaのように多相的なメソッドがそもそも書けないので、この場合の
比較対象として持ってくるのは適切ではないです。
ちょっと補足。メソッドが多相的になれない、というのは、型注釈を書かない場合の制限で、型注釈を明示的に付ければ メソッドを多相的にすることができます。例としては、 # class ['a] newlist(src : 'a list) = object method foldLeft : 'b. ('b -> 'a -> 'b) -> 'b -> 'b = fun f a -> List.fold _left f a src end;; class ['a] newlist : 'a list -> object method foldLeft : ('b -> 'a -> 'b) -> 'b -> 'b end # (new newlist [1; 2; 3]);; - : int newlist = <obj> # (new newlist [1; 2; 3])#foldLeft (fun b a -> b + a) 0;; - : int = 6 な感じになります。しかし、これだと、型注釈を書かない場合に推論される型と一致しないため、実質的にあまり使われる事は無いと思います (OCamlに関しては素人なので、実はよく使われる、という事もありえなくもないですが)。
Scalaとは、 JVM界のC++であり、 関数型言語界のPHPである。
PHP大好きっす
C++は自分が書くのでなければ大好き
>>975 ちょっと確認のため、REPLで使えるコマンド(powerモード含む)調べてみましたが、
それに該当する機能はちょっと無いですね…。シェルの!<num> みたいなのがやりたい
事だと思うのですが、残念ながら現段階では無理、ということですね。
ただ、:replayが出来ているくらいなので、実現が難しい、ということは無いはずです。
あとは、sbtコンソールにはそういうヒストリ実行機能がありますが、sbtコンソールそれ
自体はREPLじゃないですし…。
>>967 >>955 のクラス定義は(本人の意図はどうあれ)foldLeftが多相メソッドになってしまってる一方で、
foldlの引数には型注釈が無い(無い場合は多相メソッドにならない)のがfoldlが通らない理由
だから、
let foldl (collection: 'a #hasfoldLeft) init f = collection#foldLeft init f
のように定義してやると
>>955 は通るし、また
class ['a] mylist2 (l : 'a list) =
object
method foldLeft : 'b. 'b -> ('b -> 'a -> 'b) -> 'b = fun init f -> List.fold_left f init l
end
と直接的に多相メソッドを定義した場合も通る(
>>955 のmylistとmylist2は同じ定義になる)
978 :
977 :2011/09/03(土) 09:44:35.12
なお、
>>955 の本当に意図した型は
class ['a] mylist (l : 'a list) =
object
method foldLeft init f = List.fold_left f init l
end
だと思うが、これはクラス定義の制限(より正確にはOCamlのlet多相性の制限)によって通らない
なので
>>962 のように定義してやる必要がある(そのかわりfoldLeftは多相的にならない)
一方で、こういったOCamlの型推論の制限に引っかからないように
オブジェクトを直接定義してやると多相的なfoldLeftを持つオブジェクトが得られる
let foldl collection init f = collection#foldLeft init f
let obj = object
val lst = [1; 2; 3]
method foldLeft init f = List.fold_left f init lst
end
let _ = foldl obj 0 (+)
let _ = foldl obj "0" (fun x y -> x ^ string_of_int y)
ま、何にしろOCamlの型推論は慣れるまで難しいな
>>971 > な感じになります。しかし、これだと、型注釈を書かない場合に推論される型と一致しないため、実質的にあまり使われる事は無いと思います
実質的には、OCamlではオブジェクト自体あまり使わないな
モジュールとファンクタで良いじゃん、みたいな
Scalaって型推論しかできない?
>>978 なるほど。ありがとうございます。生兵法は怪我の元というかなんというか。そういう風にすることで、型注釈無しに
多相的なfoldLeftを持つオブジェクトを作れる事は知りませんでした。勉強になります。ありがとうございます。ただ、
let foldl collection?init?f?=?collection#foldLeft init f
let obj = object
val lst = [1; 2; 3]
method foldLeft init f = List.fold_left f init lst
end
で得られるfoldLeftの型は
'_a -> ('_a -> int -> '_a) -> '_a
であって、確かにfoldLeft自体は多相的になっているのですが、反対にobjectをそのまま使っているせいで、単相的になってしまっていて、退化している
ような…。
>>979 >>実質的には、OCamlではオブジェクト自体あまり使わないな
>>モジュールとファンクタで良いじゃん、みたいな
それはOCamlな方々からよく聞きます。
ケーミズが怖い人を脱却しようとしてるww うざいって言っちゃうといろいろアレだから、オブラートに包んで「怖い」って 表現してるわけだけど、本人は気づいちゃいないのねw
>>982 なるほど。「怖い」は「うざい」のオブラートにくるんだ表現だったわけですね。自分は色々
空気読めない人なので、その辺り気づかなかったです。そういう直球の指摘をいただけるのはありがたいです。
scalaで開発するときには scala XXX という形でプログラムを何度も実行すると思うんだけど、そのたびに数秒またされる。 たぶんVMを起動してクラスライブラリを読み込む時間なのだと思うけど、これ省略できないのかな? つまり、コンパイル時のfscに相当するものが欲しいのだけど…
sbtのrunは別プロセスだっけ?ちょっとは速くなるんじゃないかな?
sbt で ~run とか ~test とかしとけばファイル変更を監視して実行してくれるがどうかな
これからの時代ScalaよりもGroovyなわけですが
OOPとFPとJVMとの狭間でキモイ言語仕様になったScalaは Groovyから呼び出す価値も無い
んなこと言っても、haskell/JVMは実用化で難航してるがな
JavaコンパイラよりもCコンパイラの可搬性が高い現状で、わざわざJVMコードにコンパイルすることのメリットってなんだろ…
Write Once, Run Anywhere()
でしょ
>>990 そうなんけ?
GCをJVMに丸投げできるのは魅力
Oracleに買収されてJVMの魅力にも翳りが……。
しかしJVMに代わるものなんて・・・ ところで次スレ誰かよろ。私はムリでした
>>981 確かに指摘の通り、obj#foldLeftは多相ではない
obj#foldLeftとobjの型を見比べてみると
# obj#foldLeft;;
- : '_a -> ('_a -> int -> '_a) -> '_a = <fun>
# obj;;
- : < foldLeft : 'a -> ('a -> int -> 'a) -> 'a > = <obj>
となっていて、これがfoldLeft自体は多相メソッドではないのに
objが多相的に振る舞える理由になってる
退化といえばその通りだが、この性質のおかげで型注釈無しのfoldlに渡せるわけだ
ま、正直言って複雑だよな
巷ではScalaが複雑だと噂らしいけど、OCamlの型推論も闇を抱えてるってことだな
>>993 全部丸投げだとcons多用する言語はきついけどね。
ここってOCamlのスレですか? 次スレいらないですか?
Haskellへの嫉妬が凄い言語ですね
1000ならHaskellerが死滅してScalaが関数型の王者になる!!
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。