・Scalaの紹介文(さわり)
Scalaは簡潔かつ優雅で型安全な方法でよくあるプログラミングパターンを表現できるように
設計された汎用プログラミング言語です。
Scalaはオブジェクト指向と関数型言語の特徴をスムーズに統合しておりJavaやその他の言語を扱う
プログラマをより生産的にすることができます。(以下略)
ttp://www.scala-lang.org/node/25 ・Scalaに関する書籍(英語)
ttp://www.scala-lang.org/node/959 リファレンスマニュアルや草稿のPDFなども充実しているのでそちらも参照してください。
日本語の資料には、チュートリアルの訳やIBM dW、IT Proの連載記事、各々で開かれた勉強会の資料などがあります。
ほしゅ
ほしゅ ほしゅ
6 :
デフォルトの名無しさん :2010/06/11(金) 15:37:49
前スレの >> 943 CodeZineの記事の著者です。 > e.getProperty("user")では空文字列が返り、 > e.getProperty("members")ではNullが返ってきてしまう理由がよくわからないのですが、 > これはなぜなのでしょうか? > [User]と[JList[User]]の違いなのか、それとももしかするとapp engine sdkの仕様なのでしょうか。 その通りで、"members"プロパティはListPropertyと呼ばれるもので、 keyに対してのvalueが一件もない場合はnullが返るのがLowLeveAPIの仕様です。 本来はList[User]()が返ってきて欲しいし、 そのようにimplcit conversionできればいいんですが、 ジェネリックスの仕様的に無理なんでnullチェックするしかないです。 記事のコードでそのへんのチェックが抜けていたのは 完全なバグですのであとで直します。
7 :
sage :2010/06/11(金) 15:39:17
あと、LiftをREPL環境で動かすには、 LiftConsoleってのがあってそいつが便利です。 mvn scala:console でmavenからREPLを起動した後に、 (new bootstrap.liftweb.Boot).boot とREPLに入力することでLiftのBootStrapが読み込まれて、 Modelなんかにアクセスできるようになります。 GAE環境ではSDKがサポートするローカル環境をエミュレートする必要があるため、 LowLevelAPIを利用したModelはさわれませんが。 このへんは、Slim3とかことーじゃを参考にすればなんとかなるかな、 とは思ってますが手をつけてません。 最近はあまりLift追ってない。。。
sageまちがえたorz
どんまい‼
ボクらのScala ~ 次世代Java徹底入門 浅海 智晴 (単行本 - 2010/6/25) って、どうだろう? 別にお金出して買うのに抵抗はないけど、 部屋の本棚がオーバーフローしているので、本買うのは躊躇してしまう。。
次世代Javaって
Relaxerの人か 著者は悪くないね
17 :
前スレの943 :2010/06/12(土) 23:29:00
おおお、yuroyoroさんご本人ですか!レスありがとうございます! twitterでフォローさせてもらってますw >>keyに対してのvalueが一件もない場合はnullが返るのがLowLeveAPIの仕様です。 やはりそうなんですね。 自分はまず前編を拝見させて頂いて、そのアプリでブラウザから操作をしてみて、 そのあと後編のソースコードを上書きしたんです。 前編でmembersプロパティがないeventエンティティをデータストアしてしまったので、 後編のソースコードに上書きしたらnullエラーが出るようになってしまっていたのでした。 途中ででそれに気づいてDBからデータを全部消したら後編のプロジェクトもうまく動くようになって、 それで今いろいろ勉強させて頂いているところです。 ちょうどScalaでGAEアプリを作ってみたいと思っていたところでyuroyoroさんの記事に出会い、 とてもラッキーでした。 とてもためになる記事を書いていただきまして、本当にありがとうございます。
せめて 次世代Java系スクリプト徹底入門 じゃないかと思うぜ
動的型付だからスクリプト言語じゃないってのも違うような
動的じゃないや静的 インタプリタ的(ソースそのまま)に動かせるかどうかって所だと思うわスクリプトか否かって
明確な定義ないしどうでもいい
<- の代わりに ← が使えるけどみんな使ってる?
>>23 使ってないな。そうでなくてもたくさん矢印あるんだから、意味が一緒ならこれ以上増やすなと言いたい。
いわゆる全角ってのも受け付けない。
25 :
デフォルトの名無しさん :2010/06/13(日) 19:27:46
http://demo.liftweb.net/count の
object CountHolder extends SessionVar[HashMap[String, Int]](new HashMap[String, Int] {
override def default(key: String): Int = 0
})
の文法についてなんですが、
new HashMap[String, Int] のあとにある
{
override def default(key: String): Int = 0
}
って、なんなのでしょう?
これはHashMapクラスの default メソッドをオーバーライドしてるって理解で
いいんでしょうか?
[String, Int]のあとの
{
}
がよくわからないです。new したあとにクラスのメソッドをオーバーライドできる?
のでしょうか?
>>25 Javaの無名クラスと同じ。継承とインスタンス作成を同時におこなってる。
その場でHashMapのdefaultメソッドをoverrideしたクラスを定義してる。
(なおかつ、それをSessionVarのコンストラクタに渡し、さらにそれを継承したCountHolderというobjectを定義してる)
>12 そのうち、Scala自体が、Java好きな人達に叩かれるようになるんじゃないだろか。
>>27 でも、Scalaの周辺環境やツール類の問題(ビルドが遅いとか、IDEがJavaに比べて未成熟だとか)は
ともかくとして、言語としてのJavaがScalaに勝ってる箇所って無いに等しいから叩くにしても
言語仕様が複雑過ぎる〜とかそういうのになりそうな気がする
一番重要な実行速度はJavaが上だろ
実際の使用に差出るほどの影響はないんじゃないの。
なんでそう思う?
むしろ遅い方の実測値を出せ
Actorの共有資源に対する制御はどうしてるの?
Javaと比べてコード量が変わらないっておかしくね? 計算アルゴリズム書くだけのベンチ?
そんなにおかしくもないだろ別に
入門書なんかは決定的にコードが減るパターンをセンセーショナルに取り上げてたりするからねぇ。 実際は書き方が変わるだけで、一つ一つのロジックレベルでは、 決定的にコード量が減るってもんでも無いと思う。 小さな積み重ねをすると、総合的に目に見えて分量が減るのは確かだけど。
一般論としては、数値計算系のベンチマークだとあまり言語による コード量の差が出にくい。つーのは、よく知られたアルゴリズムが 既存の手続き型言語用のものだったりするので、それをベタ移植しても あまりコード量が変わらないという…。あと、あまり数値計算系で 扱うデータ構造ってあまり複雑じゃないんで、高階関数とかの出番が 少ないんだよな…。一方、コンパイラとか言語処理系みたいな、複雑な データ構造をいじりいまわすプログラムだと滅茶苦茶差が出る。 あと、shootoutのプログラムコード見るとわかるんだけど、全然Scala っぽくなくて、ほとんどJavaみたいなコードが結構ある。Javaっぽい 書き方した場合、型宣言+αくらいしかコード量が減らない代わりに 実行速度もほとんど変わらないから、まあ納得の結果だなあと。
普段はScalaが遅いとは感じないけど Eclipseでデバッグ実行すると異様に重く感じる。
そりゃ普段は遅くは感じないと思うよ 単に素のJavaの方が速いってだけの話で
>>41 単にEclipseのScalaプラグインが重いとかその辺りだろう
>>42 なんでそうなる?
scalacがコンパイルしたコードを逆アセンブル or 逆コンパイル
してみりゃわかるが、原理的にほぼjavaと同等の速度が出るようになってるよ
Javaの方が速いってのは単なる先入観だ
違いが出るのは、暗黙型変換使いまくったり、高階関数使い
まくったりした場合だな。特に2.7だとspecializationが無いせいで
プリミティブ型のboxingでアロケーションが多発するので遅くなる。
要するに違いが出るんだろ
>>44 書き方に依存するって言ってる。
基本的にはJVMの上で動く以上、Javaと同じように書けば、同じような速度が出るし、実際そのようなコード
は書ける。Scalaっぽいコードっつうか、関数型プログラミングスタイルで書いた場合は、JVMの上だとどうしても
パフォーマンスが劣る傾向があるので、性能と簡潔さをトレードする感じになる。でまあ、もちろん0か1かの二択
じゃなくて、基本的には関数型で書きつつ、チューンしたい部分をJavaっぽく書くとかそういうこともできるわけ
やっぱ関数型的に綺麗に書くと遅くなるもんなのか
JVM上で動いてかつJavaとの互換性を高いレベルに保つってことで 一般の関数型言語ではやれる最適化手法の一部は使えなかったりするだろうし
>>45 要するに素のJavaの実行速度は超えることが出来ないんだからJavaよりは遅いで間違ってないだろ
>>48 え?
Javaと同じかそれより遅い、なら真だけど
Javaよりは遅い、は偽でしょ
Javaの速度≧Scalaの速度(実はこれも語弊があるけど。
JavaでScalaみたいに関数型プログラミングをやると同様に遅くなるはず
なので) ⇒ Javaの速度>Scalaの速度
って意味不明だろ
厳密に言うとJavaと等価にはなりえんだろう。
>>50 等価ってのが何を意味するかにもよるが
Javaっぽく、というか副作用を駆使すればJavaと同じ(これは
*誇張ではなく*ほぼ同じ)速度が出るって点には納得してもらえてる?
もしそうなら、Javaより遅いってのは論理的に明らかにおかしいのが
わかると思うのだけど…。
ほぼ同じ=同じ ではないんじゃね?
Scalaを好意的に見たいってのは解るんだけど、 現実を見ると、どんだけ厳密に最適化したところで、最高はJavaと等価が限界で、 Javaの実行速度を越えることはできなんだし、 Javaと同じ速度が出る場面なんて殆ど無いんだから、 Javaと同じ速度が出るって公言していい訳じゃないと思う。
今時、言語の速度だけ語ってもしゃーなくない? Javaより生産性が高くて、Javaに近い実行速度ができて、 生産性の高さのメリットがその実行速度の差のデメリットを埋めることができればいい、くらいで ま、そんなの用途や既存や手持ちのライブラリにもよるんだけど、 Ruby(Rails)が一部で使われているのはそういうのが理由でしょ。 でないと、あんな動作速度でいえば最悪級(失礼)な言語誰もつかわないでしょ。 どうでもいいが、JRubyなんてさ実行速度はRuby並だわ、 起動の遅さはJava並、動かないRubyのライブラリあるわ散々でまさに誰得言語だと思わんかね・・・ その点、Scalaはいい線だと思う
>>52 「ほぼ同じ」ってのが、「ちょっと負けてるけど、比較できるくらい速い」
というニュアンスで受け取られたんだったら、それは俺の書き方が悪かった
「ほぼ同じ」っていったのは、Javaっぽく書いた場合でも、scalacが完全に
javacと同じバイトコード出すわけじゃない(命令列の配置が少し違う)から、
厳密な書き方しただけで、実用上は「同じ速度」と言ってもいい。
>>53 いやいや、まだ理解されてないのかもだけど、わざわざ頑張って
しなくても、Javaっぽいスタイルで書くだけでJavaと同じ速度出るんだってば
で、現実にJavaと同じ実行速度が出る場面なんてほとんど無いとか、測定
したことも無い(だろうと思われる)のになんで語れる?
実測値示してみせりゃ納得するのだろうか?
好意的に見たいとかそういう問題じゃなくて、単純に事実の話だよ
56 :
55 :2010/06/16(水) 08:55:40
つーか、Scalaの速度について、Javaより遅いけど頑張って最適化すれば Javaに近いくらいの速度が出るくらいの受け取り方する人って意外に多い ことに驚いた。 たとえば、今Java 7に入る入らないでもめてるクロージャあるよね。 あれ多用したコードの性能は、ほとんど間違いなくScalaで高階関数を 多用したときと同じように落ちると思われるんだが、そうなったとき、 Java 7以前の速度は、Java 7よりも速いと言うのは正しいの? 自分が言っているのはそういうレベルの話。 ふつーにループ構文(whileとか)とJavaのAPI使って書けば性能はJavaと 同じだし、Scalaっぽく書けばより遅くなるというだけの話なんだけどなあ。 もちろん、Scalaがややこしい作業を色々肩代わりしてくれるおかげで、 つい、Javaよりも気楽に遅いコードを書いちゃうというのはあるんだけど、 それって言語処理系の速度評価とは独立な問題だよね
なんで全てのパターン試してきたら同じ速度出たのを検証したみたいな断言するのか解らん そんな簡単に最適化できるわけでもなかろうに
同等可否レベルのパフォーマンスの話はバイトコードで語れっての。
普通にScalaっぽく書いたら速度差出るなら、 それは等速とは言わないよね。 Javaっぽく書いて最適化すれば等速出るって言われても、 もはやそれはJavaじゃん。
60 :
55 :2010/06/16(水) 13:51:57
>>57 いや、全パターン試すまでもわかることもある。
Scalaのwhile --> ジャンプ文(goto,ifeqなど)
Scalaのif --> 条件分岐命令(if_icmpeq,ifeqなど)
Scalaのmatch --> 対象が整数でcaseの値が定数の場合はlookupswitchなど専用命令を使用。
それ以外の場合、if(...) ... else if(...) ...相当のコードを吐く。
Scalaのtry-catch --> メソッドの例外テーブルに情報を書き込む(Javaと同じ)
Scalaのthrow --> athrow命令
Scalaのメソッド呼び出し --> 単なるメソッド呼び出し命令(invokevirtual,invokestaticなど)
Scalaのオブジェクトの生成 --> new+invokespecial
Scalaのプリミティブ型(AnyVal)のメソッド呼び出し --> JVMのプリミティブ型に対する演算命令(iadd,imulなど)
Scalaの配列に対する演算 --> JVMの配列型に対する演算命令 --> (aaloadなど)
Scalaのclass,trait --> JVMのクラスファイル (ただし、traitが実装を持っている場合除く)
…
全部列挙するのは面倒なので避けるけど、こんな調子で、基本的にJavaと同じ
ような演算は同じ命令にマップされるので、Javaと同じように書いた場合には、
同じような速度が出る(いくつか例外はあるが…)。これは憶測じゃなくて、
自分で今までに色々なコードパターンに対してscalacした結果を逆アセンブル
した結果。別にユーザが「最適化」とか考える必要は基本的にはなく、単に
Scalaの暗黙型変換とか高階関数とか多用しなければ同じくらいの速度が出る
ようになってる。
ちなみに、こちらの方がまだ検証してなくて憶測になるのだけど、2.8.0.RC2
以降でジェネリクス使ったコードだと、specializeアノテーションでboxingの
コストが減らせる分、Scalaの方が速くなるケースもあるかも。
61 :
55 :2010/06/16(水) 13:57:07
>>59 事実関係についてはおおむね同意してもらえたとして、そこまで来ると
もはや見解の相違としか。一応言っておくと、ScalaでJavaっぽく書くことは
特に努力が必要な作業でもないよ。ふつーにScalaの基本構文を使って書く
だけ。暗黙型変換使うなとか使う機能に関して縛りは出るけど、特にScalaを
熟知していないとできない作業でもない。
ただまあ、
・Javaっぽく書くこと自体は特に難しくないこと
・そのようにして書かれたコードはJavaと同等の速度が出ること
に納得してもらえたなら、それ以上、特に等速という言葉を使うことに
こだわりは無い。単に、「性能の上限はJavaと同じくらいだけど、それを
達成するためには頑張ってチューンしなければならない」みたいな認識が
広まるのが嫌なだけなので。
リスト+mapやforを使ったコードもただのループになったりすればいいのに。
64 :
55 :2010/06/16(水) 16:08:14
>>63 そうとも言えない。
・型推論があるおかげで型を書く必要がある箇所がJavaに比べてかなり減る
・型の別名付けがあるおかげで、ジェネリクスを使ったコードがJavaに
比べて楽に書ける
・case classなどのおかげで、クラスの作成がJavaに比べて楽
・どこでもimport
・末尾再帰の最適化
・メソッド内メソッド
・パターンマッチ
などなど。これらの性能にあまり影響しない特徴を使うだけでも、
コードを書くのはJavaに比べて楽だよ。
んでそれで書くと等速になるって実際に確かめたの?
>>62 ただのループに変換するにはクラスを合成する必要があるから
クラス単位でコンパイルするScalaコンパイラでは難しいでしょうね。
Javaにクロージャが追加されたらJVMがクロージャを
ただのループに最適化するようになるかもしれません。
そうなればScalaの高階関数も同様に最適化されるだろうから
Scalaっぽく書いたScalaコードもJavaっぽく書いた場合と
同等の速度がでるようになると考えられます。
Javaにクロージャが追加されるのを期待しましょう。
>>65 >>55 が何を実際に確かめたのかは
>>60 に書いてあるのでは?
67 :
55 :2010/06/16(水) 16:38:57
>>65 あらゆるコードで、とは言わないけど、典型的なコードパターン
では結構試したかな。つか、さっきも書いたけど、Java的なコードは
Java的にコンパイルされるので、全部確かめる必要も無い。
あとは、
>>36 のリンク先の、regex-dna,n-body,binary-trees,fannkuch-redux
辺りのコードが参考になるかな。 Javaと同じような書き方してる
ベンチマークはほとんど同じ結果になってる。ちなみに、大きく差が出てる
k-nucleotideなんかはJava版とScala版でやり方が大きく異なってる点に注意ね。
机上の空論で議論しても仕方ない。 殆ど同じ、じゃなくて完全に同じかどうか聞かれてるんでしょ?
みんなtwitterのクジラは見たくないんだよ
全か無かでしか思考出来ないのは、認知のゆがみの典型的パターン。
71 :
55 :2010/06/16(水) 16:56:16
>>68 んな自明なこと聞かれてたの?
完全に同じなんてことは、scalacがjavacのforkでも無い限り(
というかforkであっても「完全に同じ」なんてことはまず無いが)
ありえないってことは議論するまでも無く明らかだと思うのだけど。
俺は実際のコードでほぼ同じであることを説明すれば十分だと考えた
ので、scalaのコードがどういうバイトコードにコンパイルされるか、
や、shootoutのコードを示したわけなんだが、あとは何があればいいの?
素のJavaよりも速いのか、遅いのか、全く同じなのか、ってことでしょ? ちょっとでも遅いのなら、Javaと等速っていうのは過剰評価じゃね?ってことだよ 細かな速度は重要じゃないって言ってる人が、何故か一番Javaと 等速であることに拘ってるよね
>>55 実行速度に関する情報提供ありがとうございました。
大変参考になりました。
ベンチマーク的な事じゃなくて、実際に実務でどうなるのかが唯一重要な希ガス
速度なんて関係ねーよとは言いつつ、殆どの人がこだわるのが速度だからねぇ Rubyの人を除く
さすがAKB大好きなだけありますね。
77 :
55 :2010/06/16(水) 18:36:36
>>72 いや、だからその三択がおかしいんだってば。
「全く同じ」なんて言い方するなら、Javaと全く同じ速度が
出るのはJavaそれ自身しか現実的にありえないんだから、無意味
だよ(どんな入力に対してもjavacと「全く同じ」出力を出す
コンパイラなんて現実的に無理だし)
それと細かな速度が重要なんて一言も言ってないんだが…
単に、「Javaと全く同じ」なんて言明は無意味だからそんな
言い方はしないだけのこと。
もう一度言うけど、「Javaと等速」ってのは過剰評価でもなんでもない。
shootoutでも、Javaぽく書かれたコードは、Javaとの性能差はほとんど
誤差みたいなもので、Scalaが勝ってるベンチマークすらある。
つーか、実際にScalaでJavaっぽく書かれたコードで、Javaより有意に
遅くなるケース示してくれんと、もはや悪魔の証明を要求されてるような
もんでどうしようもないんだが…。Javaっぽくってのは、高階関数の
代わりにwhileループやvarを多用したコード程度の意味ね。
>>74 実務に関しては、答えは簡単で、典型的なScalaっぽく書かれたコードは、
典型的なJavaコードより遅い(どの程度遅いかは問題によるが)。ただ、
Scalaは静的型付け言語だけあって、それでも動的型付け系のスクリプト
言語よりは速い。あと、Scalaっぽさを捨てていいならJavaと同じ速度が
出るようにするのは難しくない。
78 :
55 :2010/06/16(水) 18:40:48
つけくわえておくと、ほぼ同じって言葉の意図は、Javaに近いけど、ちょっと 遅い、じゃないからね。Javaっぽく書いたScalaのコードとJavaのコードの 速度差はほとんど誤差のレベルだから優劣を比較するのが難しいってこと。
そういう事じゃないのでは
だいたいJavaっていってもVMのバージョンやベンダによって全然違うわけだが ある程度近いなら同じって言い切って構わないよ
なんか良く分からんが、 ・C++は遅いから禁止。 Cで書け! ・ハードェアを叩きたかったら、既存のドライバ使うな!ドライバは自分で書け! ・OSなんか使うなよ。そんなのを介すると当然遅くなる。 ・可能だったらアセンブラで書け!Cだと遅いからな。 という話と同じだな。 組み込みの分野では、未だにそういうプログラミングやるよ。 で、数年前、C++はCより速度が劣るからダメ!と拒否しまくっていた人が居た。 まさにデジャブだね。 最近は組み込みでもC++で書くことも多くなってきている。 当然、C++っぽい書き方をしまくるとCより遅くなるのだが、 速度よりも分かりやすさ優先な場合は、そういう書き方しても全然問題でない。 要するに頭を使って適材適所でプログラミングすれば、 組み込みの現場でも CとC++の速度は同等だし、かつ、C++は便利といえるんだよ。
ScalaコードをJavaにトランスコードすればいいんだよ。 javapを応用すれば出来るでしょ?
>>79 毎度毎度お前は。
twitterでつぶやいてろ。
>>81 駄目、使うな、って言ってるんじゃなくて
速度はJavaと全く同じは言い過ぎじゃね?ってだけの議論だろ
ScalaはJavaより速い!
兄よりすぐれた弟なぞ存在しねぇ!!
87 :
55 :2010/06/17(木) 01:47:25
>>84 そりゃ二つの異なる言語処理系の性能が「全く同じ」なんて、
いかなる場合でも言えるわけが無いと何度言ったら…
とりあえず、同じような書き方した場合にベンチマークで有意な差が
出ないってのはshootoutのコードだけ見ても十分わかるし、原理的にも
「ほぼ」同じ速度が出る。で、無限にあるJavaプログラムと
Scalaプログラムの速度を比較するにあたって、同じような書き方すれば
速度が「ほぼ」同じだろう、以上の事はどうやっても言えないんだけど、
一体どうしろと言うんだ?そこまでして、Scalaの実行性能がJavaと同程度
であるってこと認めたくないわけ?Javaより少し遅いといえば満足なの?
88 :
55 :2010/06/17(木) 01:59:35
とりあえず、反論してくる人が何を主張したいのかさっぱりわからんので 主張をまとめてもらえないか。自分の主張はシンプルで、原理的にも 実用的にも、Javaと同じような書き方(whileループやvarの利用)をした コードはJavaとほぼ同じ速度が出る。以上、これだけ。 反論してくる人は、「全く同じ」という無意味な言葉を使わないで 主張の要点を説明してくれ。二つの異なる言語処理系の速度が「全く同じ」 なんてことはそもそもありえないし、こちらはそんな事言ってないんだから。
>>84 > 駄目、使うな、って言ってるんじゃなくて
> 速度はJavaと全く同じは言い過ぎじゃね?ってだけの議論だろ
そもそも、そんな議論はしていない。
誰が、「速度が全く同じかどうか」にこだわっているんだ?お前くらいだろ。
さっきからのその問題点のすり替えで、どうどうめぐりなので、辞めてくれるかな?
ていうか、お前、55氏の書いている内容を理解してないだろ?
これ以上愚問を繰り返すならば、せめて >60 の意味が分かってからにしようよ。
速度はJavaと全く同じは言い過ぎってのは間違いじゃないだろうに。
お前ら仲良くしろ
結局の所、
>>33-36 の結果を覆さないと堂々巡りになるんじゃないかね。
散々俺たちだってベンチマークの結果出して、RubyやPythonおせえwwwって言ってきたわけだし
92 :
55 :2010/06/17(木) 02:27:49
>>91 OK。
>>33-36 のベンチマークで、トータルでScalaの方が遅い理由については
説明つけられるので、ちょっと書いてみる。とりあえず、以下では、
>>36 のベンチマークを基準にして話を進めるね。
まず、regex-dna,reverse-complement,n-body,fannkuch-redux,
binary-treesはほとんど有意な差が出てない(Scalaが勝ってる
ベンチすらある始末)のでまず除外。
残りは、spectral-norm,mandelbrot,fasta,k-nucleotideの4つなので
順番に検討していく。
>>90 > 速度はJavaと全く同じは言い過ぎってのは間違いじゃないだろうに。
君の主張は詭弁だらけだな。
とりあえず、
「全く同じ」 「言い過ぎ」 「間違いじゃない」
って言葉を使うのは辞めておけ。
で、もう一度、スレを読み直してごらん?君は、いったい何を言いたいの?
>>90 誰もそんなこと言ってねーって。
JavaとかScalaの前に日本語勉強した方がいいよ。
95 :
55 :2010/06/17(木) 02:56:57
まず、spectral-normだけど、これは差は比較的小さいけど、少しScalaが 遅い。いくつか原因はあると思うけど、たぶん、Scala版は for(i <- ...) で、foreach、つまり高階関数を多用しているのに対して、 Java版は普通のループ構文を使ってる。それ以外大きな違いが無いので、 この辺りが原因になってると思われる。 次に、mandelbrotだけど、これはアルゴリズム部分はScala版もJava っぽく書かれてるけど、スレッドがらみで、Java版はAtomicInteger 使ってるところを、Scala版はsynchronziedやnotifyを使うなど、 より効率が悪くなる書き方してる。 次、fastaだけど、これはプログラムの書き方が結構違っちゃってる ので比較が難しい。実際にfastaのJava版をベタ移植してみるのが 手っ取り早そうだけど、めんどいな。ここはとりあえずpendingという ことで。 最後に、k-nucleotide、これは、Scala版はActor使ってる一方で、Java版 はjava.util.concurrent駆使してるしで、完全に別物と言っていいくらい 組み方が違ってるので、処理系の速度比較としてはかなりアンフェア。 これも、Scala版でJavaと同じようにutil.concurrent使った場合と比較 しないとまともな比較にはならんだろう。 まあ、はっきりしないやつについても、Java版のコードを全部Scalaに ベタ移植してみればはっきりするんだけど、そこまで手間かけるのも 面倒なので、誰か気が向いた人がやってくれれば。 コードはざっとしか読んでないので、ゆっくり読めばもうちょいまともな 分析ができるだろうけど、とりあえず、Java版とScala版で差が出てる ベンチはコードの書き方がそれなりに違ってるという事は確か。
55のレスの合間って不自然に口汚い援護射撃入るよな。 55がいない時間には入らないのに。
煽ってる奴もマジレスしてる奴も、意見の辻褄がおかしくなってるから もういい加減落ち着いて辞めた方が双方のためだと思う。
jvm上のシステムはgcがどんだけ使われるかによってスピードがきまる。 言語ではない。
それはない
このスレ一番のトンデモ理論出ました
gcが使われると遅くなるだろ どこが、とんでもなんだ?
104 :
66 :2010/06/17(木) 14:35:51
>>96 話の筋を理解しないレスに突っ込みたい人は何人もいるでしょう。
私も突っ込みましたが私は
>>55 なんですか?
>>55 同じ内容を繰り返しているレスはスルーしてくれませんか?
不毛なやりとりでScalaスレが埋まるのはうれしくありません。
105 :
55 :2010/06/17(木) 15:02:32
>>104 スルースキルが低くて申し訳ない。納得いかないとつい書いてしまう性質
なもので。確かにどうどう巡りになってて、不毛だったかも。
長島雄一郎入っちゃった
>>104 > 話の筋を理解しないレスに突っ込みたい人は何人もいるでしょう。
> 私も突っ込みましたが私は
>>55 なんですか?
俺も、問題点をすり替えて、何度も同じ主張をするやつに文句言ったが、
別に、66でも、55でもないぞ。
他にも、コイツにツッコミ入れたやつは、あと4人くらい居るみたいだ。
なんで急に弁解しだしたんだ。
疑われたからだろ。
大嶽親方「今は言えない。時が来たら話す。」
とりあえず、「全く同じは言い過ぎってのは間違いじゃない」という発言のアホさに ようやく気付いたみたいだから、彼も進歩したようだ。 でも、複数の人からアホ認定されているのは認めたくないようで、 現実から逃げて自作自演とかって騒いでいるから、まだまだアホのままだな。 >79, >90 のその後の発言は、>106, >108 ,>109 , >103, >96 , >99 なのだが、 アホの発言ってアホ丸出しだから本当分かりやすいよなあ。
2chでは行間開ける人はまずいないことを、 こうなる前に早めに教えてあげるべきだったろうか。
ダブルスペースで書く奴はいないけど、 話の区切りに行間を開ける奴はいるだろ。 てか、同一人物認定したところで、アホがアホである事実は変わらない。
話の区切りが必要な長文書くヤツもまずいないって教えてあげなきゃだな
そりゃ、ニュース系の話だろ。
2ちゃんねるといえばニュース系しかないと思ってる頭の弱い人もいるってことだよw
・俺の意見ではない。みんなが言っているんだ。 ・自分を批判するレスを全て妄想のイコールで結び始める。
>>112 マジレスすると、むしろもうちょっと早い段階で皆スルーすべきだった
>>77 あたりで
この人もしかしてあの入門の人じゃね
それ指摘したらヤバいだろ。
この流れを見るまでにscalaとjavaの速度差が気になるって人が いることに思いがよらなかったよ。 スクリプト言語よりは遙かに速いんだし Scalaで物足りないときはCでカリカリ書くものだと思ったよ
122 :
55 :2010/06/18(金) 13:08:11
なんだか悪い意味で盛り上がるきっかけになってしまって申し訳ない… とりあえず、55以降のレスは全て名前欄に55つけてるので、(なんだか 疑いをもたれてる書き込みについて)同一人物ではないとだけ言っておく。 信じてもらえるかはわからんけど。
気にしてるんじゃなくて、 JavaがScalaに勝ってる箇所って無いに等しい って話が出て来て、速度は多少劣っているのではって話になって そんなことは絶対にないって荒れ始めたのでは。
まさにcとcppの差だね 一番の弱点はjavaライブラリを使うときに色々気を使う必要があることじゃね
色々って何だ?
Option[T]を前提にできないとか、 Tupleが帰ってこないから、参照渡ししないといけないとか
Scalaの話なのこれ?
>>127 このスレには関係ないと思います。
そこのblog主は言語処理系の速度とアプリケーションの速度は関係ないと主張しています。
スクリプト言語処理系が遅いからと言ってアプリも遅くなるとは言えないと言いたいのでしょう。
このスレはScala言語処理系はJavaと比べて遅くないという話で盛り上がりました。
どちらも実行速度の話ですが論点が違います。
>>122 このグダグダの中でも、
>>60 のような非常に参考になる資料が書き込みされて良かったです。
しかし、これってどうやって調べられたのだろうか?
javapで 逆アセンブルだろうか?
気になるルーチンは逆アセンブルすることで、scalacがどのようにコードを変換したか分かって面白そうですね。
131 :
55 :2010/06/18(金) 19:31:51
>>130 はい。javapで片っ端から逆アセンブルです。逆コンパイルもありなのですけど、対応する命令や
クラスファイルの構造を正確に調べたい場合には不向きなんですよね…。ただ、逆コンパイルでも、
おおまかにどのようにscalacがコードをコンパイルしているかはわかるので、バイトコードは
よくわからないって人は逆コンパイラ使ってみると良いかもです。
水島氏は自演疑惑にも負けず、晒しエントリーにも負けず、これからも素直なままでいてほしいものである
>>55 あらため、みずしまです。トリップのキーをうっかり忘れてしまったので、別のトリップで。
>>132 素で
>>55 = みずしまである事がばれたのにちょっと驚き。いや、別にあえて隠してたわけじゃないんだけど、
以前使ってたトリップのキー忘れてしまったので、コテをやめてただけなんですが。まあ、文体とか見れば
わかるのかなあ…。見抜いた
>>132 氏はよくわかったなあ。
あー、やっぱりそうだったの? なんとなくそんな感じはしてた。
JVM上の言語に早いも遅いもあるかボケども 命令が丸見えなんだから書き直せ!
なんか酷い感じになって来たな… もうやめようよ
まだRC3のままだったけどRC6まで来てたのか finalマダー?チンチン
clojureにはRCなんぞないズラ...たしか
Planet Scala、火曜日で止まってるけどそういうもんだっけ? blog以外も集めてるよな? そして、手動じゃ無いよな?
141 :
140 :2010/06/19(土) 01:59:28
>>140 > PlanetScala's crontab has apparently
> broken orbit and departed for deep
> space.
twitterから
やっぱり止まってたみたい、自分の早とちりじゃなければ…
142 :
140 :2010/06/19(土) 02:31:54
そして、Planet Scala 軌道回復のお知らせ
質問です 関数funcで2つめの引数がオプションだったとするとオーバーロードを使って def func(i: Int, s: String) def func(i: Int) みたいに書けますけど 2.8だとデフォルト引数とオプション型を使って def func(i: Int, s: Option[String] = None) みたいにも書けますよね どっちがいいと思いますかね?
>>143 互換性を考えるならオーバーロード。
互換性を考えないなら、s を取るか取らないかによって、
実装が大きく変わる => オーバーロード
あまり変わらない => デフォルト引数
じゃあなかろうか。
>>143 二つ目のfuncの意味がどうなるかが問題じゃないかな
二つ目のfuncで、実際には単にデフォルト値を与えて(たとえば"")、一つ目のfuncを
呼び出しているだけなら、
def fun(i: Int, s: String = "")
みたいにした方がいいと思う。
一方、意味的に両者が大きく異なるなら、オーバーロードを使うべきだと思う。
ワシのRCは百八式まであるぞ
148 :
143 :2010/06/19(土) 16:53:35
ふむ、たしかにfuncの例じゃあ意味的にどうとか全くわかんないけど 思い付かないからしょうもない例だけどたとえば class Person(name:String, age:Int, child:Option[Person]=None) とかなら問題ない感じかな? 自分はなんかクラアント側の使い勝手はどうなのかなぁみたいなことばっかり考えてた デフォルト引数バージョンのはただ呼び出すだけならSomeでラップしなきゃダメでちょっとうざい val x = func(10, Some("a")) でもクライアント側から呼び分けたい場合はオーバーロードバージョンのはメンドイな val s: Option[String] = ... val x = s match { case None => func(10) case Some(s) => func(10, s) } こっちならそのまま渡せるな〜 val s: Option[String] = ... val x = func(10,s) みたいな感じで
yuroyoroさんがオプショナルな引数はカリー化して定義するのが2.8のAPIの流儀とつぶやいておられる def func(i: Int)(s: Option[String] = None)
>>148 どうやら、
> オプショナルな引数はカリー化して定義するのが2.8のAPIの流儀に見える。
> def func( i:Int )( s:Option[String] = None)
て、○○家の祖母がいってた。
151 :
150 :2010/06/19(土) 17:54:06
orz
なんか勝った! しかし、これ、なんか違和感があるなあ どういう意図があるんだろ
153 :
143 :2010/06/19(土) 18:27:02
うーむ、それじゃあ呼び出すときに func(10)() みたいにする必要があるみたいだ implicitが抜けてる気がする def func(i: Int)(implicit s: Option[String] = None) でも俺の脳じゃどういう利点があるのかはよく分からないな
>153 利点は、シグネチャがどんどん複雑になって、Java厨にはったりをかませるとこ。
そういうのいらない
あんまりそういうのは関数原理主義者みたいで気が乗らないなぁ ループを再帰に書き換えるのもそう思う。
むしろ、これは関数型的なセンスではないよね カリー化しておいて部分適用で使うわけじゃないんだから Scala流ってことなんだろうなあ
>>157 Scalaのカリー化って他の関数型言語のカリー化とだいぶ意義が違うんだよねえ
部分適用したいだけなら、 _ 構文使えばいいだけだし、カリー化とかする意味が無い
どちらかというと、implicit parameter使うためとか、function typeの型推論するためって
のが大きい。function typeの型推論するためってのはどういうことかというと、
def map[A, B](list: List[A], f: A => B) = list.map(f)
map(List(1, 2, 3), x => x + 1)
だと、
error: missing parameter type
map(List(1, 2, 3), x => x + 1)
になってしまうけど、カリー化して、
def map[A, B](list: List[A])(f: A => B) = list.map(f)
map(List(1, 2, 3))(x => x + 1)
だとOKとか。
>>158 正直それダサいと思うんだけど
関数リテラルの型推論ってよくわかんない
んだよね
怒られたら型を書くようにしてるけど、
なんで失敗するのかわからないと気持ち悪い
>>159 まず、前提として、Scalaは、(...)という引数リスト(確かこういうのを言語仕様ではセクションと言ってた)単位で
「前から順番に」型推論をしている、というのがある。たとえば、カリー化された
def map[A, B](list: List[A])(f: A => B) = list.map(f)
の場合、先に
(list: List[A])
の部分に関する推論が行われて、それから
(f: A => B)
の部分に関する推論が
行われる、といった具合。で、関数リテラルに関する型推論規則は実は簡単で、関数リテラルの
パラメータ部分(x => x + 1だったら、xの部分)の型が、関数リテラルの型を推論するまでに確定していないといけない。
で、
def map[A, B](list: List[A])(f: A => B) = list.map(f)
だと、先に(list: List[A])で、Aの型がたとえばIntとか推論された後に、(f: A => B)の部分の型推論が行われるので、 A = Int
とわかるけど、
def map[A, B](list: List[A], f: A => B) = list.map(f)
だと、list: List[A]の部分とf: A => Bの部分の推論は「同時に」(という表現が適切かどうかは微妙なところだけど)行われる
ために、関数リテラルの型推論をする時点で、関数リテラルの引数の型が確定してないので、エラーになる。
ちなみに、「前から順番に」ってのは、言語仕様書でそのように明示されてるわけじゃないんだけど、引数リスト単位で
型推論が行われてるってのはほぼ確実だと思う。
なるほど、括弧を分けることで、先に型をバインドさせるわけね ダサいという印象は拭えないが、 でも、テクニックとして、型パラメータを使って関数を引数にとる場合は、 カリー化させて関数の引数を後ろに回したほうがいいということはわかった 実際、foldLeftなんかもそうなっていると しかし、結局これは関数の引数を常に分けるようになるよな またRubyっぽい雰囲気になるな
>>161 ダサいというのは自分も同意。たぶん、もうちょっと頑張って推論すれば
>>160 の前者のような場合でもうまく
推論できそうだし。ただ、そうすると、推論できない場合とできる場合の境界がよりわかりにくくなるって
デメリットもあるといえばある。
現在の関数リテラルの型推論規則は割と簡単なので仕組みさえわかってしまえばそこそこ理解しやすいんだけど、
頑張って推論した場合の規則はかなり複雑怪奇なものになりそうな気がする
完全な型推論ができればいいんだけど、Scalaの型システムだと原理的に無理があるし…
codezineか
とりあえずyuroyoroさんが日本語キーボードを使っているということはわかりました
なおったみたいだね
Mission Complete !! ですって? ←も使えるぐらいだから、全角スペースも認識する。とかはなかったか。 ソースファイルのほうは日付古いままだったけど、試したら問題なく動いたよ。
codezineの記事、修正しました。ご指摘有り難うございます。 恥ずかしくて体中の穴という穴から汁があふれそうになりました。 昨日は規制中で書き込めなかったので。
codezineって、どういうノリで記事が決まるの? 編集部が「今はScalaが売れる!」って感じで企画立ててるの?
scalaはC#のイベントみたいな言語が標準で提供してるObserver パターンのやつはないの?
>>171 言語レベルでというのは無い
でも、C#のeventのほとんどの機能はライブラリレベルで十分エミュレートできそうな気がするけど
どうなんだろう
ボクらのScala ~ 次世代Java徹底入門 浅海 智晴 本屋で売っていたのでパラパラ見てみた。 まったくの初心者向けとしては悪い本では無いと思うが それ以外の人はコップ本を読んだほうがいいと思った
>>173 のは作りながらみたいなよくある入門書だけど
>>174 のはコップやScalaプログラミング入門の劣化版でしかなくてかなりどうでもいい感じだと思う
やさしいなんちゃらの二の舞になりそうだな
主婦頑張ってるな
主婦はわりかし有名で評判がいい 工学社のシリーズが地味すぎてマイナーだけども
Scalaの本、増えすぎだろ 仕事で使ってるやつはどんだけいるんだよ
増えたらなんか問題あるのか
馬鹿向けのScala本たくさん出して そんなに需要あるのか?
プログラム初心者が一番最初の言語としてどマイナーなscalaを選ぶケースは ほとんど無いから実際は入門書はいらない。いきなりコップ本を読めばいい コップ本の内容が難しくて理解できないならばscalaを学ぶための 周辺知識が欠けていると思われるのでscalaの入門書でなく javaや関数型プログラミングの本を読んで基礎を固めたほうがいい
確かに他言語の経験がある人の独学はコップ本で良いですね。 でも前提知識を要求するコップ本は教科書には向いていません。 ボクらのScalaはScala教科書の定番になると予想します。
俺は一番難しい本が理解できる それが解らない奴はバカ こういうアドバイスはいらない
翻訳が理解できない本が素晴らしいとか本末転倒してるよな 翻訳自体は、その本の価値をがんばっても保つくらいにしかできず、普通は減ずるというのに
入門書たたいてる奴は、入門書がないからいつまでたっても玄人向けのマイナー言語だという発想はないんだろうか。
素人向けにするにはまだちょっと早いと思う
そうやって言い訳して排除排除かね
結局足の引っ張り合いなんだよな、日本人は
じゃあ、今度ニュー速にプログラミング入門スレが立ったら、 「スカラっていうのが簡単でVBよりもいいらしいよ!」とか しれっと書いてくる!
はいはい ワッフルワッフル
むしろコップ本より詳しい本を誰か書いてくれ
言いだしっぺの法則
いや、2.8用コップ本が先だろ。
そいやオライリー・ジャパンからはscala本まだ出てねーんだな
オライリーは偏ってるから PHPやPostgreSQLなんかも日本語のはずっと出なかった
オライリーは表紙に悪意を込めたりするねw
個人的には、ScalaでDSLとか簡易言語を実現するような本が欲しい。
200 :
デフォルトの名無しさん :2010/06/26(土) 18:55:13
すいません、質問させてください。
http://pomu0325.blogspot.com/2010/04/scalagae-dispatchoauthgae.html ここのコードをそのままコンパイルしようとすると
URL型が見つからないと言われたので
import java.net.URL
を追加したものをコンパイルしてみたのですが、
[ERROR] src/main/scala/demo/model/TwitterOauth.scala:20: error: type mismatch;
[INFO] found : dispatch.Request
[INFO] required: java.lang.String
[INFO] Note: implicit method dispatch2gae is not applicable here
[INFO] because it comes after the application point and it lacks an explicit result type
[INFO] val g = new HTTPRequest(new URL(r), if (isPost) HTTPMethod.POST else HTTPMethod.GET, FetchOptions.Builder.withDeadline(10))
[INFO] ^
[ERROR] src/main/scala/demo/model/TwitterOauth.scala:21: error: type mismatch;
[INFO] found : org.apache.http.Header
[INFO] required: com.google.appengine.api.urlfetch.HTTPHeader
[INFO] Note: implicit method dispatch2gae is not applicable here
[INFO] because it comes after the application point and it lacks an explicit result type
[INFO] r.req.getAllHeaders.foreach(h => {g.addHeader(h); println(h)})
[INFO]
のようなエラーが出てしまってコンパイルできませんでした。
色々いじってみたのですが解決せず・・もし分かる方いらっしゃったら
ご教示いただけないでしょうか。
お願いします><
202 :
pomu0325 :2010/06/26(土) 21:04:05
>>200 201のurlにも書かれてますが、implicit defで戻り値の型明示するか、implicit defを宣言しているobjectのimportを後で書けばよいようです。
203 :
pomu0325 :2010/06/26(土) 21:14:52
>>200 すみません… dispatch.Request -> Stringにするimplicit defを他で書いていたのですが、それも必要でした。blog直しておきます…。
/**
* convert dispatch.Request -> String
*/
implicit def r2s(r: Request) = {
r.host.get + r.req.getRequestLine.getUri
}
204 :
デフォルトの名無しさん :2010/06/27(日) 22:42:42
org.apache.http.Header -> com.google.appengine.api.urlfetch.HTTPHeader するimplicitも要りそう。
implicit 使う奴って、保守性とか考えてんの?
>>205 保守性を考えないのが、関数型プログラミングだ
んだよねー 俺もScala勉強し始めてから気がついたわ Perl並だってのに まぁ昔ちょっとSchemeやってたんだけどそんな長いの書いたこと無かったし
そんな事言い始めてもどうしようもないだろ。スクリプト言語なら型が動的に変わるのが当たり前なんだから。だからって、それがダメてわけじゃない。
誰もスクリプト言語とか動的とかの話してないけど 関数型言語の保守性が悪いってだけの話で
>>206 >>209 なんで関数型だと保守性悪い(悪くなる)の?
最初205でimplicitと使うやつは保守性考えているのか?って言う話だったのに。
議論が全く見えてこないんだが・・・。implicitと関数型の関係は?
問題点が混ざってる気がする 1.implicit conversionを多用したコードは保守性が悪い 2.implicit parameterを多用したコードは保守性が悪い 3.関数型で書いたコードは保守性が悪い これらはそれぞれ独立してる問題で、1または2が真だったとしても、3が真だということにはならない ってのを踏まえた上で根拠を省いて私見を述べるなら、1.については、implicit conversionを、特にメソッドの追加目的で使う場合は、 その事をわかりやすい形でドキュメントに書かないと保守性が下がる傾向はある。Twitterのコーディング規約で基本的に implicit conversion禁止なのはそういう事を考慮してだと思う。2.については、implicit parameter はimplicit conversionよりは害は少ないけど、2.8のコレクションライブラリみたいにトリッキーな事やる場合は、 implicit parameterの型とそれに対応する実際の型の対応関係など、やはり十分なドキュメントが必要。3.については 関数型で書いた方が保守性は高い傾向があると思う。特に、mutableなオブジェクトが共有される事について悩まなくて 済むのは大きい。
いや、関数型の保守性はいいとは言えんだろ流石に。 Perlよかマシだけど。
>>211 2.8のコレクションライブラリみたいにトリッキーな事
あれは一体どうなっているんだ?
ある程度ソースコード追ってみたけど理解出来ない・・・org
別に使う分には全部理解する必要もないのか?
implicitを多用してDSLっぽく使えるライブラリがあるとして そのライブラリ自体のコードの保守性はさがるけど そのライブラリを使用して書かれたコードは読みやすかったりして保守性が上がったりするんでそ?
関数型だから保守性がいいというのは妄想 規約がなければどの言語でもほぼ同じ
>>212 その辺の議論をすると話が長くなりそうだけど、関数型で書くことで、手続き型(OO言語服務)言語においてしばしば見られる
悪いコーディング方法(たとえば、mutableなオブジェクトを安易に複数のモジュールで共有するなど)を排除できる、という
のは、それだけでも十分価値があると思う。あと、プログラミング手法の話をしてるのにPerlという特定の言語名を例に出すのは
変じゃないかな?
もちろん、関数型で書いたらそれだけで良いコーディングができるなんて楽観的には考えてないけど、少なくとも(手続き型に
比べて)より良いプラクティスを提供してくれると思う。
>>213 おっしゃる通り、使う分には全部理解する必要は無い。で、あれをちゃんと理解しようと思うと少し面倒なんだけど、
あれがやっている事をかなり単純化したサンプルコードを以前作ってみた
http://gist.github.com/408693 ので、よければ参考にしてくださいな。ポイントは、引数の型(READ or WRITE or READ_WRITE,
CHARS or BYTES)によって、返り値の型(Reader,Writer,RandomAccessFile,InputStream,OutputStream)
が変化している(オーバーロードされている)点で、これは2.8で拡張された、implicit parameterの推論ルールに
基づいている。
>>214 DSLのセマンティクスがきちんと文章化されていれば、そういう可能性はもちろんあると思う。
>>215 言語というよりプログラミングパラダイムの話をしているつもりだったんだけど、違うのかな?言語の話を
しているのだったら、関数型言語だから保守性がいいってのは確かに妄想だと思う。でも、どの言語でも
同じってのは極論に過ぎるだろう。
関数型というかクロージャを多用した他人のコードは読みにくく感じる 名前が不足してるせいだと思ってる
>>215 規約があろうとなかろうと、
Prologの方がCOBOLよりは保守性はいいよ。
implicit conversionでドキュメント化されてないから訳分からんと言えば、 Liftの事ですな。
そこでCOBOL持ってくるのがなんというか
プログラム仕様書がない昨今、可読性が保守性を作用するという前提で、 関数言語の特徴である、構文拡張みたいな事を頻繁にされると、読みにくいのではと、 軽い気持ちでかいてしまいました。 すいませんでした。
>>221 関数型言語で(具象)構文拡張の機能を標準で持ってるのなんてごく一部だよ
そこそこ名前が知られてる言語の中だと
OCaml(Camlp4),Common Lisp(リーダーマクロ等)くらい?
Template Haskellは標準で持ってるかというと微妙か。あと、Common Lispを関数型言語扱いしていいのかはわからん。
いずれにしても関数型言語の特徴とは言えないのは確か。
で、関数型プログラミングの特徴はというと、色々意見はあるだろうけど、最大公約数的には
不変データ構造と高階関数を多用したプログラミングスタイル、というところだと思う。で、どちらもよほど
変な使い方しなければ可読性は下がらないというかむしろ上がると思うんだけどなあ。
関数型プログラミングの威力をみよ! flip (.) h . ((.) . (f . g))
メンテナンス性わりー
>>216 例えばSICPでは銀行口座が取り上げられているが、
状態を明示的に操作するパラダイムのほうが、
自然なモデル化を実現できる場合もある
関数型で自然に書けるのであれば、関数型で書くことが勧められるとは思う
というより、効率とかの要求がない限り、わざわざ環境をいじる必然性がない
環境の破壊がないコードは挙動を推論しやすい
関数型かどうかと保守性はあんまり関係ないと思う……
むしろモジュールシステムとか、名前をうまく分ける機能が重要だったりするから
そういうのを保守性が悪いと思うなら、Javaを使っておけば良いんだ。
>225 他人のソースを読む時には名前、識別子が手がかりなのに、 一見しただけでは名前が出てこないimplicit conversionは超最悪ですよね。
関数型に文句を言いたいのか
Scalaに文句を言いたいのかはっきりしてほしい
>>225 は関数型の話でしょ
あと、暗黙の型変換はObjectをimportしなきゃいけないから、そんな驚くようなことにはならないよ
文句を言いたいとかじゃなくてさ、どうしても必要な時以外は使うべきじゃない機能だ って話でしょ? gotoとか、演算子オーバーロードみたいなレベルで。 twitterさんもコーディング規約で禁止してるの?
そろそろEffective Scalaが欲しいな
Liftでセッション毎の情報を持たせるのって どうやったらいいですか?
>231 net.liftweb.http.SessionVar でいいんじゃないの? javax.servlet.http.HttpSession を直に呼び出す事も出来たはずだけど。
234 :
231 :2010/07/01(木) 10:50:35
>>232 ありがとうございます。
SessionVarでできました。
2.8.0 finalまだぁ〜待ちくたびれた(ry
次は、確実にRC8
開発者はRCの意味解ってるのか
>>237 Remainder of Cloverでしょ。
そんくらい、中卒の俺でも知ってるw
>>237 当然わかってるだろうけど
ユーザ数が増えてきて今までのプロジェクトの運営方法ではうまく回らなくなってるんだろう(たぶん)
RCの番号が増え続けてるのも、RC出た後に大きなバグが見つかる→フィックスの繰り返しが起きてるからだし
あとは最初のRCがScala Daysにあわせたものであって品質があまり良くなかったのが響いてるというのもあるかも
RCはReleaseCitainaの略
>>240 (とりあえずバグあるけど) ReleaseCitemimasita の略
業務で使いたいんだが…まだ早いかな?
>>242 どうなんだろうねぇ
社内でのJavaで作ったシステムに、ちょっとscalaを混ぜて使ってるけど。
正直、コンパイラのバグが怖いなあ
245 :
231 :2010/07/01(木) 22:24:43
国内でのそれなりの規模の採用例って 特許を検索するやつ?以外にどこかあります?
一定規模以上だと長期のメンテナンスが怖いな。 結構仕様変わってるし。 自分用の小規模コード用なら好きなんだが。
>>244 コンパイラのバグについては、特定のコード書くとコンパイラがクラッシュする系の
バグはたまに見つけることがあるけど、計算結果が間違ってるとかそういう系のバグは、安定版(2.7.7)では
まず遭遇しないと思う。0ではないけど、実験的な機能(-Yオプション系の奴)やよほど変態的なコード書かない限りは
それほど恐れることも無いかと。2.8も正式リリースが出たら、安心して使って大丈夫じゃないかな。現状のRC7
でもまず大丈夫だとは思うけど。
あとは、既に国外ではTwitterとかLinkedInとかFoursquareとか結構有名なサービスが採用してる
事例もあるし、EDF Tradingみたいな、ちょっとミスが多大な損失につながるクリティカルな現場での採用事例も
あるので、その辺もまあ安心材料になるかな。どちらかというと問題は採用したとしてScala技術者をどんだけ確保
(育成)できるかってところじゃないかねえ。パテントビューロ(上の特許を検索するシステム作ったとこ)の人の
http://qcontokyo.com/pdf/qcon_TakashiMiki.pdf 発表スライドは、実際にScala導入してみようかと考えている人にとっては結構参考になると思う。単なる宣伝だけじゃなくて
実際に採用してみてリプレース前の既存システムでコード量にどれくらい違いが出たかとかの比較もあって結構面白い。
こういうのもなんだがll言語よりはちゃんと動くイメージがある 実際にはライブラリのバグの方が日常茶飯事だから気にならない
>>249 LL系言語は実行環境も自前で持ってるから、足回りはJVMという安定した実行環境が使える
Scalaなどの言語に比べるとどうしても劣る部分はあるだろうねえ。Twitterがバックエンドを
RubyからScalaに切り替えたのもGCの性能が悪いのが問題の一つだったらしいし。
251 :
デフォルトの名無しさん :2010/07/02(金) 04:28:21
Lift 2.0 age
細かいところばっかりだけどね gcもそうだけど llだとcと連動するところでトラブルが起きがちなんだよね 文字列をうまく処理できない場合があったり、リソースロックしていたり それがjvm内で完結しているとトラブルが少ないしデバッグもしやすい
foursquare.comでも、LiftのAjaxによるGC回避のpingをやってるんだね。 200秒ごと? あれは、大きなサイトでも大丈夫なのかなとちょっと心配な仕様だったんだけど。
255 :
デフォルトの名無しさん :2010/07/04(日) 10:09:13
アンドロイド上でscalaのインタプリタって動くの?
動くよ
257 :
200 :2010/07/05(月) 10:13:55
お礼遅れてすいません、レスありがとうございます。 ブログの記事の方までレスくださったようで・・ありがとうございましたm(_ _)m >>org.apache.http.Header -> com.google.appengine.api.urlfetch.HTTPHeader >>するimplicitも要りそう。 これがやっぱり必要なようですが・・まあ分かってません。 自分でも調べていますが、分かる方いらっしゃったら教えてくださると幸いです。 ありがとうごじましたm(_ _)m
>>257 implicit def h2h(h: Header) = new HTTPHeader(h.getName, h.getValue)
試してないけどこれを追加したら動くかも。
間違ってたらごめん。
Scalaは短命だったな 覚えて損したわ
次の言語、頑張って覚えてね
すげー期待してたのにD言語みたいになってきてちょっとショック
なにいってるんだ D言語はバイブルが出てこれから大攻勢に 出るといいな
既に翻訳も含めて日本語のScala本が5冊出てるし Twitter,foursquare,LinkedIn,などそれなりに知名度があるサービスのScala乗り換え事例 も増えてきてるしそんなに悪い状態とも思わないけどな
知名度が出たときに一気にブレイクできなかった言語は衰退するのみ
いいんじゃないの、Lispみたいにしぶとく生きてれば
>>267 2.8の仕様はもうfixされてるはず。RC上がり続けてるのは主としてバグ修正目的
RC1→RC2で継続プラグインが入ったりspecializationが入ったりしてるがこれは元々
2.8で入る予定のものでRC1でまだ入ってなかったというだけの話だし
そんなんでRC出しちゃったのがまずかったというならその通りではあるんだが
他のヒットしなかった言語も同じ事言われてたけどね 本当に必要とされてる言語はJavaやPHPみたいにグイっと来るんだよ
Cは普及するまでにかなり時間かかったけどな 本格的な普及がANSI C以降とするなら20年前後ってとこか
Scalaは保守性が低いからなあ。
Javaが急速に普及したのはWebという新しいプラットフォームが登場した事による UnixでC、WindowsでVBが普及したのと同じ Linuxが普及したのは十分な性能を持ち安価な1Uラックマウントサーバが登場した事による 同じ土俵で生産性や保守性を理由に後発の言語が普及した例はほとんどないのではないか DelphiはVBより評価されていたようだがVB以上に普及することはなかった
数少ない例外がC→C++かな Scalaもそうなればいいけど
>>275 Rubyがここ数年で普及したのは、Perlと比べたときの生産性や保守性が理由
(もちろん、Railsというフレームワークがあったのが大きいけど)だと思うけど、どうなんだろう…
>Perlと比べたときの生産性や保守性 あんま変わらんな フルビルドだとインストール失敗するし gemとか糞だし
> フルビルドだとインストール失敗するし そういう問題があるならバグレポートしてくれよ
>>276 Cの普及時期から見るとC++の登場は後発と言うほど遅れていない
ANSI C制定(89年)と同時期にARM(The Annotated C++ Reference Manual, 90年)が出された
特にWindowsでは普及期(3.1〜95)にVisualC++の影響でCをやらずにいきなりC++の方が普通だった
>>277 非エンタープライズという意味でのWeb2.0というプラットフォーム(というより顧客/マーケットか)の
登場(拡大)が影響したのではないか
現時点で新しめのプラットフォームというとクラウドとスマートフォン もしiPhoneアプリがScalaでしか作れなかったら・・・ クラウド特にGAEはまだチャンスがあると思う GAEに特化した有力なフレームワークがあればScalaは普及するのではないか
>>281 言う通り、GAEは狙い目かもね
Scalaの表現力を生かして、BigTableへのアクセスとかが簡単にできる良い
Webアプリフレームワークがあれば…
GAEならScala + Slim3でどう?
Slim3はAPT使ってるせいでScalaと相性が悪い
おまいら GAE に夢見すぎ
まぁGAEが現状のScalaよりも遙かに普及してくれないと意味がない話ではあるな
>274 「有るから使う」程度の理由でimplicit使う奴が大量に居るから。
このスレってずっと暗黙の型変換で粘着されてるけど、そんなに嫌なら使うの禁止すれば?としか言いようがない 上のほうでgotoに例えられてるけど、よく知らないやつの怯えっぷりは似てるかもしれない 暗黙の型変換はgotoほど必須ではないと思うが
>>288 確かに。なんでこんなに(implicitに)怯えてるのか不思議でならない。
まあ使い方間違えれば可読性に負の影響を及ぼすことはあるけど、別にんなのはimplicitに
限った話じゃないしなあ…
怯えるとかそういう大げさな話じゃない。 濫用気味でしょと言ってるだけ。
そんなやつが大量にいるようには感じないけど どちらにせよ規約で縛ればおkな話だな
rubyとかで動的にメソッドがばりばり作成されたりするのとかと比べれば implicitなんか明快すぎて楽勝だろ 変だなと思えば、簡単に調べられるし
まあ、怖がっているのはJava層かPHP層だろうな PerlとかRuby使っているやつがこんなんでうだうだ文句言うとは思えない
C++やJavaはimplicit is evilって思想だからなぁ そこでできるだけexplicitにしてみたらキーパンチが多すぎて収拾が付かなくなったってのが ここ10年の歴史だとは思うんだけどね。
C#の変化の歴史を見ても、「外向けにはexplicit、内向けにはimplicit」が 今の流行じゃないのか?
一方歴戦のVBプログラマはoption explicitを使った
>>293 Rubyでもevalやリフレクションの濫用が問題になってた(なっている)
強力な機能は使い方を誤るとエライことになる
そこで最近は「ここぞという所にだけ使え」って原則が普及してきたように感じる
まあScalaについては、まずは濫用が問題視されるぐらい
普及してからの話じゃなかろうか
もしそう言うのが大々的に問題になったらIDEの機能でimplicitな所は分かりやすく色を変えたりして表示したりみたいな機能がつくんじゃね?
だから怖がりすぎだって evalとかそういう次元じゃないから
>>277-278 Rubyメインで使っているけど、言語の良し悪しを置いておくなら、
ライブラリが数そろっててメンテされてて、
優秀な技術者がやとえる(というかもうそういう人しか残ってない予感がする)であろうPerlは
まだまだいけるように見える
RubyはRailsである壁を超えて広まりはしたけど、
ぶっちゃけると他にいいフレームワークがあったら移るような人たちばかりだろ、今使っているのはw
Perlの優秀な技術者どこで見つけてくるんだよって?Rubyも似てるだろ?w
保守性?依存性ごっちゃなgemやらバージョンあげるとすぐに動かなくなるgem郡、
下位互換性もすぐに切り捨てられ常に変わり続けるRailsや周辺プラグイン
「Railsの生産性が高い」と行った場合、結局はwebアプリの開発にどのくらいなれているかで決まってくるし。
(公平に既存の資産がない、という前提)
少なくとも、ふだんRuby書いている奴が、Rails使ったからって簡単にwebアプリ作れない。
だからといって他の言語から乗り換えたい奴は、よっぽど不満なやつだけ。
そういう奴らも、すぐに目移りする。
ようするに仕事だとphp最強!!
Rubyメインでのくだりが繋がってないな、失礼。独立した別の行段落と考えてくれ
仕事メインはC++で、 週末にrailsで遊んでみたが 毎週gemは動かないし、アップデートするのに半日つぶれる かといってバージョン固定したらバグやセキュリティーホールは直らないし で、使うの諦めた かと言ってC++でwebやる気は起きない なのでscala+liftに逃げてきた
Rubyの話題はもういいよ ここで長文書くことないでしょ
次はRC8?それとも正式リリース?
>>304 scala-internalsを読んだ限り、これ以上クリティカルなバグが報告されなければ
正式リリースされそうな感じ。
306 :
デフォルトの名無しさん :2010/07/08(木) 23:42:12
scala1のeclipseプラグインって現状galileoかGanymedeしか対応してなかったという認識だが、 Heliosに対応する予定はあるのか? もしくはHelios飛ばしてM4のほうが先とか?
307 :
306 :2010/07/08(木) 23:48:03
>scala1のeclipse なぜかscala1とかいうわけわからないタイプミスしたが気にしないでくれ
公式サイトにもうすぐへリオス対応するって書いてある
309 :
306 :2010/07/09(金) 02:12:57
>308 そうなのか。ありがとう
現時点でScalaを書くのに一番良いIDEって何かな? 自分はIntelliJのCEを使ってるんだけど。
このスレの人たち的にはrustってどうなの
最近EmacsでENSIME + sbt使ってるよ ・補完 ・定義ジャンプ ・カーソル位置の変数の型推論 ・flymakeっぽい自動コンパイルチェック くらいはできるよ Emacs派にはおすすめ
>>312 EMSIME、割と評判いいねえ。EclipseのScalaプラグインの出来が
イマイチだから、いっそのこと乗り換えようかな…
typoしたorz EMSIME→ENSIME
315 :
名無しさん@そうだ選挙に行こう :2010/07/10(土) 14:55:31
scalaでスクリプトを実行するときの起動時のオーバーヘッドを減らすのってどうやるんでしたっけ? 2年ぐらい前に記事で読んだことがあったような気がして本家を探してみたんですが、見つからなかったです。 もしよろしければ、やりかたかリンクを教えてもらえないでしょうか。 よろしくお願いします。
-savecompiled の話か
下記の、どれが存在する言語なのでしょうか? C+−、C−+、C−−
320 :
名無しさん@そうだ選挙に行こう :2010/07/10(土) 18:00:04
>>316-318 ありがとうございます。
nailgunはちょっと面倒で、-savecompiledは初回が遅いこととjarファイルが作られてしまって邪魔なのが欠点ですね。
ちょいnailgunについて調査してみます。
nailgunで、コンパイル後ならOKかな。
clojure書いてる人が用意したnailgun用のclasspath-managerというのを使ってみてるけど、
これを使うと、ng-cpせずに動的に呼び出すので、
・クラス名の重複が避けられる
現時点だと、
・逐次にclasspathというファイルを用意する必要がある
・classpathに書いた、ディレクトリ内のclassファイルを上手く読みに行かないので、jarやzipにしたほうがよい
・scala-library.jarを上手く呼び出せない
・他にも呼び出せないものがあるっぽい
http://github.com/stuartsierra/classpath-manager 今は、こんな感じでためしてる。
java -verbose -Xms32m -Xmx128m -server -cp lib\nailgun-0.7.1.jar;lib\classpath-manager-1.1.0.jar;lib\scala-library.jar com.martiansoftware.nailgun.NGServer
ng ng-alias cm com.stuartsierra.ClasspathManager
classpathファイル用意
ng cm メインクラス名
test
>>294 そんな歴史は無いだろ。
吠えてたのはLL信者だけじゃん。
にゃー
タプルを引数に渡したいとき、どうするですか? val xy = (1,2) def f(i:Int,j:Int): Int = i+j f(xy) //ここ!
>>325 その場合、残念ながら直接渡せないので、
f(xy._1, xy._2)
のようにするしかない。タプルを直接渡せるメソッド(関数ではなく)を定義するには、
def f(ij: (Int, Int)): Int = ij match { case (i, j) => i + j }
みたいに書くしかないけど、これはこれでめんどいし。
タプルを引数に取るメソッドと複数引数を取るメソッドが同じじゃないのはJavaの
calling conventionにあわせた結果なんだろうけど、うっとおしいよねえ。
あと、 val (x,y) = (1,2) ならいいのに、 private val (X,Y) = (1,2) は not found: value X って怒られるのはなぜですか?
なにー! 大文字と小文字で違うのかっ!
とりあえず326さん、ありがとうございます。
>>327 パターンマッチングの仕様。
パターンの名前が大文字で始まる場合、未束縛の変数ではなく、その名前の値が
既に存在しているとみなされて、その値に対するパターンマッチが行われる。
つまり、
val (X, Y) = (1, 2)
の場合は、Xと1、Yと2が同じかどうか比較されるってこと。
def f(a: Int, b: String) = ... val tuples = ... tuples.map { t => f(t: _*) } みたいなことできればいいのに。
>>331 何故かという事に関しては直接は知らないのだけど(MLを検索すると出てくるかもしれないが)、
この仕様のメリットとしては
1.構文解析が簡単にできる
2.パターン名のtypoが検出できる
という二点があると思う。たとえば、仮に存在しない変数名がパターン部に記述されたら変数パターンだ
という仕様だったとする。すると、match式などの構文解析をするために構文解析時にいちいち変数表などを
もって回るか、構文解析の処理の一部を意味解析に回すことになる。一方、大文字小文字かで区別する
なら、そのような面倒な処理なしに変数パターンが値パターンかを簡単に区別できる。これが一点目。
二点目としては、たとえば、
x match { case R => ... }
のつもりが、誤って
x match { case T => ... }
としてしまった場合、大文字小文字で判定している場合、Tという値は存在しないというエラーを
出すことができるが、存在しない名前が現れたら変数パターンとみなすという仕様だと、Tという
変数が新しく定義されて正しくコンパイルされてしまい、エラーに気づかない可能性がある。
>> 325 Function.tupled(f _)(xy) でどうでしょうか
シングルトンオブジェクトを その名前の文字列から取得するにはどうしたらよいでしょうか?
>>335 こんな感じ?
object Refl {
def getSingleton(name: String): AnyRef = {
(Class.forName(name + "$").getField("MODULE$").get(null))
}
def main(args: Array[String]) {
val singleton = getSingleton("MyObject")
val klass = singleton.getClass
klass.getMethod("hello", Array[Class[_]]():_*).invoke(singleton)
}
}
object MyObject {
def hello { println("Hello, MyObject") }
}
337 :
335 :2010/07/14(水) 00:52:23
>>336 ありがとうございます。完璧です。
予想以上に難しくてびびりました。
REPL で
> object A
> Class.forName("A$")
てやって、できないなー、とかやってたレベルなので。
338 :
デフォルトの名無しさん :2010/07/14(水) 02:18:04
>>336 技術的にできるのはわかるけど、
objectの実際のclassファイル名が、"名前+$"になっているとか、
"MODULE$"と名前のフィールドが存在しているのって、
言語仕様で規定されてたりするんだっけ?(そもそもそういった厳格な言語仕様ってあるの?)
scalaのソース上での表記と、classファイルにしたときの実装がどうなっているかってのは別の話だよね?
(いわゆるCRubyとJRubyみたいに標準の実装以外に別の実装があってもいい?)
もちろん、実用で使うには普通やるべきではないよね?ていうかやる必要ないよね?
まぁこういうふうにリフレクションつかってみるのは勉強にもなるし、楽しいけど。
あと、
object ++{}
みたいに記号名のobject定義できるけど、その場合って
$plus$plus.class
ってファイル名になるよね?それの変換まで実装したら大変だな・・・
>>338 おっしゃる通り、objectの名前と実際のclassファイル名の対応関係とかは、言語仕様では
規定されてなくて、あくまでも現在のScala実装に依存した話なので、それを承知でやるならアリかと
思うけど、普通はやるべきじゃないとは思う。
記号名は、各文字ごとに単純に表引きで変換できるから、そんなに大変ではないと思うけど、多少手間は
増えるね。
340 :
デフォルトの名無しさん :2010/07/14(水) 13:11:33
下のが実行時に scala.MatchError: null で落ちて困っているのですが、どうしたらいいのでしょうか。 ちなみに型パラメータをやめて[Double]とべた書きすれば大丈夫なのですが。 class Matrix[T](n) { var mat = Array[Array[T]](n) def init(v: T) { mat=mat.map(_=>Array.fromFunction(_=>v)(n)) } }
>>340 MatchError以前にそれだとそもそもコンパイル通らない
Array.fromFunctionの第二引数がIntだからnはInt型じゃないといけないが、
それだとArray[Array[T]](n)のところでエラーになるし…。推測すると、
class Matrix[T](n :Int) {
var mat = new Array[Array[T]](n)
def init(v: T) {
mat=mat.map(_=>Array.fromFunction(_=>v)(n))
}
}
が書きたかったコードじゃないかと思うけど、あってる?で、そうだとして仮定して
話を進めるけど、Scala 2.7では、ジェネリックな配列に関しては、内部的にBoxedXXXArray
(XXXは型名)というクラスのオブジェクトに変換して扱ってる。で、mat.map(_ => ...)の、
無名関数(_ => ...) の中で、最初に引数をBoxedXXXArrayに変換しようとするんだけど、配列の
要素がnullなので変換できずに失敗する。不具合といえば不具合かな。2.8では、Arrayは必ず
Javaの配列にマッピングされるようになったので、このような問題は起こらなくなってる。
class Matrix[T:ClassManifest](n :Int) {//2.8でしか動かないコード
var mat = new Array[Array[T]](n)
def init(v: T) {
mat=mat.map(_=>Array.fromFunction(_=>v)(n))
}
}
object MatrixMain {
def main(args: Array[String]) {
val x = new Matrix[Double](10)
x.init(20.0)
println(x.mat)
}
}
すげー。聞かないとまったく分からなかったです! (通らないコード書いてすみません。ご推察の通りです。) あと、v2.8では多次元配列の生成はfromFunction((i,j)=>...)が廃止されているので、 質問したケースではtabulateかfillを使えばいいみたいですね。 というわけで class Matrix[T:ClassManifest](n:Int,value:T) { private var mat = Array.fill[T](n,n)(value) override def toString = mat.map(_.mkString(" ")).mkString("\n") } val thanks = new Matrix(10,3.14) println(thanks)
こんどはこれで引っかかった・・・。 初めて数日なので、エラーに対してまったく勘が効かなくって困っています。 しばしご教授願います。 検索するに、java.lang.StringとDoubleで似たような話があるみたいなのですが、 x.toDoubleとかできないし。。。 $ cat point.scala case class Point[T](x:T,y:T) { def +(that:Point[T]): Point[T] = Point[T](x+that.x,y+that.y) } object Run { def main(argv:Array[String]) { val p,q = Point[Int](3,5) println(p+q) } } $ make point scalac-2.8 point.scala point.scala:2: error: type mismatch; found : T required: String def +(that:Point[T]): Point[T] = Point[T](x+that.x,y+that.y) ^ point.scala:2: error: type mismatch; found : T required: String def +(that:Point[T]): Point[T] = Point[T](x+that.x,y+that.y) ^ two errors found make: *** [point] Error 1
>>343 ひょっとしてC++ or D系の言語から来た人かな?
JavaやScalaなどの言語では、型パラメータが持っている演算を
制約として明示しないといけない事になっている。この例だと、型パラメータTが+メソッド
を持っていることを、コンパイラは知らないので、怒っちゃうわけだ。required: Stringって
出るのは、T + Stringという文字列連結だと解釈しようとしてそれに失敗しちゃうからだね。
で、解決策だけど、大きく分けて二つあって
1.implicit conversionを使う
2.implicit parameterを使う
のどちらかになる。
まず、1.の場合だけど、+メソッドをもった型Addible[T]みたいな型を定義して、 TからAddible[T]へのimplicit conversionを必要な型ごとに定義する。次のような感じ。 trait Addible[T] { def +(that:T): T } case class Point[T <% Addible[T]](x:T,y:T) { def +(that:Point[T]): Point[T] = Point[T](x+that.x,y+that.y) } object Implicits { implicit def intAddible(i: Int) = new Addible[Int] { def +(that:Int) = i+that } implicit def doubleAddible(i: Double) = new Addible[Double] { def +(that: Double) = i+that } } import Implicits._ object Run { def main(argv:Array[String]) { val p,q = Point(3,5) println(p+q) val r,s = Point(3.5, 4.5) println(r+s) } } この方法だと、足し算するごとにPoint以外にも余計なオブジェクトが生成されるので、 メモリにあまり優しくない。
次に2.の場合だけど、2引数を取るplusメソッドをもった型PlusOp[T]みたいな型を定義してやって、 PlusOp[T]をimplicit parameterとしてPointのコンストラクタの渡すようにしてやる。こちらの場合、 余計なオブジェクトの生成は避けられるが、x + yと書くことができず、num.plus(x, y)みたいに書かなければ いけないのでちょっと美しくない。 trait PlusOp[T] { def plus(x:T,y:T): T } object PlusOp { implicit object IntPlus extends PlusOp[Int] { def plus(x:Int,y:Int) = x + y } implicit object DoublePlus extends PlusOp[Double] { def plus(x:Double,y:Double) = x + y } } case class Point2[T](x:T,y:T)(implicit num: PlusOp[T]) { def +(that:Point2[T]): Point2[T] = { Point2[T](num.plus(x,that.x),num.plus(y,that.y)) } } object Run { def main(argv:Array[String]) { val p,q = Point2(3,5) println(p+q) val r,s = Point2(3.5, 4.5) println(r+s) } }
ちなみに、今回の例の場合、Scala 2.8ではNumeric[T]というtraitが定義されているので、自前で PlusOpみたいなtraitを定義する必要は無く、以下のように書くことができる。 import scala.math.Numeric case class Point2[T](x:T,y:T)(implicit num: Numeric[T]) { def +(that:Point2[T]): Point2[T] = { Point2[T](num.plus(x,that.x),num.plus(y,that.y)) } } object Run { def main(argv:Array[String]) { val p,q = Point2(3,5) println(p+q) val r,s = Point2(3.5, 4.5) println(r+s) } } implicit conversionとimplicit parameterそのものに関する解説はここですると長くなってしまうので、 必要であれば、Web上にあるドキュメントを読むなり、Scala本を買うなりしてください。
> ひょっとしてC++ or D系の言語から来た人かな? はい、その通りでございます。 Swing使いたいけど、Javaはヤダっていうわがまま。 def +(that:Point[U]): Point[T] = Point[T](x+that.x,y+that.y) と書いてみて「Uなど存在しない」と怒られたり・・・(トホホ)。 やっぱJava系の型計算をよく分かってないせいでしょうかね。 標準で使えるオブジェクトの種類が多すぎて的を絞れていないです。 > で、解決策だけど 手元にコップ本はあるので、そこら辺をよく読んでみます。 毎度大変助かります。
うわ、返信書いてる間に・・・。 親切すぎる!
おぉ、コップ本21章は必読ですね。implicitマジックやな、これは。 implicit def 名前テキトー(x:Double) = x.toInt を勝手に探しにいったりするわけですか。 ・・・うかつな使いかたをするとエラーの所在を当てるのが難しくなりそうですね。
351 :
デフォルトの名無しさん :2010/07/14(水) 19:27:27
コップ本の31章の一番最後(573ページ)に、 >パーサー生成でLALR(1)のような効率のよい解析アルゴリズムが使える。・・・(途中略) >誰かがそのようなジェネレーターを作れば、それは標準Scalaライブラリーに簡単に統合できるだろう。 とか書いてあるけど、誰か作ってる人いるの?(もしくは実はもう出来てるとか?) これは著者は作る気ないけど"誰か作ってくれないかなぁ〜"ってことなのかな?
もうすぐ2.8が正式リリースされるだろうけど コップ本の内容って役に立つよね? 買おうかどうか悩んでる。
>>352 ほかにいい本ないしね。買ったほうがいいよ。
ついにfinal RCか。
(* ̄∇ ̄)/゜・:*【2.8.0 final】*:・゜\( ̄∇ ̄*)
(* ̄∇ ̄)/゜・:*【2.8.0 final】*:・゜\( ̄∇ ̄*)
(´・ω・`)人(´・ω・`)
一番にキターしたかったのにorz
寝る前にチェックしたときはリリースしてなかったのに(´・ω・`)
Helios対応 Scala-IDEまだぁ〜待ちく(ry
(;^_^ /゜・:*【2.8.0 final】*:・゜\(;^_^
次の、2.8.1または2.9または3.0はいつでるの?w
>>354 > ほかにいい本ないしね。買ったほうがいいよ。
「ボクらのScala ~ 次世代Java徹底入門 」
を買ったけど、思ったより良かった。
・日本人が書いているから、変な和訳はないので、読みやすい。
・洋書にありがちな、分かりやすいようで分かりにくい例え話は、ない。
・日本の出版社の本は、図とかレイアウトが丁寧で分かりやすい。
・だけど、本の題名で損している。
「ボクらの〜」という題名で敬遠している人は多いかと思うけど
「たのしいRuby」とかと同じ系統の本で、なかなか良い。
「次世代Java入門」っていう副題は、意味不明。内容的にほとんど意味なし。
Scalaは自称次世代Javaだから
自称してるのは、「次世代javaの先取り」だけどな
先取り次世代Javaならまだよかったのに
なんでmutableなのにListBufferはvalで宣言して、 しかも+=ができるの? 意味わかんなくて理解できなくて睡魔に襲われたんですけど
+=っていう名前のメソッドが定義されてるから
371 :
354 :2010/07/16(金) 01:13:37
>
>>365 ん〜〜〜・・・初心者にはいいのかもしれないが、ある程度Javaとか知ってるなら、コップ本以外ありえないと思うんだけどなぁ。
自分的は、コップ本で理解できるから、他の本は内容薄くて、まったく買う価値が見いだせないっていう感じ。
>変な和訳、分かりやすいようで分かりにくい例え話、
この辺はどんな洋書の和訳でもそういうものだし、別にコップ本はそういうのあまりないと思うけど。
っていうか、そういう翻訳されたものとか結構読んでるから、洋書独特の例え話とか慣れてしまって、意識すらしてなかったな。
>>369 オブジェクトがmutableということと変数がmutableということを混同している
valは、あくまでその変数に再代入不可ということを保証するだけで、その変数が指す先の
オブジェクトがmutableであるかどうかは関知しない。+=に関しては、
>>370 の言う通り、そういう
名前のメソッドがListBufferに定義されているからだね。
ListBufferはインチキしてるから。 インチキの実態は、コップ本に詳しく書いてある。 外向きには関数型言語っぽいけど、ライブラリ内部は全然そうじゃない、ってとこが Scalaの特徴のひとつだろう。これには幻滅する人も何割か居そう。
ScalaでのSymbolってどういうときに使えばいいの? 記法上は組み込みで特別な構文があるけど、Rubyとかと違って、 実態は単なる普通のクラスと何ら変わりないわけだし、 パフォーマンス考えたら、JVMの仕様上、Stringで代用したほうが、速そうな気がするんだけど。 (比較するのは速いかもしれないけど、生成するのにコストがかかる? JVMはStringは特別扱いするけど、JVMから見ればSymbolは単なる普通のクラスでしかないよね?) コップ本にも1ページ分くらいしか載ってないし・・・
>>373 >外向きには関数型言語っぽいけど、ライブラリ内部は全然そうじゃない
パフォーマンスのこと考えてるんだろうから、それは正しい選択だと思うが・・・
幻滅する人はHaskellでもやればいいよ
>>375 Dみたいにconst(final)とimmutableを区別できるのはメリットがあると思うけどな
>オブジェクトがmutableということと変数がmutableということを混同している なるほど…!理解した
val x = numbers.head val y = numbers.last val r = numbers.tail ボクらのScalaでListの変数名を r にしてるんだけど、 これってどういう意味合いかわかりますか? range の意? (挫折した) Haskellだと複数形の s つけて xs ってしてたような
restですかね いやさっぱりわかりませんが
>>378 一時変数で適当につけてるみたいだし意味ないんじゃないの?
そもそも、rのいみわからなくて、そのxとyの意味あいはわかった?
ループ変数のi,jに意味求めるようなものだろう。元の意味や語源はあるけど意識してはつかってない
真意は著者に聞いたほうが早いと思う
i, j, k とか x, y とか n は数学的なものでしょ 意味合いも理解できるし、なによりいろんなプログラミング言語でも使われてる
i,j,kはFORTRANから。初期のFORTRANは整数型の変数名にI,J,K…しか 付けられなかったためいまだにその名残がある。 それよりscalaはすごく遅いのだがそういうものなんだろうか?
>整数型の変数名にI,J,K…しか付けられなかったため 宣言しなかった場合だけだろ
初期のFORTRANには宣言が無い。
restの頭文字とったんじゃないの head/tail = first/rest = car/cdr
(゚Д゚)クダー
>>385 追加
head/tail = first/rest = car/cdr = x/xs
本当はX|Xsと書きたい
>>387 > 本当はX|Xsと書きたい
しかし、こういう命名をすると次にXsをheadとtailにわけるとき、名前に困るという罠が
yとysでおk
つーか再帰して今のXsが次のXとXsに分けられるだけだろ なんで違う名前が必要なんだ?
391 :
378 :2010/07/18(日) 01:15:32
著者にTwitterで聞いてみたら、 書いたときは remainder のつもりだったんじゃないかなと思います。 とのこと
著者に気軽に質問ができるなんて、ホント便利な世の中になったもんだ
javaの static class X { static { ... } } (staticオブジェクトが初めて起動されたときだけ実行される) と同じことをScalaでやろうとすると、 object X { { println(new java.util.Date()) } def exec() = println("world!") } X.exec() X.exec() これで良さそうですが、 def init() { ... } みたいなマジックワードがあったりするのでしょうか? (初期化し直したかったりする場合のため) 初期化コードが長い場合に他のメソッドが埋もれないように、 とりあえず上のように中括弧いれてみましたが、それ以外で。
>>393 def init() { ... } みたいな初期化時に呼ばれる専用メソッドは特に無いので、
object X { ... } の中に初期化コードを直接入れるのでOK.ちなみに、{}をいれずに
直接初期化をobject直下に書いた場合、初期化コード中でしか使わないローカル変数を宣言しようと思っても、
フィールド扱いになってしまうので、そういうのを避ける意味でも初期化コードが長くなるなら、初期化
コードを{}で囲むのは良いと思う。
マクロ機能はいつサポート予定ですか?
これ以上複雑にされると、もうついていけない。
>>391 乙乙
疑問が解けた
特に習慣的に決まっていて書いていたわけでもないのねw
398 :
デフォルトの名無しさん :2010/07/19(月) 09:57:49
>>396 なにがサポートされようが便利なら使えば良い便利でないとか判定できないなら
無視すれば良い。それで困ることがあるはずない。
400 :
デフォルトの名無しさん :2010/07/19(月) 12:42:26
もっと複雑になればJRubyの需要が高まるね(ニッコリ
val xs: List[Int] = eval("List(3,2)") みたいに、リスト限定でevalをしたいのですが、 正規表現、パーサー作る、以外の簡単な方法はありますか?
import scala.tools.nsc.Interpreter val xs = (new Interpreter).evalExpr[List[Int]]("List(1,2,3)") 一応こういうのはあるけど、こう使うものなのかよくわからない
403 :
401 :2010/07/19(月) 16:08:34
実は正統なやり方もよくわかっていません。 Cだとsscanfで簡単に3と2を切り出せるのですが、 こういう修飾された文字列からTokenizerを使って読めるのでしょうか? (検索するとCSVのサンプルはたくさんあるけど、あれは余計なゴミがついてないから・・・)
404 :
401 :2010/07/19(月) 20:24:54
sscanfでは配列を読めないんじゃ… まあ、なにをやりたいのかわからないけど、 特にこだわりがないなら内部DSLにするのがScala的なんじゃないかな その次はパーサーコンビネーターを使う evalはScalaではかなり邪道でしょう ちなみにList[Int]を読み込むだけなら パーサーコンビネーターでこのくらいで書ける この程度なら書いたほうが早いでしょ import scala.util.parsing.combinator.JavaTokenParsers val parser = new JavaTokenParsers { def list = "List" ~ "(" ~> repsep(decimalNumber ^^ (_.toInt), ",") <~ ")" } val xs = parser.parseAll(parser.list, "List(1,2,3)").get
406 :
401 :2010/07/19(月) 21:34:08
自分のケースについては完全に動作しました。ありがとうございます。 ただ、パターンの部分は勉強しないと読めませんね・・・。
Google Web ToolkitをScalaでやるのって可能なの? あれって、Javaソースコード(.java) => javascriptソースコード(.js) へコンパイルしているんだろうけど、 Scalaソースコード(.scala) => Javaソースコード(.java) へのコンパイラがあれば、 Scalaソースコード(.scala) => Javaソースコード(.java) => javascriptソースコード(.js) ていう感じでできるかな?(コンパイルすごく時間かかりそうだけどw)
ところがだ Javaソースコード(.java) => javascriptソースコード(.js) にとって意味のあるコードは Scalaソースコード(.scala) としてはまったく無意味なコードになるであろう
ちなみに以前読んだ記憶では一旦JavaのASTにはしてるけど Javaバイトコードに落ちる前だった。
411 :
407 :2010/07/20(火) 02:36:59
>>410 一応プロジェクトもあるのかぁ。ありがとうございます。
packageと、実際のソースがあるフォルダが対応してなくていいのって、 なんでこんな仕様になってるの? 使うときなくない? 対応してなかったら紛らわしいだけだと思うんだが。
413 :
デフォルトの名無しさん :2010/07/24(土) 03:36:58
http://d.hatena.ne.jp/yuroyoro/20080809/1218253532を参考に 、
下記を実行しても、コンソールには「value:world :: Empty」と出力されてしまい、
S.param("whoField")の部分が「Empty」となってしまいます。
「value:world :: :world」にならないのは何故でしょうか。
class Test {
object who extends RequestVar(Full("world"))
def show(xhtml: NodeSeq): NodeSeq = {
bind("hello", xhtml,
"whoField" -> text(who.openOr(""), v => who(Full(v))) % ("size" -> "10") % ("id" -> "whoFieldText"),
"submit" -> submit("Send", () => {println("value:" + who.openOr("") + " :: " + S.param("whoField"))}),
"who" -> who.openOr("")
)
}
}
<lift:surround with="default" at="content">
<h1>Hello Form2</h1>
<lift:Test.show form="POST">
Hello <hello:who/>
<br/>
<label for="whoField2">Who :</label>
<hello:whoField/>
<hello:submit/>
</lift:Test.show>
</lift:surround>
抽象型って抽象メソッドとかと違って実装しなくてもコンパイルできんだな、なんでこんなんなの? trait Hoge {type A} class Fuga extends Hoge //コンパイルできる
>>414 抽象型はそれだけでも、「何だかわからない不明な型」みたいに型チェッカに扱われるので、コンパイル通る。
プログラムの実行ファイルってみんなどうやって作ってるんだろ? eclipseとかnetbeansにそういう機能がついてんの?
416みたいな人(失礼!)でも使うくらい、scalaって知名度があるんだな。 少し見直した。
まぁ裏でMavenが何やってるか知っておきたい気はする
>>412 package scala.collection
package immutable
とした場合と、
package scala.collection.immutable
とした場合にスコープが違くなるとかそういう話?
scalaは書き方が好きなんだけどいざ使ってみるとすごく遅い。 単純なプログラムでも起動してから最初の結果を得るまでに1秒くらいかかるけど インストールでへまやったんだろうか? みんなもこんなに遅い?
421 :
デフォルトの名無しさん :2010/07/27(火) 08:58:09
>>420 eclipseとかつかってる?
コンパイル(と起動)が遅いだけで、実行スピードは、Javaと対して変わらないよ。
System.currentTimeMillisとかで、起動したときと、終了する前の時間調べればわかるけど
そんなあなたにfsc
起動が遅いのはJVM系言語の共通の弱点だね コンパイルが遅いのは、もうちょっと頑張ってほしい
レスサンクス。
>>421 eclipseは使ってない。起動に1秒くらいかかるだけで処理が始まってからの時間は
lispと大きく変わらないようだ。
>>422 ,
>>423 両方早いにこしたことは無いが実行時間が早くなってほしい。jruby,jython,clojureも
同じ状況なんだろうな。
425 :
デフォルトの名無しさん :2010/07/27(火) 18:19:07
質問です。 scala2.8で val list = nw ListBuffer[(Int, String)] list += (1, "a") とすると、下記のようなエラーがでます。 <console>:8: error: type mismatch; found : Int(1) required: (Int, String) list += (1, "a") ^ ちなみに2.7.7.finalだと正しく動作します。これってなんで。
426 :
425 :2010/07/27(火) 18:26:01
list += Tuple2(1, "a") だと上手くいきました。 なんか2.8で変わったのかな。
>>425 ListBufferのAPIドキュメント
http://www.scala-lang.org/docu/files/api/scala/collection/mutable/ListBuffer.html 見ればわかるんだけど、
def +=(elem1: A, elem2: A, elems: A*): Growable[A]
というシグネチャの可変長引数のメソッドがある(2.7では無かった)。そのため、
list += (1, "a")
というのが、可変長引数のメソッド呼び出しと解釈されてしまうため、第1引数がIntで第2引数がStringで、
という風になっちゃうわけだ。しかし、ListBuffer[(Int, String)]の場合、各引数は(Int, String)でないといけない
から型が合わなくてエラーになる。回避するには、
list += (1 -> "a")
のように->演算子を使うか、
list += ((1, "a"))
のように括弧を余計に入れて、可変長引数バージョンでなく1引数バージョンのものだと解釈させる
ようにする。個人的には、->演算子使う方が好みかな。
428 :
デフォルトの名無しさん :2010/07/27(火) 18:45:33
>>427 理由まで説明してくださり勉強になりました。
有難うございます。
この話、前もあったよね 意外とひっかかるポイントなのかも タプルは->を使うというのがScalaの豆知識だね
430 :
デフォルトの名無しさん :2010/07/27(火) 21:54:29
lift使いの皆さんはストレージとのやりとりに mapper and recordとJPAどっちつかってる? jpaの方がejbにそっててなじみがあるので良いような気がするんだけどどうなんだろ。
>>429 要素が3つ以上の時は -> だと駄目だよね
>>422-424 Scala気になってるんですが、
こういうのってハックみたいなもので解決する方法ってあるんでしょうか?
Rubyなんかだと、素のRubyは速いけれどライブラリたくさんよむとやたら重くなって
テスト実行時にDRbだかRubyのサーバー?みたいなのを裏で立てておいてライブラリの読み込みを高速化する方法とかあったけど
webアプリは開発モードだと必要なものだけリロードできるし
いくら起動が遅いと言ってもインタプリタが動的に読み込むよりは早いんじゃないの
>>432 fscはそういうアプローチなのでは。
実行はOSGiバンドルでやるとJVMの起動分は早くならないかな?
ターミナルもう一つ立ち上げてsbtで監視がFA
sbtのことサバトってよんでもいいかな
スブタにしようぜ
質問させてください import scala.util.control.Exception.catching def castToInt(v: Any): Option[Int] = catching(classOf[ClassCastException]) opt v.asInstanceOf[Int] こういう関数を定義すると scala> castToInt(24) res1: Option[Int] = Some(24) scala> castToInt("abc") res2: Option[Int] = None こういう実行結果になると思います。 def cast[T](v: Any): Option[T] = catching(classOf[ClassCastException]) opt v.asInstanceOf[T] そこでこういう関数を定義して castToInt の汎用版を作りたいと思ったのですが scala> cast[Int](24) res3: Option[Int] = Some(24) scala> cast[Int]("abc") res4: Option[Int] = Some(abc) こうなってしまいます。なぜこのような挙動をするのでしょうか?ちなみに、 scala> res4.get java.lang.ClassCastException となるので、get したときに初めて ClassCastException が発生しているようです。
asInstanceOfはコンパイラ向けであって、 実際にキャストしてるというわけじゃないんだろうね Manifestを使ってクラスを取ってきて無理矢理キャストしてみるとか? まあ、そんな関数作らないほうがいいよねw
441 :
デフォルトの名無しさん :2010/07/31(土) 22:18:13
>>439 JVMつかってることによるscalaの型システムの限界かな
442 :
441 :2010/07/31(土) 22:42:32
こんなふうな関数つくって def cast[T](t:T)(v: Any):Option[T] = { try{ Some( t.asInstanceOf[AnyRef].getClass.cast(v).asInstanceOf[T] ) }catch{ case e:ClassCastException => None } } 第一引数に、castしたい型のオブジェクトの実態をいれれば どうにかそれっぽいことできるけど・・・(´・ω・`)カッコ悪い・・・ scala> cast(0)("abc") res0: Option[Int] = None
443 :
439 :2010/08/01(日) 00:43:05
>>440-442 ありがとうございます。Manifest 調べてみます。classOf[T] もできないんですね。
もともとやりたかったのは、例えば KVM のようなデータストアにアクセスする以下のような Java のライブラリがあったときに
interface Store {
Object get(String key);
void set(String key, Object value);
}
これに対して Scala らしいインターフェースのラッパーを作りたかったんです。そこで
class Wrapper(store: Store) {
def apply[T](key: String): Option[T] = {
val value = store.get(key)
if (value == null) None
else catching(classOf[ClassCastException]) opt value.asInstanceOf[T]
}
def update(key: String, value: Any) {
store.set(key, value)
}
}
というのはどうかなと思ったところうまくいかなくて、先ほどの質問をしました。
静的型の言語に慣れてないのでうまいやり方がわからないのですが、
皆さんだったらどのようなインターフェースにしますか?
そうか、Manifestでクラスを取ってきてもBoxingできないんだね まあ、自力でテーブル作ればいいけど
>>443 いや、それはキャストエラーをNoneで潰しちゃ駄目なんじゃない?
見つからないのか、型が違うのか、区別したほうがいいと思う
446 :
439 :2010/08/01(日) 01:34:51
manifest 使ってみました。こういうことでしょうか。
def cast[T <: AnyRef](v: AnyRef)(implicit m: reflect.Manifest[T]): Option[T] =
catching(classOf[ClassCastException]) opt m.erasure.cast(v).asInstanceOf[T]
AnyRef を Any にしたければテーブル作れって事ですね。
>>445 確かにそうですね。
目的と違う型ならどうせ利用できないから無いも同然でもいいかと思ってこうしました。
少なくとも厳密なAPIは別に必要ですね。
静的型言語でキャスト失敗するって99%バグだからね むしろ、そうやって型を活かすように書くべきというか だからキャストエラーなんてそのまま上に投げちゃって構わない
448 :
439 :2010/08/01(日) 02:22:15
確かにバグ以外は思い浮かびません。 catching の方は消すことにします。 アドバイスありがとうございます。 最初 Option[T] にせず T をそのまま返してたので気づかなかったんですが、 Option[T] にすると型推論も効かなくなるみたいなのでもうすこし考えてみます。
449 :
デフォルトの名無しさん :2010/08/03(火) 18:26:36
>449 コレ使うと、liftのビルドおかしくなるのかな、やっぱ。
やっとheliosにscalaプラグインインストールできた&かなり良くなってる
val a = new String("abc") val b = new String("abc") こうやるとa eq bはfalseになるんだけど val a = "abc" val b = "abc" こうするとa eq bがtureになるのはなんで?
javaの仕様で同一内容のStringリテラルは同じインスタンスを参照することになってる。 リテラルの場合はaもbも同じインスタンスだからtrue newした場合はそれぞれ別のインスタンスだからfalse
456 :
デフォルトの名無しさん :2010/08/16(月) 13:13:11
スレ違いでしたらすいませんが質問です Scalaプログラミング入門を読んでScala初心者始めたのですが 触り始める前の、関数型言語とオブジェクト指向の自然な融合をした実用言語の印象が それプラス強力なパターンマッチと再帰の組み合わせが新たなパラダイムを開けそうな言語 に見えています。 アクターとパターンマッチングは自分の使ってきた他の言語に見られない特徴なのですが この機能はどの言語からの輸入なのでしょうか? (アクターはSmalltalkのメッセージからっぽいのですが・・・)
アクターとパターンマッチを組み合わせた実用言語といえば まずErlangを連想するべき
>456 触りはじめなら、F#と比較してみたら?
JVM以外のサポートってどうなってるの?.Netとか対応予定ってみたことある気がするんだけど。昔。
>>460 Scalaは、既に.net には対応しているんじゃないの??
JVMは、SwingとかGUIもそろっていて良い面がある一方で
OracleのAndroid訴訟とかあるし、JVMの将来が不安だ。
技術面でなくて、政治的な面で、JVMの将来が不安。。。
だからといって、.netも将来的に不安だし。。
GJCみたくScalaも叩かれる訳か
Sun…じゃなくてOracleのリファレンスJVMなら大丈夫なんじゃないの?
質問させてください。 同名の method, property を持つ Java のクラスを継承し、 その method を override しつつ、 property にアクセスすることってできませんか? J.java public class J { protected int a = 0; public void a() { a += 1; } } S.scala class S extends J { override def a { a += 2 } } こんな感じのことがしたいです。
scala.org がダウンしとる... 2.8.0.final-devel-docs 落としとくんだったお
467 :
デフォルトの名無しさん :2010/08/20(金) 17:47:53
>>465 継承するとprotected int a が見えなくなっちゃうふしぎ!
$ cat J.java
// J.java
public class J {
protected int a = 0;
public void a() { a += 1; }
}
$ javac !$
javac J.java
$ scala -cp .
Welcome to Scala version 2.8.0.final (Java HotSpot(TM) Server VM, Java 1.6.0_20).
...
scala> (new J).getClass.getDeclaredFields
res0: Array[java.lang.reflect.Field] = Array(protected int J.a)
scala> (new J {def f = this.getClass.getDeclaredFields}).f
res1: Array[java.lang.reflect.Field] = Array()
おお、なるほど こりゃ失敬しました でも super[J].getClass.getDeclaredFields もダメなんです はい、頭固いってよくいわれます
!? わかった this.getClass.getSuperclass.getDeclaredFields
できたじぇ scala> val j = new J {override def a = {val sa = this.getClass.getSuperclass.getDeclaredField("a"); sa.set(this, sa.getInt(this) + 2)}; def geta {println(this.getClass.getSuperclass.getDeclaredField("a").getInt(this))} } j: J{def geta: Unit} = $anon$1@1ad637e scala> j.geta j.geta 0 scala> j.a j.a scala> j.geta j.geta 2
>>467-471 ありがとうございます。ここまでやらないとダメなんですね。
protected val _a = getClass.getSuperclass.getDeclaredField("a").get(this).asInstanceOf[XXX]
こんなふうに持つようにしたらうまくいきました。
あ、あれ? 素直にコンポジションにしろよってツッコミがくると思ってた… 斜め下の回答して、婉曲にあの人頭おかしいっていわれるのが得意です(キリッ
protectメンバのテストには無名クラス使えばいいんだけど テスト対象がprivateの場合はどうしたらいいの? Inspectorで権限書き換えるしかないのかな?
ScalaがJavaと比べて簡潔に書ける理由って具体的になに? 3秒考えてみたけど、リテラルが多いことしか思い浮かばなかった
パターンマッチ!パターンマッチ!
見た目が簡潔との観点だと ・関数オブジェクト ・多重継承の代用となるミックスイン ・シングルトン代わりのObject とか
>>475 関数リテラルとXMLリテラルと複数行文字列リテラルくらいじゃない?Javaに比べて追加されてるのって。
List(...)とかArray(...)は別にリテラルじゃないし。
個人的には、典型的なクラス定義が簡潔に書けるように考慮された文法(case classなど)、ファーストクラスの関数(高階関数)、
パターンマッチ、placeholder syntax、trait辺りがポイントかなあと思う。あと、packageの扱いが柔軟なのもなにげに嬉しい
・Actorで非同期並列処理が簡単に書ける ・遅延評価を用いたif,whileの独自拡張構文が書ける ・パーサーコンビネーターでらくらくDSL構築 ・XMLリテラルでXMLパーサーいらず
・型推論によってコンパイラが型を特定できる場合は省略可能 ・行末の";"がいらない ・Scala基本コンストラクタのパラメータは自動的にprivateインスタンス変数になる ---- Java ---- class MyClass { private int index; private String name; private MyClass(int index, String name) { this.index = index; this.name = name; } } ---- Scala ---- class MyClass(index: Int, name: String) [Scala スケーラブルプログラミングより]
クラスのメンバでvalだとゲッタvarだとゲッタ&セッタを作ってくれるってのがなんか感動した 短く書くためのC#の自動実装プロパティとかよりさらに短く書ける上に自然だし
・引数が無い関数呼び出しの()を省略できる ・Option[T]でnullチェックいらず ・Javaのfor文の入れ子⇒ジェネレータ"<-"で一つのfor{}にまとめることができる ・複数の結果を返す関数などちょっとした入れ物が欲しいときには括弧でくくるだけでタプルになる
よし、まだ忍者は来ていないな。
呼んだ?
にゃるほど コピペで記事にできそうだな
GroovyServってのは、nailgunとなんか違うのかな。
遅延評価つかうとVB.Net の With statementのような事ができるのかな? dataout.writeInt(data.length) dataout.write(data) dataout.flush() ↑こういうのを↓なかんじに with(dataout) { _.writeInt(data.length) _.write(data) _.flush } できたらうれしく……ないか とりあえずdef withでscala/srcをgrepしたら一杯出てきてどうしよう←いまここ
>>488 そういうことしたいなら、
{
import dataout._
writeInt(data.length)
write(data)
flush
}
で、どうかな?
スコープを {} で括るのってJavaでもできるけどダサくないっすか
Scalaの開発では、1つのソースコードに1つのクラスを書くのが基本ですか?(内部クラスみたいのは除く) もしそうなら、ソースコードのファイル名も、1文字目が大文字っていう慣例がありますか? ITProのアクターの記事は1ファイルに数クラス書いてるけど、 これは閲覧者がコード内容を理解しやすいからって認識で良いのかな 書籍はインタプリタでScalaを解説してるから、なんかこういう細かいことで疑問が生じた
そんな縛りないよ
設計管理じゃなくて"ハック"がしたいんだよ
ScalaはJavaで散見された紋切り型の記述が必要ないので、普通のclassも規
模が小さいし、その周りに粒度の小さいcase classとかtraitとかがわらわら
出てくるのでそんなのにいちいちファイル作ってたらきりがないってのがあ
る。
リファクタリングのコストが高くなって不要なクラスを故意に見逃すくらいな
らそんなファイル作らないぜよ
「ThoughtWorks アンソロジー」のオブジェクト指向エクササイズのように徹
底してやりたいならリリース直前の最終段階で小分けにすればいいやん。
多分みんなそこからブランチつくってプロジェクトが枝分かれするねw
とりあえず
>>491 はScalaインストールして実際に手動かすべきだと思う
んじゃあ1モジュール1ファイルにするってことでいいのかな 1ファイルにインタフェースと、それを継承した複数の実装を書いちゃう感じでいいの
なんとなくこのスレみてて 仕事で使うことは無いだろうなと思ってたら scala使う案件担当することになったわw
くらしき行きたかったなぁ…
Scalaの案件… 最近、技術力を求める案件が増えてる気がするなあ
Scalaいいたいだけちゃうんかと、ヒゥイッヒヒー
>>489 おお、こんな機能あったんすね(2.8まだ入れてなかった...)
- Package objects
Packages can now contain besides classes and objects also methods,
fields or type aliases. These are added to a package by declaring a
package object. More capabilities might be added to package objects
in subsequent releases.
>489とpackage objectは関係ないし、2.8じゃなくてもできる
ありがとうございます さっそくつかってみます
501 :
デフォルトの名無しさん :2010/09/03(金) 16:10:14
以下のコードは通らないのですが、常套手段があったりするのですか? ###################### case class X(x:Int) class Y[T] { val p = T(1) } val y = new Y[X] println(y.p)
常套手段ではないと思うけど頑張ってやるとしたらこんな感じかね case class X(i: Int) class Y[T](val companion: (Int) => T) { val p = companion(0) } val z = new Y[X](X) println(z.p)
Scalaの糖衣構文をまとめた資料ってどっかにない?
割と頻繁にJAVAコードを追ったりJVMの動作を考えさせられるのが鬱陶しい
確かにJavaの仕様に依存するところも多いがJavaを知っていれば問題はない Java詳しくないのであれば、Javaの勉強もできて一石二鳥なんじゃね?
そりゃプログラムを完成させるだけなら問題ないだろうよ。 俺は暗号化されたようなJAVAコード読みながらちまちまパフォーマンス を詰めるのが苦痛で仕方ない。 関数型言語ってのは流儀にのっとって書けば効率良いバイナリを 吐いてくれるという幻想が見事に打ち砕かれたわ。
JavaとかScalaとか言う以前に "The 90/10 Rule" を知らないのかよw
509 :
sage :2010/09/06(月) 11:15:16
オーバーロード
511 :
sage :2010/09/06(月) 12:40:37
あれ、どうして? case class window(w:Int,h:Int) { def this(w:Int) = this(w,w) } window(3) >> error: not enough arguments for method apply: (w: Int,h: Int)window in object window.
512 :
sage :2010/09/06(月) 13:00:44
classだとできるのにcase classだとできないっぽい。 なぜだ・・・?
case class Window(width: Int, height: Int) { def this(i: Int) = this(i, i) } object Window { def apply(i: Int) = new Window(i) }
Cool!!
515 :
sage :2010/09/06(月) 15:56:18
なんかたらい回してる感もあるけど、現状ベストでしょうね。 ありがとうございました。
def f(x:Int):Stream[Int] = { return if (x<0) Stream(-1) else Stream(x)++f(x-1)//++f(x-1) } println(f(1<<10).take(10).toList) 上のプログラムで、コメントアウトを外すとOutOfMemoryErrorになってしまいます。 一方で、 (Stream.from(0)++Stream.from(1)) take 10 foreach println なんかは大丈夫なので、ダメな理由が分かりません。
>>516 f()の計算のどこかで名前渡しのパラメータを使う関数を介さないと
計算が止まらない。
def f(x:Int):Stream[Int] = {
return if (x<0) Stream(-1) else Stream(x) append f(x-1) append f(x-1)
}
>>517 ありがとうございます!感謝しきれません。
自分のコードでも、一カ所変更するだけでうまくいきました。
どういう機構でそうなるのか理解したいですが、
あいにくコップ本には遅延Streamの記述が見当たらない・・・。
>>518 >どういう機構でそうなるのか理解したいですが、
>>517 がほとんど答えだけど、もう少し詳しく解説すると、
Streamの++は引数を遅延評価しない。つまり、++が呼ばれる前に++の引数が評価される必要がある。ここで、
def f(x:Int):Stream[Int] = {
return if (x<0) Stream(-1) else Stream(x)++f(x-1)//++f(x-1)
}
の定義を見てみると、++の引数にfの再帰呼び出しが生で渡されてる。つまり、
f(x)をx >=0なるxに対して呼び出すと、x <0になるまで一気に評価されてしまう。コメントアウトしたままの
コードだと、たかだか1024個分の要素があらかじめ生成されてしまうだけなので大丈夫だけど、コメントアウトを
はずすと、fの呼び出し回数が指数関数的に増えていくので膨大な数の要素が生成されてしまうので、OutOfMemoryError
が起きる。
>>519 自己レス
誤:1024
正:1026
アホなミスしてしまったorz
atmarkitに書いてあるけどなぜScalaってゴミ機能満載にしたの?
Java厨が悦ぶから
糞言語なんだろ
糞サイトはどうでもいいけど、どっかの糞言語開発者も毎回同レベルのイチャモンをつけてくるから困る
Scala糞だし
お金稼ぎに使わない教養を積むために勉強する言語なんだから いろいろ面白い機能が実装されてるほうが良い。 Scalaはちゃんと目的を果たしてるし、ゴミとか言われる筋合いはない
>>526 教祖様が起業したのはお金のためでしょ?
立場が違うと思うの。
>>526 Odersky先生は前からはっきりとScalaは実用のために作った言語だって言ってるよ
実際、そうじゃなかったらJavaとの互換性にここまで気を使わんだろうと思う
このインタビュー読むといいと思う
http://www.artima.com/scalazine/articles/origins_of_scala.html 純粋にアカデミックな言語(だけど実用的でない)であったFunnel(Scalaの祖先)と、実用的だけど
制限が多いGJ(Generic Java)の中間のアプローチを取ったのだと。
>>527 お金のためっつうか、それだけ本気でScalaを普及させたいんじゃないかと。なんつーか、これは
MLとか各所でのOderskyセンセイの言動を読んでの、あくまで個人的な感想だけど、関数型プログラミングを
産業界に本格的に持ち込むことに強い意義を見出してるんじゃないかという気がする。Scala VS. Clojure
みたいな喧嘩があったときも、関数型プログラミングコミュニティで内輪もめしてる場合じゃねえ(意訳)
みたいな事書いてたし。
そうだね。Cに対するC++のようなもんだ。Javaに対するScala。 関数型の眼見ればまあいろいろ筋の悪さはあるけど、 ぶつくさ言われつつもやはり広く使われると思うよ。 というかそういう筋悪なものでないと広く使われるようにはならないんじゃない。 そのうちC++に対するJavaのような、Scalaの後を襲う言語も出てくるだろう。
ISO申請せずに実用的と言われてもなぁw
規格化は時間がかかるし、そもそも規格の意味があるだけ 流行って処理系含めて周辺環境が多様になるのかも まだ分からんでしょ
Java本体すらISO化しとらんのに
Javaのように書けて、JavaVM上で動いたらそれはScalaだよもん。
535 :
scalaZa :2010/09/14(火) 23:01:23
Scalaで、対話型のサーバとコマンドをやりとりするクライアントを書こうとしてるんだけど、 何かそういう用途にうってつけの機能とかライブラリとかないかな。
ARM
EclipseのHeliosにPlugin入れてScalaの勉強はじめてみたんですが、 importの補完って自動でやってくれないんでしょうか。 コードをEclipseでスラスラ書いて、 ビルド→テストはsbtって感じがよさそうだったんですが…
541 :
539 :2010/09/16(木) 00:40:02
importの自動補完ができるかどうかと、何の関係があるんですか?
SS本を見ると「例外は使うな、Optionにしろ」って書いてあるけど、 Noneにはエラーの原因とか入れられないよね。こういう場合はどうすれば?
nullは使うなの間違いじゃないか?
Optionより、Boxおすすめ。
Some以外つかうな 今後の互換性がない
どっかで例外をEitherでラップできるぜみたいなの見たことあるけど どんなメリットあるんです?
EitherでMaybeモナドっぽいことやろうとしたら、 a.right.flatMap(...) みたいなことになってしまったのだが、 もっとスマートな記法はないのだろうか。
一方私はEclipseでスラスラという部分になんとも言えない違和感を感じていた
そんな私も今ではすっかり『Emacs + ENSIME + sbt』 なぜなら小指とCtrlは決して切り離せない特別な存在だからです。
>>545 BoxはLift使う限りでは問題ないのでは?
>>550 Box的なものをScala標準ライブラリに取り込む予定はないのだろうか。
BoxはLiftから分離されたでしょ?
>>552 知らなかった。今はどこが管理してるの?
sclala未経験募集してる求人ないの
Scala業務経験者なんて日本に何人いるんだ。
>>554 Scalaどころか、未経験者募集すら大変だといいうのにw
>>521-530 この記事の話ですよね?
http://www.atmarkit.co.jp/news/201009/13/spell.html >「ScalaもClojureも非常に有望な言語だと思います。
>ただ、Scalaは機能が豊富すぎて、
>たくさんのゴミが詰まっているというのが個人的な印象ですね。
>Clojureは美しくてシンプルです。
>でも誰もWebアプリを書くのにClojureなんて使いませんよね?
>Railsがあるんだから、Railsでやればいいじゃんって話です。
>計算や重たい処理が必要な部分でClojureを使うなど、今後は、
>1つの言語が特定の1つのことを上手にやるという方向で進化していくのだと思います」
同じ事をやるのに元からあった方法と追加された方法があって
言語仕様が複雑というのはC++とScalaの共通の欠点ですね。
でもHaskellより実用に使われているからこの方針は正しいのでしょう。
ややこしいゲームシステムのほうがユーザが燃えるってのと似てるのかな
じゃあゴミを取り除いたシンプルなScalaのサブセットを考えようって思考実験すると 俺には取り除けるものが思いつかない
直行した機能一つ一つの存在感がでかいからゴチャゴチャしてるように見える
>>521-530 >>557 ここでいってるScalaのゴミってのは、Javaとの互換性の話なの?
だとしたらそれはゴミじゃないと思うんだけど
腐れ@の記事を見ると言語自体が 糞って書いてあるなw
そういう大雑把な批判って、静的型フォビアか、関数型を理解できないか、なんだろうな どうせOCamlとかHaskellのこともよく知らんのだろう
けどRailsの作者の話だろ?
いくつかのRubyのコードをリプレースしてみて分かったがやっぱりメンドイ。 respond_to?を大量に書かなくても済むようになったがそれでもメンドイ。 せめてif __FILE__ == $0 thenみたいなのが使えればテストが書きやすかっただろうに。 JVMの立ち上がりの遅さも手伝ってインタープリタの部分は使い物にならん印象。 betterJavaとして見ればとても良い言語だと思うけどね。
まー、Rubykaigi(カンファレンスみたいなもの)の記事ですのでねw
> なぜRubyだったのか?
>
> Rubyで性能や安定性に不安はなかったのかという聴衆からの問いに対して、
> 「むしろMySQLやOracleが先にボトルネックになることがありましたね」と、
> Rao氏はエンタープライズ用途でもRubyが活用できるとした。
> また、なぜRubyを選んだのかという問いに対しては、
> 「色々な側面がある。巨大なコミュニティがあるのが大きい。
> Rubyなら、困ったことがあっても聞けば答えてくれる大きなコミュニティがある。
> Javaにはそれほど大きなものはない」と話した。
> 「それにJavaで書いたとしたら、もっとプロジェクトは長引いただろうね」。
>
> DSLをRubyで設計したことについては、
>
> 「“ip.assign”というように、読めば分かるように書けるのでとても自然に感じるものができた」としている。
> きちんとテストを書く文化とツールがRubyコミュニティにある点も重要だという。
>
> 「Rubyのようなオブジェクト指向は振る舞いをテストしやすい。
> Rubyには、非常に成熟したテストの文化とツールもあります。
> テストを書かなかったら、君は本当にRuby開発者かと言われてしまいますよね。
> テストが書きやすいというのは重要で、PerlやPHPだと“うん、テストね。後で書くね”となりがちです」
>
> Scala、Clojureなど、JVM言語は候補にならなかったのか? 講演が終わった2人に聞いてみた。
>
> 「ScalaもClojureも非常に有望な言語だと思います。ただ、Scalaは機能が豊富すぎて、
> たくさんのゴミが詰まっているというのが個人的な印象ですね。Clojureは美しくてシンプルです。
> でも誰もWebアプリを書くのにClojureなんて使いませんよね?
> Railsがあるんだから、Railsでやればいいじゃんって話です。
> 計算や重たい処理が必要な部分でClojureを使うなど、今後は、1つの言語が特定の1つのことを上手にやるという方向で進化していくのだと思います」
Rubyの魔術 − @IT
http://www.atmarkit.co.jp/news/201009/13/spell.html
>>565 テスト用のフレームワークくらいあるんじゃないのか?
Rubyでも今時、f __FILE__ == $0 ではテスト書かないでしょ?
>>565 SpecsやScalaTestみたいなテスティングフレームワークは使わなかった?
立ち上がりの遅さに関しては、sbtみたいなVM常駐型のビルドツールでカバーするのが良いかと思う
あと、インタープリタってREPLのことかな?あれは立ち上げっぱなしにしておいて必要な時にファイルをロード
する使い方が良いと思う
ScalaTestは使った。特に不満はないが俺がやりたいのはもっと簡単なことさ。 例えばEmacsで編集中の関数の断片をちょっと動かしてみる・・・とかね。 REPL立ち上げっぱなしの使い方はunloadの仕方が分からずに敬遠してた。 Emacsからスムーズに渡せるとなおいいんだが・・・ 今度調べてみる。サンクス。
もっとScalaz使えよ
Ruby使いってのはeval-regionも知らずにEmacs使ってるもんなのかねえ それともruby-modeにしかないと思っているのか
ensime使ってる場合は↓を.emacsの(require 'ensime)の後ろに追加 (define-key ensime-mode-map (kbd "C-c C-r") 'ensime-inf-eval-region) (define-key ensime-mode-map (kbd "C-c C-b") 'ensime-inf-eval-buffer)
Scalaの内部DSLが読めないってRubyの作者がよく言えるな。鏡見ろよ。 って誰か言っておいて
ThoughtWorks社のMunjal BudhabhattiとSudhindra RaoってRubyの作者なの?
批判記事をRubyの作者にしたいやつがいるだけだろ
またやってんのかよw
Rubyはメタプログラミング始めるとわけわからなくなるけど、 Scalaは素でわけがわからないときがある、と Scalaスケーラブルプログラミングのサンプルコードを見て思た。 (一応通読はした) var a, b = new Hoge が var a = new Hoge var b = new Hoge と解釈されるのは何の冗談かと……。
aが初期化されてない変数になるよりよほどいいと思う
Dim a, b As New Hoge
>>578 ぶっちゃけscala.Enumerationのためにあるような機能なので、正直不要と言えば不要な気がする。
実際Scalaプログラミングしてて、この機能使う必要があるのってscala.Enumerationのときくらいだし。
2.8の限定継続使い出すと、ときどきこれがあると便利な場面が無い事も無いが、そもそも限定継続自体
ごく一部のマニアプログラマ除いてまだほとんど活用されてないからな。標準ライブラリでambとかgenerator
みたいなのをサポートしてくれると嬉しいんだが…。
なるほど val a, b = (1, 2) と val (a, b) = (1, 2) で動作が違うわけね これは確かにRubyから来た人は混乱するかもしれないな つーか、val a, b = 1という記法があることに今気づいたけどw
最近Mとかいうのがところ構わず噛みついて Rubyいいだろ?な?な?言えよほらいいだろ? って喚いているのがひどくうざい
まー、「まとめて代入」は誤解とバグの元なのでC時代から使ってないな。
Scalaはいろんな機能を過剰に一般化してるように思う。 メソッドの演算子表記+演算子の結合順序ルール +プレースホルダ構文 +implicit conversion +case class+パターンマッチ+抽出子 +traitのスタック +for式のわけのわからない構文 と、これだけ並ぶと、もはや脳のパーザが限界を超えてハングアップする……。
>>583 本人がRubyについて全く言及していない※にもかかわらず、
RubyがRubyがと騒ぐお前のようなやつの方がよほどうざい。
※今回の件限定で言えば、Rubyのことは知り過ぎてるから評価不能、
と最初に棚に上げてる。
>>585 真面目に「全て把握」しようとすると辛いんだよなー。
普段、「逆引き本」の類は馬鹿にしているんだが、
Scalaに限ってはそういうものが必要なのかもしれない。
Rubyについては持ち上げてるようで実際は貶してる書き込みが多いですよ
>>585 そんな難しい抽象化をやめて、二項演算子があって、Auto boxingで、継承はインターフェースで
パターンマッチがなくて、for構文はC互換にした素敵な言語ができるといいのにね!
ちょっと聞きたいんですが、 C言語やVBみたいな言語は構造化プログラミングを当たり前の時代にしましたよね JavaやC#(Rubyでもいいです)でいえばOOPを当たり前にしたように見えます。 Scalaは何を当たり前にする事ができる言語なものでしょうか? もちろん流行ったら、という前提で・・・
>>585 >>メソッドの演算子表記+演算子の結合順序ルール
言語仕様嫁
>>プレースホルダ構文
言語仕様嫁
>>implicit conversion
言語仕様とcategories typesの本1冊嫁
>>case class+パターンマッチ+抽出子
言語仕様嫁
>>traitのスタック
言語仕様嫁
>>for式のわけのわからない構文
言語仕様嫁
以上
>>591 それぞれの機能や表記がわからんなんて言っとらんわい。
そいつらを組み合わせて出てきたソースコードがカオス過ぎて、
1センテンス毎にドキュメントをひっくり返さないと分からなかったり、
検索キーワードすら分からなくて途方に暮れたりするのが問題なんだ。
591は何がしたいのやら
>>592 > それぞれの機能や表記がわからんなんて言っとらんわい。
> そいつらを組み合わせて出てきたソースコードがカオス過ぎて、
> 1センテンス毎にドキュメントをひっくり返さないと分からなかったり、
> 検索キーワードすら分からなくて途方に暮れたりするのが問題なんだ。
具体的に何がわからないの?それぞれの機能や表記がわかれば
組み合わせても一緒でしょ。つまるところ、理解した気になっているだけで
簡単なコードすら書けないんだよね?
Javaしかやってないとか、Rubyしかやってないみたいなやつが面喰らってるだけだと思うがね 一回Haskellやってカルチャーショック受けてくればいいのにと思うよ そうすればScalaなんて、なるほどねーよくできてるねーって感じになるから
わけわかんない機能や概念が糞多いから、 初心者はぼくらのScalaから読み始めたほうが馴染み易いぞ
記号のオペレータがググれなくて困ることはまれによくある。
598 :
デフォルトの名無しさん :2010/09/22(水) 01:14:24
2.8.1 RC1 age
>>595 頑張ってるのはよく分かるつもりだが、
よくできてるかどうかは……悪く言えば、型理論と泥臭い現実のギャップを埋めるために
あれこれ仕様を追加したキッチン言語がScalaだという印象
まあ言語設計は決して間違ってはいないのだろうけど、
SMLやHaskellにある、単一パラダイムがゆえの優美さは当然残ってないね
機能がたくさんあってわけわかんないって人は、 全部の機能とか構文を等価値だと思って、全部覚えて使おうとしてるからよくなくて、 慣れている人は、ここはオブジェクト指向的に書きたいとか、 関数型的に書きたいとかの目的があって使う機能を選ぶわけで 先にそういう感覚を身につけるべきなんだよな その点ではマルチパラダイム言語のScalaより先に機能が特化されている言語に触れたほうがいい
(´・ω・`)
また自演か
603 :
デフォルトの名無しさん :2010/09/22(水) 04:07:07
Lift勉強したいけどいい本ある? 解説サイト全然ないし不安だけど
全然面白くない
モノリシックvsモジュール なんてデジャヴュ
どうでもいいが疲れていると記号が顔に見えてきて困る 特に_と<の組み合わせがヤバい
m< _, _ >m
(_<_) 逆さにすると顔っぽい
b(0,0);
(T,_.T)
>>604 それだと
本にない細かい部分に詰まったら即終了になりそうだね
使ってる企業はどうしてるんだろ
>>591 はサーバーリソースの無駄だから圧縮したほうがいいと思う
これで↓
>>585 言語仕様嫁
以上
^^ まゆげ演算子(eyebrows)をこれからもよろしくね!
このトレイトを継承するならクラス、コンパニオンオブジェクト両方つくらなきゃだめだよ。 という制限をかけたいのですが、どうすればよいですか。 例えば、とあるDTOがあり、クラスの方でtoXml, validateを実装し、 オブジェクトの方でfromXml:Dtoを実装するというルールを作りたいのですが。
>>618 なぜimplicit conversion使わないの?
621 :
618 :2010/09/24(金) 23:52:21
ごめんなさい。
trait Dto {
def toXml: Node
def validate: Option[ValidationException]
def fromXml(node: Node): Dto
}
class HogeDto extends Dto {
override def toXml: Node = {}
override def validate: Option[ValidationException] = {}
override def fromXml(node: Node): Dto = {}
}
てな感じなら問題ないけど、
できるならHogeDto.fromXml(node)てな感じで使いたいのでコンパニオンObjectでfromXmlを定義したいのです。
そうすると私の中では
trait Dto1 {
def toXml: Node
def validate: Option[ValidationException]
}
trait Dto2 {
def fromXml(node: Node): Dto
}
class HogeDto extends Dto1 {}
object HogeDto extends Dto2{}
となってしまい、Dto1を継承するならDto2を継承したコンパニオンオブジェクトを作らなければいけないというルールを定義したいと思い
こんな質問をしてみました。
>>620 implicit conversionはまだ私の理解不足のためか、この場合(どの場合もそうですが。。)使いどころがわかりません。
もう少し御教授いただけますか。
trait DtoBase { abstract class AbstractDto { def toXml: Node def validate: Option[ValidateException] } type Dto <: AbstractDto def fromXml(node: Node): Dto } object HogeDto extends DtoBase { class Dto extends AbstractDto { def toXml = ... def validate = ... } def fromXml(node: Node) = ... } コンパニオンを作らなきゃダメとはちょっと違うが こんな感じで? HogeDtoはDtoの実装とfromXml両方作らなきゃダメ
623 :
618 :2010/09/25(土) 13:30:12
レスありがとうございます。 そのやり方は私にはなかったので、勉強になります。 只、ちょっと実装側にとって複雑な感じがします。 とりあえず、コンパニオンオブジェクトを使用しないで、 trait Dto { def apply(node:Node): Dto def toXml: Node def validate: Option[ValidationException] } にしようと思っています。
scala+LiftでMySQLのDBとやりとりしたいんですが、 scala2.7.7からdbcって無くなってます? もし無くなってたら、DBアクセスの方法を教えて頂けませんか?
625 :
624 :2010/09/28(火) 14:38:28
net.liftweb.mapper.DBを使う事で解決しました。
trait Hoge { val i: Int } class Fuga extends Hoge { val s: String = "1" implicit def s2i(s: String) = s.toInt val i = s } だとコンパイラは通らないのに trait Hoge { def i: Int } class Fuga extends Hoge { val s: String = "1" implicit def s2i(s: String) = s.toInt def i = s } だと通るんだがよくわからない、理由を教えてくれ
627 :
デフォルトの名無しさん :2010/09/28(火) 20:37:43
>>626 前者はプロパティのオーバーライド扱いだからNG
後者はメソッドのオーバーロードだからOK
ごめんやっぱりよくわかんない > 前者はプロパティのオーバーライド扱いだからNG プロパティのオーバーライドだとimplicit conversion働かないの? > 後者はメソッドのオーバーロードだからOK オーバーライドされてないかな?abstract無くてもコンパイル通るけど… 上の例 val i: Int = s だと働くっぽい。 型推論の問題の気がしてるんだが違うのかな?
629 :
デフォルトの名無しさん :2010/09/28(火) 21:08:25
型推論の結果 val i: String = s でオーバーライドしちゃってる
defの場合は型推論の結果 def i: Int = s2i(s) にしてくれてますよね、その違いはなぜ起こるのでしょうか?
631 :
デフォルトの名無しさん :2010/09/28(火) 21:36:43
パラメータが s: String 戻り値が i: Int のメソッド扱いだからじゃないかな? 多分trait側だと パラメータなしの 戻り値が i: Int のメソッド扱い
ワカンネ traitの def i: Int が > 多分trait側だと > パラメータなしの > 戻り値が > i: Int > のメソッド扱い で classの def i = s が > パラメータが > s: String > 戻り値が > i: Int > のメソッド扱いだからじゃないかな? と言っているの?(これがわからん)
つまり馬鹿は使うなってことだ
>>632 短縮型で書きすぎてて
class側でシグネチャ(引数と戻り値)の違う新たなメソッド定義してることになってる
だからオーバーロードになってる
Source.fromInputStream(System.in).getLines().collect 本のサンプルコードがコンパイルできない。オワタwwww
traitの def i: Int は抽象メソッドだから > class側でシグネチャ(引数と戻り値)の違う新たなメソッド定義してることになってる だとコンパイル通らないんじゃないですか? うちの環境だと val fuga = new Fuga fuga.i はStringの"1"じゃなくIntの1を返してるけど
じゃオーバーロードじゃなくて普通に抽象メソッド実装してるってことじゃね?
うむ、でもvalの場合は実装してくれなくて valとdefでどうして型推論に違いが出るんだぜ?って質問してたような気がするが もう眠いからいいやおやすみ
>>632 今度から仕様書熟読してから質問しろ。仕様書7.3見ろ
implicit def s2i(s: String) = s.toIntを定義したことにより
暗黙の型変換を持つ関数が定義された。
traitのiの型がdefなので上書き可能なため、implicit conversionが
成立しコンパイルされる。
しかし、型変換された新しいオブジェクトが代入されるが、コンパイラ
の最適化により元のInt型にされている。
これを裏付けるように、def iとdef s2iを逆にすると定義がないって
怒られる。明らかにimplicit conversionの影響を受けているはず
class Fuga extends Hoge {
val s: String = "1"
def i = s
implicit def s2i(s: String) = s.toInt
}
私は気が付いてしまいました。 Ruby の動的型付けは多くのエラーを引きおこすことに。 そして、安心してデプロイするためには 95% ものテストカバレッジを達成しなければいけないことに。 95% のテストカバレッジを得ることの代償として、私の書いたコードは(テストコードも含めて) Java で書いたものと同等のサイズにまでふくれあがってしまいました。 その上、Rails では動的なコードの変更が可能なため、開発・テスト・デプロイ中にトラブルが続出するようになりました。 高いテストカバレッジを確保しているにも関わらずです。 これらの問題にくわえて、MRI(Matz Ruby Implementation: まつもとゆきひろ氏による Rubyの実装)は速度が遅く、言語仕様も安定していません。 それなのに開発コミュニティはそのことに見向きもしません。 私は他の言語も見てみようと思うようになりました。 そんな時に Scala と出会いました。 Scala を使ってみて、これこそが私が求めていた言語だと思いました。
仕様書とか読んだことないなぁ。何ページくらいあるんだろ。
そして私が部下に教える言語もScala なぜなら私の部下も大切ないやなんでもない
大切な部下でScala。
ごめん自己解決した まだ検討中の段階で公表はしてないってことがちゃんと書いてた dbc2も策定中だから今はJavaと同じやり方でやっときます
javaのメソッドで可変長引数を扱うものがあって、 かつオーバーロードしてるメソッドをscalaから呼ぶことってできるの? なんか曖昧な参照でダメって怒られてしまう。
>>648 どういうので駄目だった?
そういう場合もありえるかもしれんが、たとえば以下のようなコードはOKだった
public class Overload {
public void foo(Object a, Object... args) {
System.out.println("foo1");
}
public void foo(String a) {
System.out.println("foo2");
}
}
650 :
649 :2010/10/02(土) 00:33:41
あ、呼び出し側のコード書いてなかったけど、こんな感じね scala> val x = new Overload x: Overload = Overload@15e6691 scala> x.foo("foo") foo2 scala> x.foo("foo", "bar") foo1
public void validate(final Object validatedObject)
↑ミス。すまん。 java側 public void foo(final Object obj) public void foo(final Object obj, final String... strs) scala側 foo(obj) ってやると「ambiguous reference to overloaded definition」と怒られるのだ。
654 :
デフォルトの名無しさん :2010/10/02(土) 11:35:37
2.8.1 RC2 age
ScalaはJavaの置き換えにはならないけど、 Java8までずれ込んだJavaラムダ式までの代替には有用だろうね。 Java7にクロージャが入らなくなった事で逆に市民権を得たかな。
>>655 別にクロージャ云々は別の言語でもできるし
どうでもよい。型推論やもっと他のことを
見なさい
見なさいって非ユーザからはそれくらいしか注目されて無いような・・・
Javaでクロージャ導入されたらScalaいらないよね。そうだよね。わかるわかる。 次の方どうぞレベル
非ユーザと言えばどんなトンチンカンな主張も許されるなんてわけがないだろう?
関数型と手続き型の違いなんてそんなもんだ
確かに言語としてのJavaがC#程度に強力ならScalaこんなに注目浴びてなかったろうな
>>661 F#がScalaに比べてそれほど注目を集めていないのもその辺に原因があるんだろうね
テキトーな印象としては、ScalaとJavaの力の差を10とすると、F#とC#の力の差は3くらいな感じ
パターンマッチングとかも便利なんだが、ファーストクラスの関数とかに比べて強力さを少し説明しづらい
んだよなあ。
F#が遅延評価だったりしたらそれはそれでびっくりだったんだが。
F#にtraitみたいなのある? あるならちょっと勉強しようかな
いまだにtraitをextendするのには違和感がある。 そこはincludeか何かだろう・・・
666 :
652 :2010/10/02(土) 22:18:03
scala-armについてググってたら、「あれってモナドじゃないよね」とか 「for内包記法の悪用なんじゃないの(英語)」的な声を散見したんだけど、 実際のところどうなの? 教えて識者の人!
>>667 モナドじゃないよねってのは、たぶんscala-armがモナド則を満たしてないって事かと
モナド則ってのは、Scalaっぽい表記で言うと
1. unit(x).flatMap(f) == f x
2. m.flatMap(unit) == m
3. m.flatMap(f).flatMap(g) == m.flatMap{x => f(x).flatMap(g))
の三つを満たしているいことを指すが(unitはモナドのインスタンスを構築する
ための1引数メソッドだと思ってくれ)、これのどれかあるいは全てをscala-armが満たしてない
とかそういう話ではないかと。確かめてないからほんとにそうかわからないけど
for内包記法の悪用じゃないの?ってのは、おそらくモナド則に従ってないものをfor内包
記法で書けるのは良くないってことなんじゃないかな。実際の批判読んで無いからこんな
ことくらいしか言えないけど。
>>669 モナド則みたさないとかありえないだろ
この糞ライブラリ作った奴だれよ?
scala-armは
http://github.com/jsuereth/scala-arm これのことだね。ソース見てみると、ManagedResource[+R]#flatMapのシグネチャが
def flatMap[B, To](f : R => B)(implicit translator : CanSafelyFlatMap[B,To]) : To
になってて、確かにモナド則満たしてないっぽい気がするなあ。ただ、そもそもドキュメント自体に
"It is monadic in nature, although not a monad, and provides several combinators to use with other managed resources."
と書いてあって、一応、モナドそのものじゃないよと明言してるので、その事自体を責めるべきではないと思う。後はこの事が
for式で使う上でどのような問題をはらんでいるかだけど、これは使ってみないとよくわからないなあ。
あ、ごめん。s/ドキュメント自体/ソースコード自体/
>>671 『「モナドっぽく」使えるモナドじゃない何かだけど、他のmanaged resourcesと連結する
便利機能があるんだよ』という訳であってるかな?
モナドは最近少し勉強をしてるけど、モナド則に従ってないモナドっぽいもの、
みたいのがなぜ「ダメ」なのか、みたいなのがまだよく分からない。
他のモナドと特定の組み合わせ方ができない、とかそういう感じなのか。
ちなみに、上の指摘をしてた方もARMライブラリを作ってるぽい。
こっちはきちんとモナドになってるのかな。
http://github.com/okomok/mada
ゼノブレイドスレかと思ったら違った
擬モナド
山本モナド
モナドグランプリ
∧_∧ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ( ´∀`)< モナドってなんか美味しそう ( ) \___________ | | | (__)_)
食べ物だとしたらまんじゅう系だな。
モナドセレクション
Scalaで異常系ってどう書くのが正しいんだろう? Box使って、既存ライブラリの例外をラップしつつ、Failureをチェーンしていけばいいのか、 と思ったんだけど、Failure[Int]を ?~! してFailure[String]で返す、みたいなことをやろうとすると (当たり前だけど)型が合わないって怒られるし、そもそもJVMがやってる例外を投げる処理を 自分で書いてるのも同然なので本末転倒感が。 例外のいいところって、例外を投げたコード位置と説明をパッケージできるところだと 思うんだけど、Option/Boxを使って似たようなことを(スマートに)できないのかな?
?? 「異常系処理を正常系処理と明確に分けて記述できるのがいいね」って誰かが 言い始めたから取り入れられたんですよね? 関数型で処理を実行している場合、正常系の一形態としてエラーを無視すると いうケースが有用な場合があるよという例が一人歩きして混乱を招いている感じがあるます
例外処理って >「異常系処理を正常系処理と明確に分けて記述できるのがいいね」って誰かが >言い始めたから取り入れられたんですよね?
>>682 その辺をもうちょい掘り下げて説明していただけるとありがたい。
685 :
デフォルトの名無しさん :2010/10/12(火) 06:56:42
IntとDoubleを割り算するのをジェネリックにしたいのですが、Fractionalを使うのは無理ですか? Doubleは当然OKです。 scala> implicitly[Fractional[Double]].div(3,2) res14: Double = 1.5 Intはぞのままじゃダメっぽいです。 scala> implicitly[Fractional[Int]].div(3,2) <console>:6: error: could not find implicit value for parameter e: Fractional[Int] 欲しいのは、切り捨てた結果です。 scala> 3/2 res15: Int = 1 自分でTruncate[T]みたいなのを定義するとしても、 どうするのが筋がいいのでしょうか?
686 :
685 :2010/10/12(火) 11:59:10
http://www.scala-lang.org/node/114 を参考に自分でつくってみましたが、無駄に長い・・・。
++++++++++++++++++++++++++++++
trait Truncate[A] {
def div(x: A, y: A): A
}
object Test extends Application {
implicit object DoubleDiv extends Truncate[Double] {
def div(x:Double,y:Double):Double = x/y
}
implicit object IntDiv extends Truncate[Int] {
def div(x:Int,y:Int):Int = x/y
}
def test[T](x:T,y:T)(implicit num:Truncate[T]) = num.div(x,y)
println(test[Int](3,2))
println(test[Double](3.0,2.0))
}
687 :
685 :2010/10/12(火) 12:00:25
あと、Fractional[Double]に対応するのはIntegral[Int]だと分かったのですが、 上の文脈でうまく使えない・・・orz
688 :
685 :2010/10/12(火) 12:02:38
これですが。 scala> implicitly[Integral[Int]].quot(3,2) res0: Int = 1
>>687 ,688
こんな感じでどう?
import scala.math._
import Numeric._
object Test extends Application {
implicit val DoubleIsIntegral = DoubleAsIfIntegral
def test[T:Integral](x: T, y: T) = implicitly[Integral[T]].quot(x, y)
println(test(3, 2))
println(test(3.0, 2.0))
}
690 :
685 :2010/10/12(火) 17:12:19
>>689 前回も助けていただいたのです。ありがとうございます。
DoubleAsIfIntegralとかうさんくさいですよね・・・。
多重定義できれば一番いいのですが、
def test[T:Integral](x:T,y:T) = implicitly[Integral[T]].quot(x,y)
def test[U:Fractional](x:U,y:U) = implicitly[Fractional[U]].div(x,y)
println(test(3, 2))
println(test(3.0, 2.0))
これが通らないのです・・・。
691 :
685 :2010/10/12(火) 17:21:29
>>690 ややトリッキーだけど、
import scala.math._
object Test extends Application {
sealed abstract class FractionalOrIntegral[T]
case class IsFractional[T](ev: Fractional[T]) extends FractionalOrIntegral[T]
case class IsIntegral[T](ev: Integral[T]) extends FractionalOrIntegral[T]
implicit val IntIsIntegral = IsIntegral[Int](implicitly[Integral[Int]])
implicit val DoubleIsFractioanl = IsFractional[Double](implicitly[Fractional[Double]])
def test[T:FractionalOrIntegral](x: T, y: T) = {
val ev = implicitly[FractionalOrIntegral[T]]
ev match {
case IsFractional(ev) => ev.div(x, y)
case IsIntegral(ev) => ev.quot(x, y)
}
}
println(test(3, 2))
println(test(3.0, 2.0))
}
という風にすれば一応できないことも無い。ただ、ここまでする手間に見合うかは疑問だが。
693 :
デフォルトの名無しさん :2010/10/13(水) 00:22:18
x match { x:Int => ...; x:Double => ... } とか、ダメダメなパターンマッチは思いついてましたけど、ここまでやるか・・・(笑) この「できそう」と「できた」のギャップの著しさはC++のそれと似てて、初心者に厳しいですね。
>>692 はFractionalOrIntegralのインスタンスにするために、いちいち個別に
implicit val IntIsIntegral = ...
とかしなければいけなかったのを改良してみた。これで、implicitなIntegral[A]や
Fractional[A]のインスタンスがあれば自動的に取り込めるようになった。
import scala.math._
object Test extends Application {
sealed abstract class FractionalOrIntegral[T]
case class IsFractional[T](ev: Fractional[T]) extends FractionalOrIntegral[T]
case class IsIntegral[T](ev: Integral[T]) extends FractionalOrIntegral[T]
implicit def AIsIntegral[A](implicit ev: Integral[A]) = IsIntegral[A](ev)
implicit def AIsFractional[A](implicit ev: Fractional[A]) = IsFractional[A](ev)
def test[T:FractionalOrIntegral](x: T, y: T) = {
val ev = implicitly[FractionalOrIntegral[T]]
ev match {
case IsFractional(ev) => ev.div(x, y)
case IsIntegral(ev) => ev.quot(x, y)
}
}
println(test(3, 2))
println(test(3.0, 2.0))
println(test(3.0f, 2.0f))
}
2.8.0-finalで、正規表現マッチを大量に並べたパターンマッチを作ったら コンパイラが固まったんだけど、この現象って既出?
>>695 tracに関係ありそうなキーワードで検索かけた限りでは引っかからなかった。
現象再現するコード提示してくれれば、代わりにバグ報告しても良いよー
698 :
697 :2010/10/13(水) 08:03:00
あと、実はもう一つあって、これを最初にスクリプトとして書いていて、Windows XP上で scala AkaraLogParser.scala < akara2010.log > akara2010_jp.log みたいに実行したら、実行完了後も、何かのjavaプロセスが_jp.logの方をロックし続けて、 二回目以降に「プロセスが占有して」云々というエラーが出て実行できなくなる 現象がありました(タスクマネージャから強制終了してやるとなおる)。 なんかこっちは既出そう。。
>>697 現象再現できました(Scala 2.8.0.final on jdk1.6.0_20 on Windows 7)。少なくとも、数分以内にはコンパイル
が終わらない事を確認しました。どっかで無限ループしてるのか、あるいは、なんかの理由で指数関数的に
計算量が爆発して、終わらないように見えてるのか…。現象を再現できる最小のコードにしぼる必要があるので、
多少時間かかりそうですが、報告しときます。
700 :
685 :2010/10/13(水) 15:49:55
>>694 実際の目的に合わせて修正してみました。
object Divisible {
case class IsFractional[T](ev: Fractional[T]) extends Divisible[T]
case class IsIntegral[T](ev: Integral[T]) extends Divisible[T]
implicit def XIsIntegral[X](implicit ev: Integral[X]) = IsIntegral[X](ev)
implicit def XIsFractional[X](implicit ev: Fractional[X]) = IsFractional[X](ev)
def impl[T](x:T,y:T)(implicit ev: Divisible[T]) = ev match {
case IsFractional(ev) => ev.div(x, y)
case IsIntegral(ev) => ev.quot(x, y)
}
}
trait Divisible[T] {
def div(x:T,y:T)(implicit ev:Divisible[T]) = Divisible.impl(x,y)(ev)
}
class Test[T](a:T)(implicit num:Numeric[T], ev:Divisible[T]) {
def get(b:T) = ev.div(a,b)
}
val t = new Test(2.0f)
println(t.get(3.0f))
なんかextends Divisibleがぐるぐる回ってる感じで、大丈夫かよ、と思いますが一応通ります。
もっと言うと、 RichNumeric = Numeric with Divisible
というmixinしたtraitが欲しい訳ですが、なかなか難しくて・・・。
701 :
685 :2010/10/13(水) 15:51:21
ていうか、みずしまさんなのですね。 『Scalaで型レベルプログラミング』の最後に 「本格的にScalaで型レベルプログラミング するのは現時点では時期尚早」 ってあるのに見事にはまってます・・・トホホ
702 :
デフォルトの名無しさん :2010/10/17(日) 04:09:46
2.8.1 RC3
RCの意味が解ってない。 きちんとバグはバグで修正しろ
ベータでいいだろ普通にこれ
705 :
デフォルトの名無しさん :2010/10/19(火) 20:42:58
ListからVectorに変換したいのに、toVectorというメソッドはありません。 要素ごとに自分で構築するしかないのでしょうか? たとえば下は通りませんが、コレクションのどれかを経由すれいいとか。 val v:Vector[Double] = List(3.2,1.2).toIndexedSeq
>>705 val v = Vector(List(3.2,1.2): _*)
構文が変態すぎて意味わからん Lisperなら普通に理解できたりすんの?
Lispの構文はむしろ単純だよ……ただ、S式はあまりに単純すぎるので 逆に読みづらいとも言われるだけ
>>707 >>706 のは、可変長引数を取るメソッドにコレクションを渡すために
:_*という専用の記法があるというだけの話だが、変態という程のことか?むしろ
簡単な話じゃないか
短く書けた方がいいと記号を使いだすと、ろくなことにならない ってのは歴史が証明しまくってるんだけどねぇ。
展開構文なんて他の言語にもあるだろう まさかScala特有だとは思ってないよな
Scala特有だろうとなかろうとそれはどうでも良くて C系の言語と比べて、構文もそうだし、概念にしても想像つかないやり方ばかりなんだ コード数行読むだけで行き詰まる 構文逆引き辞典つくれ おまえに毎日このスレに5個づつくらい貼る作業を与えてやる
:_* でぐぐって結果が出れば良かったのに。
714 :
デフォルトの名無しさん :2010/10/20(水) 04:23:49
レス遅くてすみません。706です。 自分はこの記法知ってましたが(思いつかなかったけど)、 「要素ごとに自分で構築する」のシンタックスシュガー って感じがします。 要素数が巨大な場合は不自然な感じがするので、きっと他のやり方があるに違いないと思っています。 他に思いついたらまたお願いします。
715 :
706 :2010/10/20(水) 04:29:23
今のところ、ひとつ思いついてるのは val vec = Vector.empty[Int]++List(1,2,3).toIndexedSeq です。
716 :
705 :2010/10/20(水) 04:31:04
間違えた。質問者(705)です。
717 :
705 :2010/10/20(水) 04:39:50
>>707 ,712
Lispじゃないけど関数型のノリで入ると習得はすごく楽だと思いますよ。
使いこなすには経験積んで細かいテクを叩き込まないと難しそうですが。
(自分はまだこの段階)
>>714 可変長引数は内部的にはコレクションにまとめて渡してるだけだし、
>>706 のソースはList.apply()の結果をそのままVector.apply()に渡すように
コンパイルされるので、そんなに気にする必要はないと思うが。
719 :
705 :2010/10/20(水) 11:08:51
構文が複雑すぎて、しばらく使わなかったらすぐに忘れそう
そういう時は、チートシートを見ればいいよ。 なので、誰かいい感じのチートシートを紹介しろ。
>722 : _* が載ってるのが一つもないじゃん。
724 :
705 :2010/10/21(木) 00:44:38
>>723 読んだとき分かりにくいというのには同意するし、確かに忘れます。
>>715 で出した代替案とかは公式のAPIを探索すれば原理的には探し出せるので、
そういう意味でいいんじゃないでしょうか?
汎用言語と思って使い始めると意外なモノがなくて苦労するよな。 少し前使ってたときはFTP関係とIME関係で詰まって放棄してしまった。 Javaのプリプロセッサだと割り切ればいい言語なんだが・・・
だれか、 本当に役にたつ チートシートを作ったら、ヒットするんじゃない? で、言語のお遊びみたいなのを卒業したら、 次は実践的なTIPS集だな。 Scala逆引き辞典 みたいなの。
FTP関係とIME関係が言語で用意されてたら逆に汎用言語ではなくて 目的が限定された言語のような期がするが
基本的なものが出揃うまで、まだ時間がかかりそうってこと?
>>725 >>727 それは利用者が少なくてライブラリが少ないという話では
>>728 基本的なものというのが用途によるんでしょ
Javaがサーバーサイドで使われているのなら、その用途に関しては揃っているんじゃないの
IMEは必要に迫られたことはないが文字コード変換用のフィルタはperlかPHP並の モンが登場して欲しいところだな
Windowsプログラミングがしたいなら、素直にC#使えばいいと思うんだ。
うわー閉鎖的だなー
ファーザー「.Net Frameworkがもてるからもてる」 『.NET Framework 1.0、1.1、2.0、3.0 または 3.5 用の更新プログラムをインストールしてください』 オンナスキー「…これは新手のDLLヘルってやつじゃないのか?」
734 :
デフォルトの名無しさん :2010/10/27(水) 08:16:17
2.8.1 RC4 age RC名乗っちゃいけない気がするんだ。 Bata名乗れ。
ばた?
2.8系をこれからさわり始めようと思うんだけど、IDE使わない場合の ビルドツールのおすすめってなにかな? sbtは2.8だと使えないみたいな話もあるけど・・・
『sbt?そんなビルドツールで大丈夫か?』 『David Pollakは言っている、Mavenを使えと!』
739 :
736 :2010/10/28(木) 00:04:49
>>737 Mavenはあの長大なpom.xmlを見るだけで敬遠しちゃうんだよなー
>>738 とすると使えない云々は昔の話なのか。
ところで、sbt使って開発したとして、完成したプログラムはどうやって実行するのが普通?
「sbt run」だとごちゃごちゃとメッセージが出力されてうっとうしいんだけど
代替手段がよく分からない。scalaコマンドも引数指定面倒だし。
0 to Int.MaxValue ってやると空のRangeが返って来るんだけどなんでなん?バグ?
ほんとだ、(0 to Int.MaxValue).lengthで-2147483648が返ってくる Range.scalaの74行目 >def length = fullLength.toInt でオーバーフローしてるっぽい(scala2.8.1RC4)
某所で紹介されてた「type -->[A,B] = PartialFunction[A,B]」で、 「val pf: String --> String = { case "": ... }」って書けるのは何で?
Type[A, B] は A Type B って書けるようになってる。
>>743 なるほど。ほんと何でもアリだな・・・。
>>739 sbtはデフォルトだと2.7.7がインストールされる
Scala2.8使うには、対話モードで 'set build.scala.versions 2.8.0' して
'reload' すると2.8がダウンロードされる。
build.propertiesも更新される。あとは '+compile' すれば完了
コンソール出力ごときでストレス感じるなら
いい感じにIDE対応するまで大人しくしてれば
IDEやだー ゴスリングに見捨てられても僕らは死ぬまでイッイイイッイーマックス 大丈夫だ、問題ない。
そんなemacsで大丈夫か?
一番いいmacsを頼む!
つYmacs
プログラムを可能な限りextractorで実装したら、珍妙なコードになって面白い。
IDEAの補完がもたつくの俺だけ? 補完の遅延とか同じ設定でJavaだとさくさく。なんでぞ
というか、Scalaコードをまともに編集できるIDEって存在するの? IntelliJ IDEAがそうなの?
>>753 現時点でScalaに一番ちゃんと対応してるのがIntelliJ IDEA
Java-Scala言語間横断した名前変更とかもちゃんと機能するのは素直に凄い
ただ、ある程度PCの性能を要求するので低スペックPCには向いて無い。
EclipseとNetBeansだったら、どっちがまとも? Scala 2.8で比較するとして。
vimかなぁ
Eclipseは普通に編集できるようにするだけで苦労するレベルだった Emacsかなぁ
Eclipseで普通に編集するだけでも、IDEと格闘するレベルの努力が必要だったのは、 Scala 2.7系時代の話。 2.8系になってからは、……知らん。
Emacsはそれ自体使い始めるまでが苦労するからなぁ 面倒くさくないのならIDEAかなぁ
今まで使い慣れているという理由以外でEmacsを選ぶ理由はあんまりないと思う。
口車に乗せられてIntelliJ IDEA入れてみてみたが、地味すぎて死にたくなる。
地味っつーかなんか使いづらいんだよな
Emacsはヌーの絵が嫌い
あれがアルパカだったら・・・いや、なんでもない
IntelliJだが、補完とかはまあまあ安定している気がするが、 何かの拍子に一度駄目になる(空白の補完ポップアップが出るようになる)と 再起不能っぽい。 あと、上にも同じ事書いてる人が居るが、かなり遅い。
TwitterだかGoogleだかが使ってるとかいうから試したけど 3日頑張ってEclipseに戻した
64bit IDE+JVM だと、ClientVMないから余計厳しいかも
今日の構文 (1 to 10).foldLeft(1) { _ * _ } この肛門みたいな構文の意味だれか教えろ foldLeft関数から教えろ
答えちゃうねん 仕組みやねん
foldというのは折り畳むという意味だな 最初に、引数の要素(単位元になることが多い)と、 レシーバーの一つ目の要素を使って計算して結果を出す 次はその結果とレシーバーの二つ目の要素を使って計算する これを最後まで繰り返す foldLeftというのは左から処理していくということだ foldRightというのもあるが末尾再帰でないから、 できればfoldLeftを使ったほうがいい 関数型言語の基本的な関数の一つだな
>>770 「肛門みたいな」が問題なら、
(1 to 10).foldLeft(1) {(ret, i) => ret * i }
の略記法が、
(1 to 10).foldLeft(1) { _ * _ }
ってわけ。
親切にありがたいけど、 まだわかんない def fact(n: Int): Int = { return (1 to n).foldLeft(1) {_*_} } fact(0)としたとき、この式でなんでちゃんと1が返るのか読み取れない 最初にfoldLeft(1)の1とnの0を掛けて0になっちゃわない?
絵で描いてみろ
いや、それは単に空のレシーバーに対しては引数の値がそのまま返るというだけ 関数型言語はライブラリのコードが簡単だから、 ソースコードを直接見て覚えたほうがいいんだけど、 Scalaはその点でコレクションのコードを見てもさっぱりわけわかめだから、 関数型の動作をScalaで覚えるのはあまりおすすめしない
>>773 foldLeftの定義を書き下してみると、こんな感じになる
def foldLeft[A, B](list: List[A], init: B)(f: (B, A) => B): B = list match {
case x::xs => foldLeft(xs, f(init, x))(f)
case Nil => init
}
次のようにListが空の場合、
foldLeft(List[Int](), 1)(_ * _)
定義から明らかにinitをそのまま返すので、結果が1になる。foldLeftは
init (list.size == 0の場合)
f(init, x(0)) (list.size == 1の場合)
f(f(init, x(0)), x(1)) (list.size == 2の場合)
f(f(f(init, x(0)), x(1)), f(2)) (list.size == 3の場合)
...
となる値を返すような関数なので、リストが空の場合initがそのまま返される、という言い方もできる。
>最初にfoldLeft(1)の1とnの0を掛けて0になっちゃわない? このレス見ると1 to 0がRange(0)みたいなのを返してると勘違いしてるんじゃないか?
>775 ソース見るなら、2.8より前のだな。
2.8のコレクションライブラリは、コードの重複排除と拡張性を手に入れた代わりに 実装がやけに読みづらくなってるからなあ。ユーザ側としては間違いなく使い易くなってると 思うんだけど、いざ実装追いたくなったときにめんどいよね
2.8.1.final
781 :
デフォルトの名無しさん :2010/11/10(水) 08:54:09
2.8.1 キタ━━━━(゚∀゚)━━━━ !!!!! akka 1.0もすぐ?
関数型の記述ができるようになるためにはどうやって勉強したらいいかな? 関数型で書かれたアルゴリズム本とか誰か知らない?
>>783 ありがとうございます。
まずHaskellから勉強する必要がありそうですね。
Haskellはちと方向が違う
『関数プログラミングの楽しみ』ってHaskellの本だよね?
やっと hellolift できたお! 最初Mavenでアーキタイプ指定してプロジェクトをダウンロードして、そのあと SBT で sbt update sbt jetty-run ってやったんだけど、これ全部SBTでできないの? 前にSBTだけで構築しようとして試行錯誤したときは sbt jetty-run で jetty がねーよってエラーでてダメだったんだよね
既存のアルゴリズム本を関数型言語で書き直したみたいな物があれば一番いいんだけど、そんなのないよね?
洋書ならあったような
Javaではメンバー変数はデフォルトprivateで、それが「良い仕様」って事になってたと 思うんだけど、デフォpublicなScalaはなんか思想か解釈が変わったの? どう気持ちを切り替えたもの?
privateだったっけ?
>>790 Java の場合、フィールドを public にしたら、後で、値の取得・設定時に何らかの処理を挟みたくなっても呼び出し側の
コードを getter/setter 呼び出しに変更してもらう以外に行う術がない。
だから、フィールドに直接アクセスさせずにあらかじめ getter/setter 経由にしておく。
一方、Scala の場合、呼び出し側のコードを変更することなしに、フィールドをプロパティに変更するだけで可能になる。
だから、Scala の場合はデフォルト public で問題ない。
と解釈している。
>>791 Java の場合、デフォルト(公開識別子省略時)はパッケージ private だね。
ただ、
>>790 の言う「メンバー変数はデフォルトprivate」の部分は、「フィールドを書くときには private を明示的に付けて
宣言するのが良い仕様のデフォルト(標準)」と言っているんだと思う。
>>790 Scalaで外部に公開される変数(private[this]以外)を宣言すると、
private[this]なフィールドとアクセサメソッドが自動で生成される。
class Hoge {
var piyo: Int = _
}
↓
class Hoge {
private[this] var piyopiyo: Int = _
def piyo: Int = piyopiyo
def piyo_=(i: Int) { piyopiyo = i }
}
こんな感じのはず。valがどうなるかは知らない。
ついでに聞くけど、C#の public int piyo { get; private set; } も真似出来る? 自動実装のプロパティで、且つセット出来るのは内側からだけって奴。
一つ上のレスも見れんのか
Voldemort遅いから使う意味無
798 :
デフォルトの名無しさん :2010/11/15(月) 23:22:47
Cygwin使っている人いますか? その20
http://hibari.2ch.net/test/read.cgi/unix/1268282846/272-273 272 名無しさん@お腹いっぱい。 [sage] 2010/11/15(月) 11:42:30 ID: Be:
マウントオプションとは別に、CRLFをLFに変換するツールはないでしょうか?
美乳セーラー女子高生とSEX顔射フィニッシュ
というコマンドやnkfでも一応可能なのですが
専用のツールはなかったかと思いまして
273 名無しさん@お腹いっぱい。 [sage] 2010/11/15(月) 11:43:21 ID: Be:
>>272 コピペミスった、、、、、
見なかったことにしてください
コマンドは、
cat crlf.txt | tr -d '\r' > lf.txt
です。
>>798 たいして面白くもない創作文章をあちこちのスレにマルチ投稿するなよ。
ところで、Cygwinって今時使っている人居るのかなあ。。
>>799 使ってるよ
ただし今はもはや実質 ssh クライアントとしてしか使ってないけど
Cygwin なかったら Windows でどうやって ssh すればいいのかわからんw
git と zsh で grep **/* のためにつこうとる Tortoiseのようなエクスプローラ拡張系は再起動求められるからいややねん
最近、sbt流行っとるの?
806 :
デフォルトの名無しさん :2010/11/19(金) 02:05:02
ちょっとド忘れしたんだけれども、(RegexParserとかJavaTokenParserで)パースしながら、 その場で名前付きオブジェクトをつくっていく方法ってありましたっけ? import scala.util.parsing.combinator.JavaTokenParsers def dir:Map[String,Any] = "dat/" ~> decimalNumber ^^ ("x",_.toInt) <~ "/" ~> decimalNumber ^^ ("y",_.toInt) イメージとしてはこんな感じだけど、 Mapじゃなくて dir.x dir.y みたいなアクセスができるとなおよい。 質問が乱暴で申し訳ないが、ピンときたら教えてくださいませ。
807 :
806 :2010/11/19(金) 20:47:56
>>806 ですが、わざわざオブジェクトをつくるほどでもなさそうなので、
タプルにすればいいかと思うのですが、今度は別のとこでひっかかりました・・・
数字+拡張子の分解をしたい場合、ピリオドが小数点と解釈されてしまいます。
下のようにguardをはさめばよさそうなのに、結果は変わりません。
(実行時エラーになります)
使い方が間違ってるのだと思いますが、どうしたらいいのでしょうか?
object Fname extends scala.util.parsing.combinator.JavaTokenParsers {
val nat:Parser[Int] = decimalNumber ^^ (_.toInt)
val name:Parser[(Int,Int)] = nat <~ guard(".html") ^^ { case x => (x,x)}
def apply(str:String):(Int,Int) = parseAll(name,str).get
}
println(Fname("1.html"))
decimalNumberの代わりにwholeNumber使うとおk。 あとドキュメント読むと分かるけど、guardは入力を消費しない(it will not consume any input)ので、 guard(".html")にマッチした時点で".html"という入力がまだ余っている。 んでparseAllは入力の最後まできっちりパースしようとするから、".html"が余ってんぞコラってエラー出す。 parseAllをparseに置き換えたら通る。 別にguard使わんでも".html"にマッチさせて<~で読み捨てればいいと思うけど
809 :
806 :2010/11/19(金) 22:08:31
おぉ、通った。ありがとうございます! IDE使ってない(てかそもそもいいのはない?)ので、実行時エラーでは手も足も出ないなぁ。 思いがけないところで勉強になりました。
スタックトレース嫁!! あと、パースして返ってきたParseResultを見るとパースに失敗した理由とどこでミスったかが分かるよ。 parseAll(name, str) match { case Success(result, input) => println(input.pos.longString) case Failure(reason, input) => println(reason); println(input.pos.longString) case Error(reason, input) => println(reason); println(input.pos.longString) } 失敗しているParseResultにgetを使うとただRuntimeExceptionぶん投げられるだけなので こっちの方がいいと思う。結果だけ必要な場合は case Success(v, _) => v case other => println(other) こんな感じで。
あ、
>>808 のparseAllはパースに失敗するだけで、
get呼んだところではじめて例外が投げられるんでしたごめん
>>812 NetBeansはどのへんがだめでしたか?
ところでお前らScalaで学ぶ関数脳入門どうだったよ?
あー、そうか、もう発売されたか。買おうかな。
へーそんな本が
なんとか脳ってネーミングセンス自体が、00年代脳って感じでついて行けません。
だれかさっさとLift本の翻訳してください
amazon >Scalaで学ぶ関数脳入門 >この本は現在お取り扱いできません。 なんで?
ん?Amazonで普通に買えるが。 ------------- オブジェクト指向プログラマが次に読む本 -Scalaで学ぶ関数脳入門 [単行本(ソフトカバー)] 株式会社テクノロジックアート (著), 長瀬 嘉秀 (監修), 町田 修一 (監修) 価格: ¥ 3,339 通常配送無料 詳細 ------------- ちなみに、、、 半年ほどボチボチScalaを学んできたが、いまいち、取得できない。 関数型言語習得して、何が良いのだろう。メリットは...? C++,Java,Rubyに比べると、Scalaは格段に難しく感じる。 Scalaを取得するメリットが分からなくなってきた。。 スランプかなあ。 上述の本買ってみるか。内容不明だけど。
連投でスマヌが、、 Scalaで、普通に int型の変数を宣言することって出来なかったっけ? C言語で言うところの int i; みたいなの。 scala> var i:Int = 0 と初期値を指定すれば良いのだが、 scala> var j:Int とか scala> var k = new Int はエラーなんだよなあ。
関数型がわからない人が保守できなくなるリスクを負ってまで関数型で書くメリットはあるんだろうか?
手当たりしだい一時変数使いまくって、どこからリファクタリングの手をつけたらいいかわからないような劣悪なコードを書く人に人生をあきらめさせるメリットがある
>>825 関数型で書けば劣悪なコードが減るってこと?駄目なやつは関数型だろうがなんだろうが結局劣悪なコード書きそうな気がするんだが。
>>823 > var x: Int = _
おおー!
ありがとうございました。 (_<_)
しかし、Scalaは、記号が分からん。どこかに一覧表はないものか。。。
>>825 なるほど。
大昔のC言語みたいに「関数の先頭以外では、変数宣言できない」ってことはないから、
「変数は使うときに宣言せよ」→「使うときには初期値分かっているから、宣言と同時に代入しろ」、ってことか?
>>821 var i = 0
でも可。型推論で i はInt型になる
Javaできるならコップ本が分かりやすいと思うなー
>>828 > var i = 0
> でも可。型推論で i はInt型になる
↑
初期値なしで変数宣言したかったので。。
次のように、クラスのメンバ変数を宣言するときに、
C++とかだったら初期値(初期化)なしで、とりあえず変数宣言することが多いが、
おなじようにScalaでも書きたかったので。
---------
class Test1 {
var m:Int= _ ; //<< ここ
def setM(s:String) = { m=s.toInt}
def view = {println( m ); }
}
---------
sbtって2.7.7までしか対応してないよね? それより新しいバージョン指定しても、2.7.7使うんで(キリッ とか言われる気がする 64bit Windowsなんだけど、IntelliJ IDEAでfsc使おうとするとコンパイルが終わらない コンパイルのプロセスをタスクマネージャから強制終了すると実行結果が返ってくるからサーバーの連携に失敗してる? 海外のフォーラム見て回ってるんですが、似たような症状の人いませんか
>>829 Scalaでは、初期化無し(デフォルト値で)でvarを宣言するのはあまりいいスタイルでは無い気がする
コンストラクタ中で必ず初期値が代入されるようにするのが定石というか…
>>830 sbtはScalaのバージョン指定で2.8.0とか入れれば、ビルド対象のプロジェクトは2.8使うようになるよ
デフォルトで2.7を勝手にダウンロードするのはたぶんsbtのブートに使ってるのであって、プロジェクトの
設定とは別物。
IDEA+fscの方は同じ状況になったことが無いのでよくわからない
sbt-0.7.5.RC0ではプロジェクト作成時にデフォルトで2.8.1使うようになってる
オブジェクト指向プログラマが次に読む本 -Scalaで学ぶ関数脳入門 ってどうなの? 株式会社テクノロジックアートってやばい感じするんだけど?
>>829 var x: Int = _
これは初期値なしって意味じゃないよ
デフォルト値(Intなら0、参照型ならnull)で初期化する
>>829 その例だったらOption使うのがいいのでは
class Test1 {
var m: Option[Int] = None
def setM(s:String) { m = Some(s.toInt) }
def view { m foreach println }
}
別に初期値あってもよくね
Javaの確実な代入みたいな機能があれば、 わざと初期化しないでおいて 分岐のどれかで初期化漏れない事を コンパイラにチェックさせる手もあるが。
>830 > 64bit Windowsなんだけど、IntelliJ IDEAでfsc使おうとするとコンパイルが終わらない たしかに、そういう時はある。 外部で別途fscを立ち上げて置いてから、 Compiler > Scala Compiler の "Use fsc"にチェックを入れて使うのが確実な気がする。 Process Explorerで監視推奨。 つーか、sbt用意したのなら、IDEAでコンパイルする必要があんまり無いような。 あと、俺は使ってないけど、IDEA用のsbtプラグインが有るので、使ってみれば?
久し振りにPredefみたら、知らん関数がいくつかあった。 あと、"hoge = %d".format(hoge) とか、いつからあったんだ?
>>840 記憶してる限り、2.7前後で入った関数だったはずなので、結構前からあると思うよ
sbtの依存ライブラリを書くところ、指定のjarを除外したい時にはDSLで書けない みたい? 除外指定の部分だけ、 override def ivyXML = ... でXMLを書いたら、一応目的は達せられたけど、ちょっと不格好になった。
implicitパラメータでevって言うパラメータ名なのをよく見るんだけどevってなんの略?
Scalaで学ぶ関数脳入門かった 読みやすくてわかりやすい
俺も俺も
そんなに評判は悪くなさそうなので買ってきてみる。気が向いたらレビューするかも。
表紙絵とタイトルが最悪。 中身は、意外に広い範囲を扱ってた。
852 :
デフォルトの名無しさん :2010/11/28(日) 00:12:02
>>850 > 表紙絵とタイトルが最悪。
> 中身は、意外に広い範囲を扱ってた。
「ボクらのScala 次世代Java」もそんな感じ。
タイトルと本の中身が一致していない。
中身は非常に良いのに、タイトルで避けられていたら残念。
あと、プログラミングのための線形代数 とかいう本も、
中身とぜんぜんミスマッチした表紙絵だったなあ。
ああいうのって、作者の意向と関係なしに、出版社側が勝手にタイトルとか表紙絵
をつけるみたいだけど、企画した人は批評の数の分だけ減給にするべきだな。
関数型をアピールすると売れるのかね とてもそうは思えないけどw
冒頭にOdersky先生のコメントが入ってるけど、先生にはタイトルを "Getting into Functional Programming World in Scala"って伝えてるらしい。
Haskellの本で純粋関数型言語に入門してちびった俺からすると、 Scala「で」関数型に入門という趣旨はありだと思うけどね。 タイトル見て多少ミスリードはあるが、Scala=関数型言語という売り方ではないし いや中身は読んでないけどw マルチパラダイム言語ってのはわかってて付けてるでしょう。
856 :
855 :2010/11/28(日) 03:27:34
> 内容紹介
> 本書はオブジェクト指向では飽き足らなくなったエンジニアに、話題の関数型言語であるScalaを使って、
> 今エンジニアに求められる必須プログラミングコンセプトを解説します。
> 関数型言語の基本が身につくほか、コレクションや再帰、並行プログラミング、DSLなどの勘所を、
> 実際のコードを見ながら理解することができます。
http://www.amazon.co.jp/dp/4774144363/ 「関数型言語であるScala」
「関数型言語であるScala」
「関数型言語であるScala」
「関数型言語であるScala」
「関数型言語であるScala」
早速、撤回するわ orz
Lispだって関数型言語と普通に言われてるんだから、ありだろ
Lispは手続き型言語だろ
Lispを関数型言語うんぬん指摘するネタ飽きた
関数型言語でもある=>関数型言語である という事じゃないか。 @itあたりに連載あるから、本みなくてもどういう感じか分かるはず。
>>860 それくらい行間よめよってことだろうが、ちょっとまってほしい
まがりなりにも関数型言語をかたるなら命題くらいは丁寧に扱って欲しいものではないだろうか
かたるを漢字にしていないところがポイントかw
試してみたけどJREがいらなくなるだけで特にメリットはないな。 体感速度も変わらず。AOTコンパイラなんて無駄なもの作っちゃってる会社はかわいそうだわ。 努力が何のプラスにもなってない
定性的には、 起動時 AOT>int>JIT 起動後 JIT>AOT>>int なんだろうけど、HotSpot Client VMが、他のAOTより起動が速いという…
関数脳本、100ページくらい読んでみたけど、「関数型を学びながらScalaに入門したい」 という向きにはかなり良書の匂いがする。文章がしっかりしてるし説明が非常に丁寧。 単なるBetter JavaとしてScalaに興味がある人向けではないけど、入門書のバリエーションが 増えたという意味では良さそげ。
すみません。JavaTokenParsersについて教えてください。 デフォルトでは空白はスキップされると思っているのですが、スキップされない場合があって 悩んでいます。 import scala.util.parsing.combinator._ class PL extends JavaTokenParsers { def term : Parser[String] = ident ^^ { case s => s } | '(' ~ term ~ ')' ^^ { case s1~s2~s3 => s2 } } object Main extends PL { def main(args:Array[String]) { val f1 = "(( x))" val f2 = "((x ))" println(f1) println(parseAll(term, f1)) println(f2) println(parseAll(term, f2)) } } 上の実行結果 $ scala Main (( x)) [1.7] parsed: x ((x )) [1.4] failure: `)' expected but found ((x )) ^ この挙動はどう理解すればよいのでしょうか?
すみません。 空白を変換し忘れました。 上の最後のパースエラー箇所指摘記号(^)はxの直後の空白をさしています。
>>867 '('と')'の部分を"("と")"(ダブルクォート)に置き換えてみて。次のような感じで。
import scala.util.parsing.combinator._
class PL extends JavaTokenParsers {
def term : Parser[String] =
ident ^^ { case s => s } | "(" ~ term ~ ")" ^^ { case s1~s2~s3 => s2 }
}
object Main extends PL {
def main(args:Array[String]) {
val f1 = "(( x))"
val f2 = "((x ))"
println(f1)
println(parseAll(term, f1))
println(f2)
println(parseAll(term, f2))
}
}
何故これでうまく行くのかというと、JavaTokenParsersのスーパーtraitであるRegexParsersでは、
String→Parser[String]とRegex→Parser[String]の二つの暗黙型変換が定義されていて、そこで
空白をうまくスキップするような処理を入れてるため。一方、Char→Parser[Char]に相当する暗黙
型変換はもっと階層の上の方(Parsers)で定義されていて、こっちは空白をスキップする処理が入ってない
>>867 のソースでは、文字リテラル(Char型)を書いてしまったため、空白がスキップされない
Parser[Char]が生成されてしまったんだな。
870 :
866 :2010/12/03(金) 00:29:22
「関数脳」本読了。 関数型プログラミングの作法について一通り学べる感じなので、なかなか良いのではないでしょうか。
>>869 うまくいきました。
ありがとうございます。
なるほど、式全体がParser[String]型でも部分式にはParser[Char]型が推論されうるんですね。
暗黙型変換は便利だけど、つまづいたときに原因究明がやっかいですね。
>>869 新種の顔文字かと思た → '('と')'
>>871 ところで、指摘し忘れていたけど、ident ^^ { case s => s }は同じもの返してるだけだから無駄なので単にident
でいいし、"(" ~ term ~ ")" ^^ { case s1~s2~s3 => s2 }は、"("と")"の部分の値を利用しないので、
"(" ~> term <~ ")" とするのが良いと思うよ。まとめると、
def term : Parser[String] = ident | "(" ~> term <~ ")"
>>873 ありがとうございます。
便利なコンビネータですね。
scalaはちょっと便利な小技が満載で楽しいです。
emacsのscala-modeで使っている人いる? scalaインタプリタを生で使っていると補完(tab)やヒストリ(C-p)がきくのに emacsからだとどちらも無効になる。 なんとかならない?
>>875 補完は無理っぽいね
ENSIMEのソースにも「TODO Fix completion...」って書いてあるし
ヒストリは M-p と M-n で動くのでは?
ensime で補完つかって編集したものを ensime-inf-eval-region すれば問題ない。
>>878 コップ本と入門本はカッコいいじゃん
外国の表紙はいかにも教科書っぽくて
しかし日本の本、出過ぎだな
明らかに供給過多
それでいてLiftの本は出ないと
>>876 ありがとう。
ヒストリは確かに動きました。
しかしロードは遅いしエラー時の行番号もでないしメモリリークはあるしで
結局scalaインタプリタはコンパイラのおまけと思った方がいいね。
scala> val it = Iterator("a", "number", "of", "words") it: Iterator[java.lang.String] = non-empty iterator scala> it dropWhile (_.length < 2) res0: Iterator[java.lang.String] = non-empty iterator scala> it.next() res1: java.lang.String = number replだとnumberだけど object App extends Application { val it = Iterator("a", "number", "of", "words") val it2 = it dropWhile (_.length < 2) println(it.next()) } このソースをコンパイル実行するとaが出力されるんだけど何故?
わかった、こうするとnumberになるわ object App extends Application { val it = Iterator("a", "number", "of", "words") val it2 = it dropWhile (_.length < 2) println(it2) println(it.next()) } toStringに副作用があるのか、これはちょっとキモいなw
> val it = Iterator("a", "number", "of", "words") > val it2 = it dropWhile (_.length < 2) > println(it.next()) どういうこと? it dropWhile (_.length < 2) の評価によってitの参照しているIteratorオブジェクトは変化すると思ってたのだけど違う? なぜaが出力されるかわからない。
884 :
881 :2010/12/05(日) 20:49:20
885 :
881 :2010/12/05(日) 21:06:18
調べてたらイテレータでメソッド呼び出して新しいイテレータ作って 呼び出し元のイテレータがどこまで進んだはず、とかでコード書くと落とし穴にハマるかもわからんということがわかった scala> val lit = List(1,2,3,4,5).iterator lit: Iterator[Int] = non-empty iterator scala> val ldit = lit.drop(3) ldit: Iterator[Int] = non-empty iterator scala> ldit.next() res0: Int = 4 scala> lit.next() res1: Int = 5 scala> val ait = Array(1,2,3,4,5).iterator ait: Iterator[Int] = non-empty iterator scala> val adit = ait.drop(3) adit: Iterator[Int] = non-empty iterator scala> adit.next() res2: Int = 4 scala> ait.next() res3: Int = 1
>>884 ありがとう。よくわかった。
やっぱりライブラリはソースを見て使わないと駄目だね。
>>878 > 日本の本の表紙が異質すぎる。
> 特に関数脳入門はなんとかしろ。
関数脳入門は、本の内容は良いのに、表紙イラストで評価さげているな。
あのイラストは、本文では全く使われていなくて、表紙だけに使われているんだけど、
あれにいくらのお金が入っているんだろう?
オレが、この本の売り上げを分配するとすれば、
・執筆者 : 8割 (内容はすばらしい)
・校正者 : 3割 (誤植少なそうだ。)
・編集者 : 4割 (企画としてはまあまあ良い。)
・タイトル考えた人: なし。 ( もっと頭ひねろ)
・表紙イラストレータ: - 50%(イラスト使ってやったんだから金払え)
だね。
>>879 > コップ本と入門本はカッコいいじゃん
コップ本のあの表紙は、日本語版のオリジナルなんだね。
アレは、なかなかセンスが良いし、カッコイイよね。
コップ本というように愛称で呼ばれるにはそれだけの理由がある。
>それでいてLiftの本は出ないと
Lift本みたいなは、電子書籍で出て欲しいね。
ササっと出版されて、ササっと読まれるような旬の話題を扱った本は、電子書籍が良い。
x もっと頭ひねろ o もっと頭ひねれ
amazonで関数脳本の中古の方が高いのはなんでなんだぜ?
ボッタ栗狙いの転売ヤーが出品中だから
Lift本は、2冊目が出るんだな。2.1対応か。
>>891 > amazonで関数脳本の中古の方が高いのはなんでなんだぜ?
Amazonでマーケットプレース出品者による、定番の売り方だよ。
一時的に売り切れになる/なった本は、高い値段にして中古本を出品する。
それを見て勘違いして
「これは中古でプレミアムが付いた値段でしか買えないんだ→すぐ買おう」
と言う感じで買っちゃう人が、たまにいるから。
そういうわけで、新品を中古として出品することもある。
package文があるとインタプリタでエラーになるのは仕様?
896 :
デフォルトの名無しさん :2010/12/13(月) 04:58:02
.NETでScalaが動けばそれが最強 とおもったが アクターなんぞ使わんでも並列は十分充実してるわな
2.9に入るというSTMと並列コレクションが楽しみ
再代入出来ない利点活かして 効率的に、簡単に、する仕組みは大歓迎
>>897 上のURLで掲示してるTask Parallel Libraryなら標準ライブラリ入りしてるので
メンテ大丈夫かといったら大丈夫に決まってるわけで……。
RoboticsのConcurrency and CoordinationやMS Researchのプロジェクトなど
.NETにも野心的で面白いものはいっぱいある。
http://www.indeed.com/jobtrends?q=groovy,scala,clojure,sml,haskell 2010年もScala求人のシェアは上昇しました。
ずっと足踏みを続ける関数型言語を追い越しました。
Groovyとは2年差を保っています。
http://www.indeed.com/jobtrends?q=groovy,scala,clojure,python,ruby 安定成長が続くなら、PythonとRubyの後を追うことになります。
http://www.indeed.com/jobtrends?q=groovy,scala,clojure,Python,Ruby,Java Javaははるか上です。
将来のScala普及率はどうなると思いますか?
1 いずれ他の関数型言語のように壁にぶつかる
2 PythonやRubyのように安定成長を続ける
3 次世代Javaとして爆発的に普及する
Prologのように細々と生息
え、Prologって生息してんの? とりあえず今Javaがピンチなんで、Scalaの未来はそれに影響されるかと
Javaがピンチってw
ORACLEに飼い殺しにされるよ
907 :
881 :2010/12/15(水) 12:29:13
909 :
デフォルトの名無しさん :2010/12/15(水) 18:27:47
インフラ周りでJava使っていた層がScalaにじわじわ移住しているっぽい。 あと、ApacheのJCP脱退で、Apache関連のJavaベースのソフトどうなるかだね。 まあ、C++的なポジションになるのかね。
言語と処理系の完成度をもう少し高めて欲しいな。 関数型言語を謳っているが型推論が弱いから、面倒で仕方ない。 せめて多相型推論を導入してくれ〜。 無名関数の引数にいちいち型注釈をつけさせないで欲しい。
ScalaでネックとなってるのはIDEと日本語の情報くらいだろ Javaで培った知識と技術はそのまま活かせるんだから伸びないわけがない 採用実績もあるんだしな
2週間ほど仕事でeclipse+Scala IDE使ってみたけど そんなに悪いもんでもなかったよ 流行るかどうかはあやしいいよね 職場の反応見てると Javaで事足りる層にとっては面倒な物にしか見えないらしいし 結局Scalaで書いてjadしたJavaコード見せると安心する人多いww
流行ることはないだろうな 流行る必要もないし いまだにJava1.4使ってるSIerがScala採用とかありえんw
JVMで動いてる限りJava並みに普及することはないよな Javaとともに没落することはあるが
915 :
デフォルトの名無しさん :2010/12/16(木) 00:11:22
Scalaって、従来のJavaがなかなか踏み込めなかった領域にも
入ってくるんじゃないだろうか?
例えば、デスクトップアプリを作るのにも、結構使えるんじゃないだろうか。
あと、Androidとか、Processingとか、普通のアプリ製作に使えそう。
まあ、JVMとSwingが、最近のPCでようやくストレスなく動くようになったのが大きいけど。
次は、Scalalabという、Matlabとかと同じ用途の数値計算ソフトだけど、
こんなのまで開発されているんだな。
http://code.google.com/p/scalalab/ Web上には、スクリーンショットは見当たらないけど、
実際に起動してみると、なかなかおおがかりなアプリだと思う。
>>914 jadで吐いたコード眺めてて
言語としてはあれだけど
Javaから使える便利なライブラリとしてならアリだと思った
>>912-915 実際にScalaでしかできないことって何かある?
>>912 じゃないけど初学者として
>Javaで事足りる層にとっては面倒な物にしか見えないらしい
というのが気になってる。
Rubyスレみたいに、Rubyを選ぶ利点はRubyで書けることだ、なんていわれたら
新進気鋭の会社がエンジニアを釣るのには良さそうな言語なんだなと思ってしまうよ。
逆に言うとまさに「Javaで事足りる層に」は無用なんじゃないかと
担保のなけりゃ言語を覚える気もないのかお前は!というのとそういうわけではなく雑談と思ってくれればいいけど。
しばらくRubyやC#触ったあとにJavaに戻ってくると、なんだか古代の言語を触ってるような 印象を受けて萎える。 そんな時に「Scalaがあるよ!」と言えば、受け入れやすいと思う。
そりゃ事足りるやつには無用なんじゃね、なんでもな スクリプト言語ブームだって、本当はJavaで事足りてるやつには無用だっただろうな
>>917 JavaプログラムにできなくてScalaプログラムにできる事は何か、
という意味ならそんなものはないに決まっています。
JavaやScalaも含めて多くのプログラミング言語はチューリング完全であり、
計算能力(計算速度ではなく何を計算できるか)は全く同じです。
JVM系言語は同じJVMの上で動かすのだから何を操作できるかは全く同じです。
広く使われるプログラミング言語が交代するのは、
ソフトウェア作成に必要な労力がプログラミング言語によって違うからです。
Scalaの意義はJavaより簡潔に何をしたいか記述できる事、ただそれだけです。
>>920 > 広く使われるプログラミング言語が交代するのは、
> ソフトウェア作成に必要な労力がプログラミング言語によって違うからです。
かつてそんなことがあったか?
言語が交代するのは企業が無理矢理流行らせるときか、キラーアプリが出るときでしょ Scalaもどこかデカいところが採用するのを待つしかないね
>>921 アセンブリ言語で全て記述できるのに
高級言語、構造化プログラミング言語、オブジェクト指向言語が
使われるようになったのはソフトウェア作成の労力削減のためです。
ScalaやRubyを実務に取り入れたいけど、 結局、新しい事やより良いものを学んで 成長しようという意思のない人たちに 何を言っても無駄なんだな、という 諦観が芽生えてきたよ。 やるせないけどね。
JVM上でRailsを動かすためにJRubyを使うのは理解できるし実際にメリットもあるらしいけど、
RailsでないJavaアプリケーション開発でRuby使いがJRubyを使おうと言い出したら冷たい目で
見てしまいそう。
Scalaは設計段階からJavaとの親和性を考慮してあるとはいえ、知らない人から見たらJRubyと
同じことで、
>>912 のような反応が当然だろうな。
実務で使おうと思ったら、Railsに相当するそれ自体が目的となるようなものが無いと。
まぁ少なくとも、成長しようという意思(笑)だけでは実務に取り入れることはできないな。
Scala はもっと開発環境周りでJavaベースなところをアピールできないと流行らないんじゃないかね。 今のところコンパイル言語とスクリプトの悪いとこどり言語みたいになってる。
>>910 ML系言語が採用している型システムであるHindley-Milnerと違って
残念ながら、Scalaの型システム(Javaの型システムも)は型推論と色々相性が悪い。
特に、完全な型推論をやろうとすると理論的に決定不能。
ちなみに、無名関数の引数に関しては現時点でも型注釈を付けなければいけない箇所はそんなに多く無いと思うけど。
以前どっかでも書いたことがあるけど、型システムの表現力は一般には型推論の強さとトレードオフになっちゃう
COBOL難民はJavaにうまいこと導けたけど Scalaは敷居高そう
>>927 うーん、ぴんとこない。
たとえば、
case class Nil[T]() extends List[T] {}
とあるとき
Nil()に対して∀T.List[T]を推論するとどこがまずくなるん?
>>923 その中で妥当なのは高級言語だけだな。
あとは普及していた言語が構造化・オブジェクト指向化したか、
別の理由で普及した言語が構造化・オブジェクト指向化されてたか。
高級言語内じゃ「ソフトウェア作成の労力削減」が理由で
「広く使われるプログラミング言語が交代」したことはない。
scalaでないとできない必須の機能がないと移行しないだろうなぁ
932 :
917 :2010/12/17(金) 10:04:03
文字通り捉えられて
>>920 みたいな質問が来てしまった。本当に済まない。
さすがにチューリング完全だから〜などと言われたら、訂正せざるを得ない。
> 実際にScalaでしかできないことって何かある?
実際にScalaでしか(楽に)できないことって何かある?
> JavaプログラムにできなくてScalaプログラムにできる事は何か、
JavaプログラムにできなくてScalaプログラムに(楽に)できる事は何か、
とはいえ、JVMで動くライブラリを書けばScala向けだろうが結局Javaでも使えるだろうし、意味がないか
>>924 ”成長しよう”というのはともかく、"新しい事やより良いものを学んで"というのがないと、
常にその時代に今流行ってる(今ならJavaかPHPか?)ものを使うわけだろ。
プログラマーがたくさんいて、常に安値で雇われ続けるわけだ。
アホじゃねーかw
>>932 だからちょっとは自分で考えてみたら?
Javaにできなくて、RubyやC#でできる決定的なことはあったのか
それに比べてScalaはどうなのか
935 :
デフォルトの名無しさん :2010/12/17(金) 18:16:24
シングルコアでの性能向上がほぼ限界を迎えて マルチコア、マルチプロセッサが一般的になるだろうというのが大方の見方。 だから並列処理プログラムを書きやすそうな言語に注目が集まっている。 JavaからClojure、Scalaもその流れだし、MSがF#出したのもそう。 JavaだとGemFireやTerracottaとか使う手ももあるけどね。
sageになってなかった・・・
>935 C# 4.0の、Parallel.Forがよく出来てるんだよね。 普通のループをちょこっと書き換えるだけで、スレッドプーリングを使った 並列処理出来る。 Scalaで同じこと出来たらいいのに。 2.9で入るという、並列コレクションがそれなのかな? それとも、Javaの並列コレクションをScala風に味付けしただけ?
並列コレクションもIterable継承してるから並列じゃないコレクションと全く同じように使えるよ それと並列化可能なコレクション(Parallelizableトレイトを継承してるやつ)には 並列化した自身を返すparメソッドが定義されてて、 for (i <- (0 until 100).par) yield { /* ごにょごにょ */ } こんな感じで使えるようになってる
>>929 それだとScala特有の話ではなく、副作用と多相型組み合わせると起こる一般的な罠なんだが説明してみよう
そういう推論すると、Nilがmutableなオブジェクトのときに破綻する。たとえば、Nilが
def prepend(t: T): Unit
という先頭に要素を追加するメソッドを持ってたと仮定する。で、Nilの型が∀T.List[T]だとすると、
val xs = Nil() //∀T.List[T]
val ys: List[Int] = xs // OKのはず
xs.append("foo")
ys.head //List[Int]のheadなので、Intが返って来るはずだが…?
のように、キャストも無いのにこういう型安全じゃないコードが書けてしまう。
ちなみに、ML系言語のref型(副作用あり)でも同じ問題があって、これを避けるためにML/OCaml等の副作用ありの
関数型言語にはvalue restriction(値多相)という多相型に関する制限があったりする。
あと、そもそもNilに対して∀T.List[T]を推論するのは単純に間違い。何故なら
case classのセマンティクスでは、val xs: Nil[Int] = Nil()
のようにNil自体を型として扱う事ができないといけないから。Scalaの型推論がやっかいな
理由はまた別のところにあるんだが、ちょっと長くなりそうなので、その内気が向いたら書いてみる。
Lift使うなら、play! fw + scala pluginの方がいいよ Liftいろいろ面倒くさすぎる
Scalaの自習にLiftは最適。 Liftで組めるようになった時、Scalaを大体理解出来たと言える。
942 :
デフォルトの名無しさん :2010/12/20(月) 23:45:23
Liftの日本語の本ってありますか?
ない
ウェブ板に行っても相手にされないだろうから、いつもお世話になってるここで怒りをぶちまけてもいいですか。
なんかみなさんピーチクパーチクやってるとこのリニューアル動画を見て唖然としたんですが、
ttp://twitter.com/newtwitter 最近のGoogle的な改悪がどんどん進んでいて止まる気配がないように思います。
視覚的な情報認識速度、無駄なマウス操作、そしてページのロード速度、
どれもこれも重くなる一方で、ハードウェアの性能が上がっても体感の不満は一向に解消されません。
このままいくと、(過去幾度も繰り返された如く)進化論的に間違った方向にいくような気がしてなりません。
心理学もわかってないようなデザイナーが大きな顔をするな!と言いたいのですが、
そういう言説はもはや息絶えたかのようにみえます。
まともな開発者に反旗をひるがえしてほしい。そして世界を快適なものにしてほしい。
・・・という業界外の人間の怒りでした。
いっそのこと業界に入って本気のテキストブラウザとか投下してやろうか・・・。
スレ違い っつーか 板違い
JVMの恩恵を授かっているがJVMに足を引っ張られている自己矛盾言語
Scalaと95%ぐらい互換があってJVM由来のイケてないところを取り除いた言語を.netで作ったら 結局.netの制限でここがイケてないねみたいな感じの場所が出てくるのかな
未だにx86アーキテクチャを捨てられないようなもんだな
というか、Scalaの.NET用の実装ってどうなったん?
Windowsでしか動かないスクリプトチック言語とかメリットまるでなしじゃね
実装寄りの話は、どこかのだれかがカリカリとコードを書くとして、 Martin Odersky先生には、Scala言語仕様を洗練することに力を注いで欲しいなあ。。 Scalaの言語仕様は、まだまだ発展途上な感じがする。
for〜yield式の型はどういう規則で推論されてるんだろう?
>>953 推論していない
for〜yield式は構文レベルでforeach,map,flatMap,filterの組み合わせに変換される
(2.8だとwithFilterってのが加わってちょっと変化したが基本的には同じ)
型推論はその後に行われるので、for〜yield式自体に何か特別な型推論規則がある
わけではない
ありがとう。 だから、最初のジェネレータの型によって、 結果がListになったりSetになったりするのか。 そしてyieldといいつつ、いわゆる(コルーチン的な)ジェネレータとは違うんだね。 Set上のループだと全部回らないと結果を1つも返せないから。
>>950 2.7.7まではそこそこ正常に動作するぽい
2.8.0以降だとコンパイル時にエラーになる
プロファイラはどうしてる? やはりJavaのを使うしかないのかなあ
>958 今までで一番良い出来。
Javaのほうだけどこの人のリフレクションのところはすごいお世話になった気がする
961 :
sage :2011/01/02(日) 17:32:34
>>950 .NETはF#が標準で入ったから、それ使うだろjk
おれも
>>958 の人のページには色々お世話になった。
ほどほどな規模のScalaのコード見てみたいんですが、 どこかにお手軽アプリ作ったりして見せあってるコミュニティとかありますかね?
965 :
963 :2011/01/05(水) 11:41:15
>>964 おお!まさにこんな感じのやつです!ありがとうございます。
一つ一つ見ていきたいと思います
とくにscala.swing関連のやつはとても助かります
xmlでid属性がhogeの要素のテキスト抜き出したいんだけどこんな感じでいいの? もっと簡単な書き方あるかな? val result = (html \\ "_").find(_.attribute("id").exists(_.text == "hoge")).get.text
>>966 おーあんがとう。最近さわってないので、ど忘れしてた。
浅海さん、英語できないにもほどがある。 UntiPatternじゃアンチパターンじゃなくてウンチパターンにしか読めない。 腹抱えて笑ったぞ。
どこの話題か知らないけど、UnkoPatternなら良かったのにね。
>970 ボクらのScala p.335より object MailExtractor { def unapply(string: String): Option[(String, String)] = { val Pattern1 = 省略 val Pattern2 = 省略 val UntiPattern = """(.*[.][.][^.]*)""".r 以下省略
そっとしておいてやれw
>971 たぶん、その [.] 1つがコーン1粒を表現してるんだと思うよ。
974 :
デフォルトの名無しさん :2011/01/07(金) 22:13:45
ウンチパターンw
つか、この正規表現、ちょっと不自然じゃない? 別にいいけどさ。
オライリーからScala本出るな、Effective Scala的な本とかとかScala cookbook的な本マダー?
m●tzが死んだほうがたぶんいい方向に 発展すると思うよ。きちんと自分の意見言えるようになるはずだし 共産主義、宗教的な指導者はコミュニティは邪魔だし
宗教はアヘンだ、というテーゼは確か共産主義者のものだったな。 ソ連が崩壊して20年も経つとこういう馬鹿も出てくるわけだ。
981 :
デフォルトの名無しさん :2011/01/08(土) 11:10:23
matzが死んだ後にこそ宗教としてのRubyがはじまる
まぁ書名からしてネタ臭さは感じる Rubyでアニメ好きが書いた本あったろ そういう類のあれ?
そうか冬休みか
985 :
デフォルトの名無しさん :2011/01/08(土) 13:50:25
Martin先生の脳だけでも今から取り出して保存したほうがいいよなぁ
でも、あと追加するべき大きなフィーチャーって何だ?
論理型言語機能じゃない?
おっぱい おっぱい おっぱい お
マクロ機能だな
依存型も
うめ
梅
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。