プログラミング言語 Scala 4冊目

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
2デフォルトの名無しさん:2010/06/07(月) 15:28:02
・Scalaの紹介文(さわり)
Scalaは簡潔かつ優雅で型安全な方法でよくあるプログラミングパターンを表現できるように
設計された汎用プログラミング言語です。
Scalaはオブジェクト指向と関数型言語の特徴をスムーズに統合しておりJavaやその他の言語を扱う
プログラマをより生産的にすることができます。(以下略)
ttp://www.scala-lang.org/node/25

・Scalaに関する書籍(英語)
ttp://www.scala-lang.org/node/959
リファレンスマニュアルや草稿のPDFなども充実しているのでそちらも参照してください。
日本語の資料には、チュートリアルの訳やIBM dW、IT Proの連載記事、各々で開かれた勉強会の資料などがあります。
3デフォルトの名無しさん:2010/06/08(火) 21:43:02
>>1
4デフォルトの名無しさん:2010/06/10(木) 19:40:27
ほしゅ
5デフォルトの名無しさん:2010/06/11(金) 13:35:11
ほしゅ ほしゅ
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チェックするしかないです。

記事のコードでそのへんのチェックが抜けていたのは
完全なバグですのであとで直します。

7sage: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追ってない。。。
8デフォルトの名無しさん:2010/06/11(金) 15:40:39
sageまちがえたorz
9デフォルトの名無しさん:2010/06/12(土) 00:30:43
どんまい‼
10デフォルトの名無しさん:2010/06/12(土) 01:15:34
11デフォルトの名無しさん:2010/06/12(土) 08:44:55
12デフォルトの名無しさん:2010/06/12(土) 21:53:38
ボクらのScala ~ 次世代Java徹底入門 浅海 智晴 (単行本 - 2010/6/25)

って、どうだろう?

別にお金出して買うのに抵抗はないけど、
部屋の本棚がオーバーフローしているので、本買うのは躊躇してしまう。。
13デフォルトの名無しさん:2010/06/12(土) 21:56:16
次世代Javaって
14デフォルトの名無しさん:2010/06/12(土) 21:59:27
>>11
さんきゅ
15デフォルトの名無しさん:2010/06/12(土) 22:33:38
>>12
タイトルが釣りすぎる
16デフォルトの名無しさん:2010/06/12(土) 22:41:42
Relaxerの人か
著者は悪くないね
17前スレの943:2010/06/12(土) 23:29:00
おおお、yuroyoroさんご本人ですか!レスありがとうございます!
twitterでフォローさせてもらってますw

>>keyに対してのvalueが一件もない場合はnullが返るのがLowLeveAPIの仕様です。
やはりそうなんですね。
自分はまず前編を拝見させて頂いて、そのアプリでブラウザから操作をしてみて、
そのあと後編のソースコードを上書きしたんです。
前編でmembersプロパティがないeventエンティティをデータストアしてしまったので、
後編のソースコードに上書きしたらnullエラーが出るようになってしまっていたのでした。
途中ででそれに気づいてDBからデータを全部消したら後編のプロジェクトもうまく動くようになって、
それで今いろいろ勉強させて頂いているところです。

ちょうどScalaでGAEアプリを作ってみたいと思っていたところでyuroyoroさんの記事に出会い、
とてもラッキーでした。
とてもためになる記事を書いていただきまして、本当にありがとうございます。
18デフォルトの名無しさん:2010/06/12(土) 23:33:12
せめて
次世代Java系スクリプト徹底入門
じゃないかと思うぜ
19デフォルトの名無しさん:2010/06/13(日) 01:27:34
>>12
「次世代Java徹底入門」はかなり気が早いですね。
でもGroovyより速いペースで普及しているから
数年後には現実が本のタイトルに追いつくかもしれません。
http://www.indeed.com/jobtrends?q=Scala,Groovy,Java
http://www.indeed.com/jobtrends?q=Scala,Groovy

>18
「次世代Java系スクリプト徹底入門」は問題外だと思います。
GroovyがJava系スクリプト言語とされるのは言語仕様に動的型付けを含むからです。
Scalaは型推論を取り込んだ静的型付け言語です。
Javaがスクリプト言語ではないように、Scalaもスクリプト言語ではありません。
20デフォルトの名無しさん:2010/06/13(日) 01:38:49
動的型付だからスクリプト言語じゃないってのも違うような
21デフォルトの名無しさん:2010/06/13(日) 01:40:37
動的じゃないや静的

インタプリタ的(ソースそのまま)に動かせるかどうかって所だと思うわスクリプトか否かって
22デフォルトの名無しさん:2010/06/13(日) 02:10:55
明確な定義ないしどうでもいい
23デフォルトの名無しさん:2010/06/13(日) 12:47:53
<-
の代わりに

が使えるけどみんな使ってる?
24デフォルトの名無しさん:2010/06/13(日) 13:27:29
>>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 したあとにクラスのメソッドをオーバーライドできる?
のでしょうか?
26デフォルトの名無しさん:2010/06/13(日) 19:59:05
>>25

Javaの無名クラスと同じ。継承とインスタンス作成を同時におこなってる。
その場でHashMapのdefaultメソッドをoverrideしたクラスを定義してる。

(なおかつ、それをSessionVarのコンストラクタに渡し、さらにそれを継承したCountHolderというobjectを定義してる)
27デフォルトの名無しさん:2010/06/14(月) 07:03:01
>12
そのうち、Scala自体が、Java好きな人達に叩かれるようになるんじゃないだろか。
28デフォルトの名無しさん:2010/06/14(月) 13:41:27
>>27
でも、Scalaの周辺環境やツール類の問題(ビルドが遅いとか、IDEがJavaに比べて未成熟だとか)は
ともかくとして、言語としてのJavaがScalaに勝ってる箇所って無いに等しいから叩くにしても
言語仕様が複雑過ぎる〜とかそういうのになりそうな気がする
29デフォルトの名無しさん:2010/06/14(月) 14:09:03
一番重要な実行速度はJavaが上だろ
30デフォルトの名無しさん:2010/06/14(月) 14:46:36
実際の使用に差出るほどの影響はないんじゃないの。
31デフォルトの名無しさん:2010/06/14(月) 18:34:27
なんでそう思う?
32デフォルトの名無しさん:2010/06/14(月) 18:51:10
むしろ遅い方の実測値を出せ
33デフォルトの名無しさん:2010/06/14(月) 21:52:46
なんともいえないけど、前より差が減った気がする。

64bit クワッドコア http://shootout.alioth.debian.org/u64q/scala.php
64bit シングルコア http://shootout.alioth.debian.org/u64/scala.php
Scala compiler version 2.7.7.final
jdk1.6.0_18


ところで、Actorsの競争はどうなってんだ。ベンチマークするのめんどい・・・
http://www.slideshare.net/jboner/akka-simpler-scalability-faulttolerance-concurrency-remoting-through-actors
http://www.malhar.net/sriram/talks/kilim-google.pdf
http://www.slideshare.net/VaclavPech/concurrency-on-the-jvm
34デフォルトの名無しさん:2010/06/14(月) 21:56:48
Actor Frameworks for the JVM Platform: A Comparative Analysis
http://osl.cs.uiuc.edu/docs/pppj09/paper.pdf
一年前なのにもう古くなってるんだよな。
35デフォルトの名無しさん:2010/06/14(月) 22:14:16
Actorの共有資源に対する制御はどうしてるの?
36デフォルトの名無しさん:2010/06/14(月) 22:17:46
Javaと比較すると意外にコード量も実行速度も変わらないみたいだな
http://shootout.alioth.debian.org/u64q/scala.php

コード量は若干少なくなるけど、実行速度は若干遅くなるって所か
37デフォルトの名無しさん:2010/06/14(月) 22:20:31
Javaと比べてコード量が変わらないっておかしくね?
計算アルゴリズム書くだけのベンチ?
38デフォルトの名無しさん:2010/06/14(月) 22:21:06
そんなにおかしくもないだろ別に
39デフォルトの名無しさん:2010/06/14(月) 22:23:04
入門書なんかは決定的にコードが減るパターンをセンセーショナルに取り上げてたりするからねぇ。
実際は書き方が変わるだけで、一つ一つのロジックレベルでは、
決定的にコード量が減るってもんでも無いと思う。
小さな積み重ねをすると、総合的に目に見えて分量が減るのは確かだけど。
40デフォルトの名無しさん:2010/06/15(火) 03:12:29
一般論としては、数値計算系のベンチマークだとあまり言語による
コード量の差が出にくい。つーのは、よく知られたアルゴリズムが
既存の手続き型言語用のものだったりするので、それをベタ移植しても
あまりコード量が変わらないという…。あと、あまり数値計算系で
扱うデータ構造ってあまり複雑じゃないんで、高階関数とかの出番が
少ないんだよな…。一方、コンパイラとか言語処理系みたいな、複雑な
データ構造をいじりいまわすプログラムだと滅茶苦茶差が出る。

あと、shootoutのプログラムコード見るとわかるんだけど、全然Scala
っぽくなくて、ほとんどJavaみたいなコードが結構ある。Javaっぽい
書き方した場合、型宣言+αくらいしかコード量が減らない代わりに
実行速度もほとんど変わらないから、まあ納得の結果だなあと。
41デフォルトの名無しさん:2010/06/15(火) 20:09:27
普段はScalaが遅いとは感じないけど
Eclipseでデバッグ実行すると異様に重く感じる。
42デフォルトの名無しさん:2010/06/15(火) 21:24:25
そりゃ普段は遅くは感じないと思うよ
単に素のJavaの方が速いってだけの話で
43デフォルトの名無しさん:2010/06/15(火) 22:36:31
>>41
単にEclipseのScalaプラグインが重いとかその辺りだろう

>>42
なんでそうなる?
scalacがコンパイルしたコードを逆アセンブル or 逆コンパイル
してみりゃわかるが、原理的にほぼjavaと同等の速度が出るようになってるよ
Javaの方が速いってのは単なる先入観だ

違いが出るのは、暗黙型変換使いまくったり、高階関数使い
まくったりした場合だな。特に2.7だとspecializationが無いせいで
プリミティブ型のboxingでアロケーションが多発するので遅くなる。
44デフォルトの名無しさん:2010/06/15(火) 22:40:13
要するに違いが出るんだろ
45デフォルトの名無しさん:2010/06/15(火) 22:50:07
>>44
書き方に依存するって言ってる。
基本的にはJVMの上で動く以上、Javaと同じように書けば、同じような速度が出るし、実際そのようなコード
は書ける。Scalaっぽいコードっつうか、関数型プログラミングスタイルで書いた場合は、JVMの上だとどうしても
パフォーマンスが劣る傾向があるので、性能と簡潔さをトレードする感じになる。でまあ、もちろん0か1かの二択
じゃなくて、基本的には関数型で書きつつ、チューンしたい部分をJavaっぽく書くとかそういうこともできるわけ
46デフォルトの名無しさん:2010/06/15(火) 23:55:01
やっぱ関数型的に綺麗に書くと遅くなるもんなのか
47デフォルトの名無しさん:2010/06/16(水) 01:12:11
JVM上で動いてかつJavaとの互換性を高いレベルに保つってことで
一般の関数型言語ではやれる最適化手法の一部は使えなかったりするだろうし
48デフォルトの名無しさん:2010/06/16(水) 01:24:17
>>45
要するに素のJavaの実行速度は超えることが出来ないんだからJavaよりは遅いで間違ってないだろ
49デフォルトの名無しさん:2010/06/16(水) 03:04:07
>>48
え?
Javaと同じかそれより遅い、なら真だけど
Javaよりは遅い、は偽でしょ
Javaの速度≧Scalaの速度(実はこれも語弊があるけど。
JavaでScalaみたいに関数型プログラミングをやると同様に遅くなるはず
なので) ⇒ Javaの速度>Scalaの速度
って意味不明だろ
50デフォルトの名無しさん:2010/06/16(水) 03:08:21
厳密に言うとJavaと等価にはなりえんだろう。
51デフォルトの名無しさん:2010/06/16(水) 03:13:23
>>50
等価ってのが何を意味するかにもよるが
Javaっぽく、というか副作用を駆使すればJavaと同じ(これは
*誇張ではなく*ほぼ同じ)速度が出るって点には納得してもらえてる?
もしそうなら、Javaより遅いってのは論理的に明らかにおかしいのが
わかると思うのだけど…。
52デフォルトの名無しさん:2010/06/16(水) 03:13:48
ほぼ同じ=同じ
ではないんじゃね?
53デフォルトの名無しさん:2010/06/16(水) 03:17:40
Scalaを好意的に見たいってのは解るんだけど、
現実を見ると、どんだけ厳密に最適化したところで、最高はJavaと等価が限界で、
Javaの実行速度を越えることはできなんだし、
Javaと同じ速度が出る場面なんて殆ど無いんだから、
Javaと同じ速度が出るって公言していい訳じゃないと思う。
54デフォルトの名無しさん:2010/06/16(水) 07:19:35
今時、言語の速度だけ語ってもしゃーなくない?

Javaより生産性が高くて、Javaに近い実行速度ができて、
生産性の高さのメリットがその実行速度の差のデメリットを埋めることができればいい、くらいで

ま、そんなの用途や既存や手持ちのライブラリにもよるんだけど、
Ruby(Rails)が一部で使われているのはそういうのが理由でしょ。
でないと、あんな動作速度でいえば最悪級(失礼)な言語誰もつかわないでしょ。


どうでもいいが、JRubyなんてさ実行速度はRuby並だわ、
起動の遅さはJava並、動かないRubyのライブラリあるわ散々でまさに誰得言語だと思わんかね・・・

その点、Scalaはいい線だと思う

55デフォルトの名無しさん:2010/06/16(水) 08:31:32
>>52
「ほぼ同じ」ってのが、「ちょっと負けてるけど、比較できるくらい速い」
というニュアンスで受け取られたんだったら、それは俺の書き方が悪かった
「ほぼ同じ」っていったのは、Javaっぽく書いた場合でも、scalacが完全に
javacと同じバイトコード出すわけじゃない(命令列の配置が少し違う)から、
厳密な書き方しただけで、実用上は「同じ速度」と言ってもいい。

>>53
いやいや、まだ理解されてないのかもだけど、わざわざ頑張って
しなくても、Javaっぽいスタイルで書くだけでJavaと同じ速度出るんだってば
で、現実にJavaと同じ実行速度が出る場面なんてほとんど無いとか、測定
したことも無い(だろうと思われる)のになんで語れる?
実測値示してみせりゃ納得するのだろうか?
好意的に見たいとかそういう問題じゃなくて、単純に事実の話だよ
5655:2010/06/16(水) 08:55:40
つーか、Scalaの速度について、Javaより遅いけど頑張って最適化すれば
Javaに近いくらいの速度が出るくらいの受け取り方する人って意外に多い
ことに驚いた。

たとえば、今Java 7に入る入らないでもめてるクロージャあるよね。
あれ多用したコードの性能は、ほとんど間違いなくScalaで高階関数を
多用したときと同じように落ちると思われるんだが、そうなったとき、
Java 7以前の速度は、Java 7よりも速いと言うのは正しいの?
自分が言っているのはそういうレベルの話。

ふつーにループ構文(whileとか)とJavaのAPI使って書けば性能はJavaと
同じだし、Scalaっぽく書けばより遅くなるというだけの話なんだけどなあ。
もちろん、Scalaがややこしい作業を色々肩代わりしてくれるおかげで、
つい、Javaよりも気楽に遅いコードを書いちゃうというのはあるんだけど、
それって言語処理系の速度評価とは独立な問題だよね
57デフォルトの名無しさん:2010/06/16(水) 10:51:06
なんで全てのパターン試してきたら同じ速度出たのを検証したみたいな断言するのか解らん
そんな簡単に最適化できるわけでもなかろうに
58デフォルトの名無しさん:2010/06/16(水) 10:53:17
同等可否レベルのパフォーマンスの話はバイトコードで語れっての。
59デフォルトの名無しさん:2010/06/16(水) 10:57:42
普通にScalaっぽく書いたら速度差出るなら、
それは等速とは言わないよね。
Javaっぽく書いて最適化すれば等速出るって言われても、
もはやそれはJavaじゃん。
6055: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の方が速くなるケースもあるかも。
6155:2010/06/16(水) 13:57:07
>>59
事実関係についてはおおむね同意してもらえたとして、そこまで来ると
もはや見解の相違としか。一応言っておくと、ScalaでJavaっぽく書くことは
特に努力が必要な作業でもないよ。ふつーにScalaの基本構文を使って書く
だけ。暗黙型変換使うなとか使う機能に関して縛りは出るけど、特にScalaを
熟知していないとできない作業でもない。

ただまあ、

・Javaっぽく書くこと自体は特に難しくないこと
・そのようにして書かれたコードはJavaと同等の速度が出ること

に納得してもらえたなら、それ以上、特に等速という言葉を使うことに
こだわりは無い。単に、「性能の上限はJavaと同じくらいだけど、それを
達成するためには頑張ってチューンしなければならない」みたいな認識が
広まるのが嫌なだけなので。
62デフォルトの名無しさん:2010/06/16(水) 15:12:58
リスト+mapやforを使ったコードもただのループになったりすればいいのに。
63デフォルトの名無しさん:2010/06/16(水) 15:49:30
>>61
いやだからそれってもはやJavaじゃん
6455:2010/06/16(水) 16:08:14
>>63
そうとも言えない。
・型推論があるおかげで型を書く必要がある箇所がJavaに比べてかなり減る
・型の別名付けがあるおかげで、ジェネリクスを使ったコードがJavaに
比べて楽に書ける
・case classなどのおかげで、クラスの作成がJavaに比べて楽
・どこでもimport
・末尾再帰の最適化
・メソッド内メソッド
・パターンマッチ

などなど。これらの性能にあまり影響しない特徴を使うだけでも、
コードを書くのはJavaに比べて楽だよ。
65デフォルトの名無しさん:2010/06/16(水) 16:21:18
んでそれで書くと等速になるって実際に確かめたの?
66デフォルトの名無しさん:2010/06/16(水) 16:35:16
>>62
ただのループに変換するにはクラスを合成する必要があるから
クラス単位でコンパイルするScalaコンパイラでは難しいでしょうね。

Javaにクロージャが追加されたらJVMがクロージャを
ただのループに最適化するようになるかもしれません。
そうなればScalaの高階関数も同様に最適化されるだろうから
Scalaっぽく書いたScalaコードもJavaっぽく書いた場合と
同等の速度がでるようになると考えられます。
Javaにクロージャが追加されるのを期待しましょう。

>>65
>>55が何を実際に確かめたのかは>>60に書いてあるのでは?
6755:2010/06/16(水) 16:38:57
>>65
あらゆるコードで、とは言わないけど、典型的なコードパターン
では結構試したかな。つか、さっきも書いたけど、Java的なコードは
Java的にコンパイルされるので、全部確かめる必要も無い。

あとは、>>36のリンク先の、regex-dna,n-body,binary-trees,fannkuch-redux
辺りのコードが参考になるかな。 Javaと同じような書き方してる
ベンチマークはほとんど同じ結果になってる。ちなみに、大きく差が出てる
k-nucleotideなんかはJava版とScala版でやり方が大きく異なってる点に注意ね。
68デフォルトの名無しさん:2010/06/16(水) 16:42:11
机上の空論で議論しても仕方ない。
殆ど同じ、じゃなくて完全に同じかどうか聞かれてるんでしょ?
69デフォルトの名無しさん:2010/06/16(水) 16:49:05
みんなtwitterのクジラは見たくないんだよ
70デフォルトの名無しさん:2010/06/16(水) 16:51:27
全か無かでしか思考出来ないのは、認知のゆがみの典型的パターン。
7155:2010/06/16(水) 16:56:16
>>68
んな自明なこと聞かれてたの?
完全に同じなんてことは、scalacがjavacのforkでも無い限り(
というかforkであっても「完全に同じ」なんてことはまず無いが)
ありえないってことは議論するまでも無く明らかだと思うのだけど。

俺は実際のコードでほぼ同じであることを説明すれば十分だと考えた
ので、scalaのコードがどういうバイトコードにコンパイルされるか、
や、shootoutのコードを示したわけなんだが、あとは何があればいいの?
72デフォルトの名無しさん:2010/06/16(水) 17:03:47
素のJavaよりも速いのか、遅いのか、全く同じなのか、ってことでしょ?
ちょっとでも遅いのなら、Javaと等速っていうのは過剰評価じゃね?ってことだよ
細かな速度は重要じゃないって言ってる人が、何故か一番Javaと
等速であることに拘ってるよね
73デフォルトの名無しさん:2010/06/16(水) 17:12:25
>>55
実行速度に関する情報提供ありがとうございました。
大変参考になりました。
74デフォルトの名無しさん:2010/06/16(水) 17:15:45
ベンチマーク的な事じゃなくて、実際に実務でどうなるのかが唯一重要な希ガス
75デフォルトの名無しさん:2010/06/16(水) 17:17:33
速度なんて関係ねーよとは言いつつ、殆どの人がこだわるのが速度だからねぇ
Rubyの人を除く
76デフォルトの名無しさん:2010/06/16(水) 17:35:30
さすがAKB大好きなだけありますね。
7755: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と同じ速度が
出るようにするのは難しくない。
7855:2010/06/16(水) 18:40:48
つけくわえておくと、ほぼ同じって言葉の意図は、Javaに近いけど、ちょっと
遅い、じゃないからね。Javaっぽく書いたScalaのコードとJavaのコードの
速度差はほとんど誤差のレベルだから優劣を比較するのが難しいってこと。
79デフォルトの名無しさん:2010/06/16(水) 19:04:50
そういう事じゃないのでは
80デフォルトの名無しさん:2010/06/16(水) 22:44:10
だいたいJavaっていってもVMのバージョンやベンダによって全然違うわけだが
ある程度近いなら同じって言い切って構わないよ
81デフォルトの名無しさん:2010/06/16(水) 22:46:36
なんか良く分からんが、
・C++は遅いから禁止。 Cで書け!
・ハードェアを叩きたかったら、既存のドライバ使うな!ドライバは自分で書け!
・OSなんか使うなよ。そんなのを介すると当然遅くなる。
・可能だったらアセンブラで書け!Cだと遅いからな。
という話と同じだな。
組み込みの分野では、未だにそういうプログラミングやるよ。

で、数年前、C++はCより速度が劣るからダメ!と拒否しまくっていた人が居た。
まさにデジャブだね。

最近は組み込みでもC++で書くことも多くなってきている。
当然、C++っぽい書き方をしまくるとCより遅くなるのだが、
速度よりも分かりやすさ優先な場合は、そういう書き方しても全然問題でない。


要するに頭を使って適材適所でプログラミングすれば、
組み込みの現場でも CとC++の速度は同等だし、かつ、C++は便利といえるんだよ。
82デフォルトの名無しさん:2010/06/16(水) 22:47:00
ScalaコードをJavaにトランスコードすればいいんだよ。 javapを応用すれば出来るでしょ?
83デフォルトの名無しさん:2010/06/16(水) 22:54:52
>>79
毎度毎度お前は。
twitterでつぶやいてろ。
84デフォルトの名無しさん:2010/06/16(水) 23:34:28
>>81
駄目、使うな、って言ってるんじゃなくて
速度はJavaと全く同じは言い過ぎじゃね?ってだけの議論だろ
85デフォルトの名無しさん:2010/06/16(水) 23:38:51
ScalaはJavaより速い!
86デフォルトの名無しさん:2010/06/16(水) 23:40:20
兄よりすぐれた弟なぞ存在しねぇ!!
8755:2010/06/17(木) 01:47:25
>>84
そりゃ二つの異なる言語処理系の性能が「全く同じ」なんて、
いかなる場合でも言えるわけが無いと何度言ったら…

とりあえず、同じような書き方した場合にベンチマークで有意な差が
出ないってのはshootoutのコードだけ見ても十分わかるし、原理的にも
「ほぼ」同じ速度が出る。で、無限にあるJavaプログラムと
Scalaプログラムの速度を比較するにあたって、同じような書き方すれば
速度が「ほぼ」同じだろう、以上の事はどうやっても言えないんだけど、
一体どうしろと言うんだ?そこまでして、Scalaの実行性能がJavaと同程度
であるってこと認めたくないわけ?Javaより少し遅いといえば満足なの?
8855:2010/06/17(木) 01:59:35
とりあえず、反論してくる人が何を主張したいのかさっぱりわからんので
主張をまとめてもらえないか。自分の主張はシンプルで、原理的にも
実用的にも、Javaと同じような書き方(whileループやvarの利用)をした
コードはJavaとほぼ同じ速度が出る。以上、これだけ。

反論してくる人は、「全く同じ」という無意味な言葉を使わないで
主張の要点を説明してくれ。二つの異なる言語処理系の速度が「全く同じ」
なんてことはそもそもありえないし、こちらはそんな事言ってないんだから。
89デフォルトの名無しさん:2010/06/17(木) 02:06:29
>>84
> 駄目、使うな、って言ってるんじゃなくて
> 速度はJavaと全く同じは言い過ぎじゃね?ってだけの議論だろ

そもそも、そんな議論はしていない。

誰が、「速度が全く同じかどうか」にこだわっているんだ?お前くらいだろ。
さっきからのその問題点のすり替えで、どうどうめぐりなので、辞めてくれるかな?


ていうか、お前、55氏の書いている内容を理解してないだろ?
これ以上愚問を繰り返すならば、せめて >60 の意味が分かってからにしようよ。
90デフォルトの名無しさん:2010/06/17(木) 02:07:34
速度はJavaと全く同じは言い過ぎってのは間違いじゃないだろうに。
91デフォルトの名無しさん:2010/06/17(木) 02:10:33
お前ら仲良くしろ
結局の所、>>33-36の結果を覆さないと堂々巡りになるんじゃないかね。
散々俺たちだってベンチマークの結果出して、RubyやPythonおせえwwwって言ってきたわけだし
9255: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つなので
順番に検討していく。
93デフォルトの名無しさん:2010/06/17(木) 02:33:29
>>90
> 速度はJavaと全く同じは言い過ぎってのは間違いじゃないだろうに。

君の主張は詭弁だらけだな。

とりあえず、
「全く同じ」 「言い過ぎ」 「間違いじゃない」
って言葉を使うのは辞めておけ。


で、もう一度、スレを読み直してごらん?君は、いったい何を言いたいの?
94デフォルトの名無しさん:2010/06/17(木) 02:52:33
>>90
誰もそんなこと言ってねーって。
JavaとかScalaの前に日本語勉強した方がいいよ。
9555: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版で差が出てる
ベンチはコードの書き方がそれなりに違ってるという事は確か。
96デフォルトの名無しさん:2010/06/17(木) 03:31:20
55のレスの合間って不自然に口汚い援護射撃入るよな。
55がいない時間には入らないのに。
97デフォルトの名無しさん:2010/06/17(木) 03:35:49
煽ってる奴もマジレスしてる奴も、意見の辻褄がおかしくなってるから
もういい加減落ち着いて辞めた方が双方のためだと思う。
98デフォルトの名無しさん:2010/06/17(木) 09:11:36
jvm上のシステムはgcがどんだけ使われるかによってスピードがきまる。
言語ではない。
99デフォルトの名無しさん:2010/06/17(木) 09:20:03
それはない
100デフォルトの名無しさん:2010/06/17(木) 09:23:23
このスレ一番のトンデモ理論出ました
101デフォルトの名無しさん:2010/06/17(木) 10:45:12
gcが使われると遅くなるだろ
どこが、とんでもなんだ?
102デフォルトの名無しさん:2010/06/17(木) 10:46:28
>>99
お前はtwitter かはてぶしてろ
103デフォルトの名無しさん:2010/06/17(木) 10:56:27
>>96
あーあ、言っちゃったw
10466:2010/06/17(木) 14:35:51
>>96
話の筋を理解しないレスに突っ込みたい人は何人もいるでしょう。
私も突っ込みましたが私は>>55なんですか?

>>55
同じ内容を繰り返しているレスはスルーしてくれませんか?
不毛なやりとりでScalaスレが埋まるのはうれしくありません。
10555:2010/06/17(木) 15:02:32
>>104
スルースキルが低くて申し訳ない。納得いかないとつい書いてしまう性質
なもので。確かにどうどう巡りになってて、不毛だったかも。
106デフォルトの名無しさん:2010/06/17(木) 17:26:48
長島雄一郎入っちゃった
107デフォルトの名無しさん:2010/06/17(木) 22:00:51
>>104
> 話の筋を理解しないレスに突っ込みたい人は何人もいるでしょう。
> 私も突っ込みましたが私は>>55なんですか?

俺も、問題点をすり替えて、何度も同じ主張をするやつに文句言ったが、
別に、66でも、55でもないぞ。

他にも、コイツにツッコミ入れたやつは、あと4人くらい居るみたいだ。
108デフォルトの名無しさん:2010/06/17(木) 22:49:45
なんで急に弁解しだしたんだ。
109デフォルトの名無しさん:2010/06/17(木) 23:45:00
疑われたからだろ。
110デフォルトの名無しさん:2010/06/18(金) 00:54:56
大嶽親方「今は言えない。時が来たら話す。」
111デフォルトの名無しさん:2010/06/18(金) 01:25:00
とりあえず、「全く同じは言い過ぎってのは間違いじゃない」という発言のアホさに
ようやく気付いたみたいだから、彼も進歩したようだ。

でも、複数の人からアホ認定されているのは認めたくないようで、
現実から逃げて自作自演とかって騒いでいるから、まだまだアホのままだな。

>79, >90 のその後の発言は、>106, >108 ,>109 , >103, >96 , >99 なのだが、
アホの発言ってアホ丸出しだから本当分かりやすいよなあ。
112デフォルトの名無しさん:2010/06/18(金) 08:57:27
2chでは行間開ける人はまずいないことを、
こうなる前に早めに教えてあげるべきだったろうか。
113デフォルトの名無しさん:2010/06/18(金) 09:10:53
ダブルスペースで書く奴はいないけど、
話の区切りに行間を開ける奴はいるだろ。

てか、同一人物認定したところで、アホがアホである事実は変わらない。
114デフォルトの名無しさん:2010/06/18(金) 09:23:42
話の区切りが必要な長文書くヤツもまずいないって教えてあげなきゃだな
115デフォルトの名無しさん:2010/06/18(金) 09:34:01
そりゃ、ニュース系の話だろ。
116デフォルトの名無しさん:2010/06/18(金) 09:35:25
2ちゃんねるといえばニュース系しかないと思ってる頭の弱い人もいるってことだよw
117デフォルトの名無しさん:2010/06/18(金) 11:39:39
・俺の意見ではない。みんなが言っているんだ。
・自分を批判するレスを全て妄想のイコールで結び始める。
118デフォルトの名無しさん:2010/06/18(金) 11:42:01
>>112
マジレスすると、むしろもうちょっと早い段階で皆スルーすべきだった
>>77 あたりで
119デフォルトの名無しさん:2010/06/18(金) 11:43:39
この人もしかしてあの入門の人じゃね
120デフォルトの名無しさん:2010/06/18(金) 11:59:32
それ指摘したらヤバいだろ。
121デフォルトの名無しさん:2010/06/18(金) 12:59:18
この流れを見るまでにscalaとjavaの速度差が気になるって人が
いることに思いがよらなかったよ。

スクリプト言語よりは遙かに速いんだし
Scalaで物足りないときはCでカリカリ書くものだと思ったよ
12255:2010/06/18(金) 13:08:11
なんだか悪い意味で盛り上がるきっかけになってしまって申し訳ない…
とりあえず、55以降のレスは全て名前欄に55つけてるので、(なんだか
疑いをもたれてる書き込みについて)同一人物ではないとだけ言っておく。
信じてもらえるかはわからんけど。
123デフォルトの名無しさん:2010/06/18(金) 13:08:47
気にしてるんじゃなくて、
JavaがScalaに勝ってる箇所って無いに等しい
って話が出て来て、速度は多少劣っているのではって話になって
そんなことは絶対にないって荒れ始めたのでは。
124デフォルトの名無しさん:2010/06/18(金) 13:36:42
まさにcとcppの差だね
一番の弱点はjavaライブラリを使うときに色々気を使う必要があることじゃね
125デフォルトの名無しさん:2010/06/18(金) 14:05:03
色々って何だ?
126デフォルトの名無しさん:2010/06/18(金) 14:51:35
Option[T]を前提にできないとか、
Tupleが帰ってこないから、参照渡ししないといけないとか
127デフォルトの名無しさん:2010/06/18(金) 15:25:43
ttp://d.hatena.ne.jp/kwatch/20100618/1276818038
これってこのスレに関係ある話?
128デフォルトの名無しさん:2010/06/18(金) 15:44:07
Scalaの話なのこれ?
129デフォルトの名無しさん:2010/06/18(金) 18:05:44
>>127
このスレには関係ないと思います。
そこのblog主は言語処理系の速度とアプリケーションの速度は関係ないと主張しています。
スクリプト言語処理系が遅いからと言ってアプリも遅くなるとは言えないと言いたいのでしょう。
このスレはScala言語処理系はJavaと比べて遅くないという話で盛り上がりました。
どちらも実行速度の話ですが論点が違います。
130デフォルトの名無しさん:2010/06/18(金) 19:10:27
>>122

このグダグダの中でも、>>60 のような非常に参考になる資料が書き込みされて良かったです。

しかし、これってどうやって調べられたのだろうか?
javapで 逆アセンブルだろうか?

気になるルーチンは逆アセンブルすることで、scalacがどのようにコードを変換したか分かって面白そうですね。
13155:2010/06/18(金) 19:31:51
>>130

はい。javapで片っ端から逆アセンブルです。逆コンパイルもありなのですけど、対応する命令や
クラスファイルの構造を正確に調べたい場合には不向きなんですよね…。ただ、逆コンパイルでも、
おおまかにどのようにscalacがコードをコンパイルしているかはわかるので、バイトコードは
よくわからないって人は逆コンパイラ使ってみると良いかもです。
132デフォルトの名無しさん:2010/06/18(金) 20:20:21
水島氏は自演疑惑にも負けず、晒しエントリーにも負けず、これからも素直なままでいてほしいものである
133 ◆CgacaMDhSQ :2010/06/18(金) 21:25:25
>>55あらため、みずしまです。トリップのキーをうっかり忘れてしまったので、別のトリップで。
>>132
素で>>55 = みずしまである事がばれたのにちょっと驚き。いや、別にあえて隠してたわけじゃないんだけど、
以前使ってたトリップのキー忘れてしまったので、コテをやめてただけなんですが。まあ、文体とか見れば
わかるのかなあ…。見抜いた>>132氏はよくわかったなあ。
134デフォルトの名無しさん:2010/06/18(金) 21:30:32
あー、やっぱりそうだったの?
なんとなくそんな感じはしてた。
135デフォルトの名無しさん:2010/06/18(金) 21:34:17
次はRC6かなぁ・・・finalはいつ?

http://lampsvn.epfl.ch/trac/scala/browser/scala/tags/R_2_8_0_RC6
136デフォルトの名無しさん:2010/06/18(金) 21:43:01
JVM上の言語に早いも遅いもあるかボケども
命令が丸見えなんだから書き直せ!
137デフォルトの名無しさん:2010/06/18(金) 22:46:27
なんか酷い感じになって来たな…
もうやめようよ
138デフォルトの名無しさん:2010/06/18(金) 23:01:10
まだRC3のままだったけどRC6まで来てたのか
finalマダー?チンチン
139デフォルトの名無しさん:2010/06/18(金) 23:30:52
clojureにはRCなんぞないズラ...たしか
140デフォルトの名無しさん:2010/06/18(金) 23:36:54
Planet Scala、火曜日で止まってるけどそういうもんだっけ?

blog以外も集めてるよな?
そして、手動じゃ無いよな?
141140:2010/06/19(土) 01:59:28
>>140
> PlanetScala's crontab has apparently
> broken orbit and departed for deep
> space.
twitterから
やっぱり止まってたみたい、自分の早とちりじゃなければ…
142140:2010/06/19(土) 02:31:54
そして、Planet Scala 軌道回復のお知らせ
143デフォルトの名無しさん:2010/06/19(土) 13:57:37
質問です
関数funcで2つめの引数がオプションだったとするとオーバーロードを使って
def func(i: Int, s: String)
def func(i: Int)
みたいに書けますけど

2.8だとデフォルト引数とオプション型を使って
def func(i: Int, s: Option[String] = None)
みたいにも書けますよね

どっちがいいと思いますかね?
144デフォルトの名無しさん:2010/06/19(土) 14:22:00
>>143
互換性を考えるならオーバーロード。

互換性を考えないなら、s を取るか取らないかによって、
実装が大きく変わる => オーバーロード
あまり変わらない => デフォルト引数

じゃあなかろうか。
145 ◆CgacaMDhSQ :2010/06/19(土) 15:27:44
>>143
二つ目のfuncの意味がどうなるかが問題じゃないかな
二つ目のfuncで、実際には単にデフォルト値を与えて(たとえば"")、一つ目のfuncを
呼び出しているだけなら、

def fun(i: Int, s: String = "")

みたいにした方がいいと思う。

一方、意味的に両者が大きく異なるなら、オーバーロードを使うべきだと思う。
146デフォルトの名無しさん:2010/06/19(土) 16:37:24
147デフォルトの名無しさん:2010/06/19(土) 16:51:19
ワシのRCは百八式まであるぞ
148143: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)

みたいな感じで
149デフォルトの名無しさん:2010/06/19(土) 17:51:15
yuroyoroさんがオプショナルな引数はカリー化して定義するのが2.8のAPIの流儀とつぶやいておられる
def func(i: Int)(s: Option[String] = None)
150デフォルトの名無しさん:2010/06/19(土) 17:51:25
>>148
どうやら、
> オプショナルな引数はカリー化して定義するのが2.8のAPIの流儀に見える。
> def func( i:Int )( s:Option[String] = None)
て、○○家の祖母がいってた。
151150:2010/06/19(土) 17:54:06
orz
152デフォルトの名無しさん:2010/06/19(土) 17:54:32
なんか勝った!

しかし、これ、なんか違和感があるなあ
どういう意図があるんだろ
153143:2010/06/19(土) 18:27:02
うーむ、それじゃあ呼び出すときに
func(10)()
みたいにする必要があるみたいだ
implicitが抜けてる気がする
def func(i: Int)(implicit s: Option[String] = None)
でも俺の脳じゃどういう利点があるのかはよく分からないな
154デフォルトの名無しさん:2010/06/19(土) 18:32:53
>153
利点は、シグネチャがどんどん複雑になって、Java厨にはったりをかませるとこ。
155デフォルトの名無しさん:2010/06/19(土) 18:43:08
そういうのいらない
156デフォルトの名無しさん:2010/06/19(土) 18:49:19
あんまりそういうのは関数原理主義者みたいで気が乗らないなぁ

ループを再帰に書き換えるのもそう思う。
157デフォルトの名無しさん:2010/06/19(土) 20:04:36
むしろ、これは関数型的なセンスではないよね
カリー化しておいて部分適用で使うわけじゃないんだから
Scala流ってことなんだろうなあ
158 ◆CgacaMDhSQ :2010/06/19(土) 20:44:44
>>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とか。
159デフォルトの名無しさん:2010/06/20(日) 10:08:51
>>158
正直それダサいと思うんだけど
関数リテラルの型推論ってよくわかんない
んだよね
怒られたら型を書くようにしてるけど、
なんで失敗するのかわからないと気持ち悪い
160 ◆CgacaMDhSQ :2010/06/20(日) 14:06:05
>>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の部分の推論は「同時に」(という表現が適切かどうかは微妙なところだけど)行われる
ために、関数リテラルの型推論をする時点で、関数リテラルの引数の型が確定してないので、エラーになる。

ちなみに、「前から順番に」ってのは、言語仕様書でそのように明示されてるわけじゃないんだけど、引数リスト単位で
型推論が行われてるってのはほぼ確実だと思う。
161デフォルトの名無しさん:2010/06/20(日) 19:06:00
なるほど、括弧を分けることで、先に型をバインドさせるわけね
ダサいという印象は拭えないが、
でも、テクニックとして、型パラメータを使って関数を引数にとる場合は、
カリー化させて関数の引数を後ろに回したほうがいいということはわかった
実際、foldLeftなんかもそうなっていると
しかし、結局これは関数の引数を常に分けるようになるよな
またRubyっぽい雰囲気になるな
162 ◆CgacaMDhSQ :2010/06/20(日) 21:56:56
>>161
ダサいというのは自分も同意。たぶん、もうちょっと頑張って推論すれば>>160の前者のような場合でもうまく
推論できそうだし。ただ、そうすると、推論できない場合とできる場合の境界がよりわかりにくくなるって
デメリットもあるといえばある。
現在の関数リテラルの型推論規則は割と簡単なので仕組みさえわかってしまえばそこそこ理解しやすいんだけど、
頑張って推論した場合の規則はかなり複雑怪奇なものになりそうな気がする
完全な型推論ができればいいんだけど、Scalaの型システムだと原理的に無理があるし…
163デフォルトの名無しさん:2010/06/21(月) 23:24:53
今からでも遅くない これから始めるScala(前編)
ttp://codezine.jp/article/detail/5193

Hello worldがコンパイルエラーになる解説記事を見たのは久しぶりだ。
164デフォルトの名無しさん:2010/06/21(月) 23:41:55
codezineか
165デフォルトの名無しさん:2010/06/21(月) 23:44:36
とりあえずyuroyoroさんが日本語キーボードを使っているということはわかりました
166デフォルトの名無しさん:2010/06/22(火) 01:04:28
なおったみたいだね
167デフォルトの名無しさん:2010/06/22(火) 01:21:26
Mission Complete !! ですって?
←も使えるぐらいだから、全角スペースも認識する。とかはなかったか。
ソースファイルのほうは日付古いままだったけど、試したら問題なく動いたよ。
168ゆろよろ:2010/06/22(火) 13:02:11
codezineの記事、修正しました。ご指摘有り難うございます。
恥ずかしくて体中の穴という穴から汁があふれそうになりました。

昨日は規制中で書き込めなかったので。
169デフォルトの名無しさん:2010/06/22(火) 14:37:34
codezineって、どういうノリで記事が決まるの?
編集部が「今はScalaが売れる!」って感じで企画立ててるの?
170デフォルトの名無しさん:2010/06/22(火) 18:34:19
ScalaとSpring:両世界のベストを一体化
http://www.infoq.com/jp/articles/scala_and_spring
171デフォルトの名無しさん:2010/06/23(水) 13:49:05
scalaはC#のイベントみたいな言語が標準で提供してるObserver パターンのやつはないの?
172デフォルトの名無しさん:2010/06/23(水) 20:25:38
>>171
言語レベルでというのは無い
でも、C#のeventのほとんどの機能はライブラリレベルで十分エミュレートできそうな気がするけど
どうなんだろう
173デフォルトの名無しさん:2010/06/23(水) 23:55:43
「はじめてのScala」 っていう本を本屋でちらりと見た。
http://www.kohgakusha.co.jp/books/detail/978-4-7775-1510-3

前半は、「はじめての〜」という内容で、飽き飽きした内容かもしれないけど、
後半2/3くらいが、「Rails風データベース・アプリケーション」 で、
XMLファイルの読み書きなど。

著者は、主婦らしい。


だれか、買った人いる?
174デフォルトの名無しさん:2010/06/24(木) 00:12:09
ボクらのScala ~ 次世代Java徹底入門 浅海 智晴
本屋で売っていたのでパラパラ見てみた。
まったくの初心者向けとしては悪い本では無いと思うが
それ以外の人はコップ本を読んだほうがいいと思った
175デフォルトの名無しさん:2010/06/24(木) 00:18:34
>>173のは作りながらみたいなよくある入門書だけど
>>174のはコップやScalaプログラミング入門の劣化版でしかなくてかなりどうでもいい感じだと思う
176デフォルトの名無しさん:2010/06/24(木) 00:21:01
やさしいなんちゃらの二の舞になりそうだな
177デフォルトの名無しさん:2010/06/24(木) 00:22:34
主婦頑張ってるな
178デフォルトの名無しさん:2010/06/24(木) 00:41:08
主婦はわりかし有名で評判がいい
工学社のシリーズが地味すぎてマイナーだけども
179デフォルトの名無しさん:2010/06/24(木) 01:03:37
Scalaの本、増えすぎだろ
仕事で使ってるやつはどんだけいるんだよ
180デフォルトの名無しさん:2010/06/24(木) 01:07:06
増えたらなんか問題あるのか
181デフォルトの名無しさん:2010/06/24(木) 04:52:59
馬鹿向けのScala本たくさん出して
そんなに需要あるのか?
182デフォルトの名無しさん:2010/06/24(木) 06:55:02
プログラム初心者が一番最初の言語としてどマイナーなscalaを選ぶケースは
ほとんど無いから実際は入門書はいらない。いきなりコップ本を読めばいい

コップ本の内容が難しくて理解できないならばscalaを学ぶための
周辺知識が欠けていると思われるのでscalaの入門書でなく
javaや関数型プログラミングの本を読んで基礎を固めたほうがいい
183デフォルトの名無しさん:2010/06/24(木) 08:20:25
確かに他言語の経験がある人の独学はコップ本で良いですね。
でも前提知識を要求するコップ本は教科書には向いていません。
ボクらのScalaはScala教科書の定番になると予想します。
184デフォルトの名無しさん:2010/06/24(木) 09:20:15
俺は一番難しい本が理解できる
それが解らない奴はバカ

こういうアドバイスはいらない
185デフォルトの名無しさん:2010/06/24(木) 10:56:18
翻訳が理解できない本が素晴らしいとか本末転倒してるよな
翻訳自体は、その本の価値をがんばっても保つくらいにしかできず、普通は減ずるというのに
186デフォルトの名無しさん:2010/06/24(木) 11:21:49
入門書たたいてる奴は、入門書がないからいつまでたっても玄人向けのマイナー言語だという発想はないんだろうか。
187デフォルトの名無しさん:2010/06/24(木) 11:46:14
>>185
日本語で
188デフォルトの名無しさん:2010/06/24(木) 12:24:11
素人向けにするにはまだちょっと早いと思う
189デフォルトの名無しさん:2010/06/24(木) 12:59:23
そうやって言い訳して排除排除かね
190デフォルトの名無しさん:2010/06/24(木) 13:24:48
結局足の引っ張り合いなんだよな、日本人は
191デフォルトの名無しさん:2010/06/24(木) 13:33:14
じゃあ、今度ニュー速にプログラミング入門スレが立ったら、
「スカラっていうのが簡単でVBよりもいいらしいよ!」とか
しれっと書いてくる!
192デフォルトの名無しさん:2010/06/24(木) 13:39:54
はいはい
ワッフルワッフル
193デフォルトの名無しさん:2010/06/24(木) 22:53:58
むしろコップ本より詳しい本を誰か書いてくれ
194デフォルトの名無しさん:2010/06/24(木) 23:06:50
言いだしっぺの法則
195デフォルトの名無しさん:2010/06/24(木) 23:21:40
いや、2.8用コップ本が先だろ。
196デフォルトの名無しさん:2010/06/24(木) 23:29:34
そいやオライリー・ジャパンからはscala本まだ出てねーんだな
197デフォルトの名無しさん:2010/06/24(木) 23:46:33
オライリーは偏ってるから
PHPやPostgreSQLなんかも日本語のはずっと出なかった
198デフォルトの名無しさん:2010/06/25(金) 00:44:56
オライリーは表紙に悪意を込めたりするねw
199デフォルトの名無しさん:2010/06/26(土) 04:29:25
個人的には、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]

のようなエラーが出てしまってコンパイルできませんでした。

色々いじってみたのですが解決せず・・もし分かる方いらっしゃったら
ご教示いただけないでしょうか。
お願いします><
201デフォルトの名無しさん:2010/06/26(土) 20:45:19
202pomu0325:2010/06/26(土) 21:04:05
>>200
201のurlにも書かれてますが、implicit defで戻り値の型明示するか、implicit defを宣言しているobjectのimportを後で書けばよいようです。
203pomu0325: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も要りそう。
205デフォルトの名無しさん:2010/06/27(日) 23:08:35
implicit 使う奴って、保守性とか考えてんの?
206デフォルトの名無しさん:2010/06/28(月) 09:49:41
>>205
保守性を考えないのが、関数型プログラミングだ
207デフォルトの名無しさん:2010/06/28(月) 13:28:00
んだよねー
俺もScala勉強し始めてから気がついたわ
Perl並だってのに
まぁ昔ちょっとSchemeやってたんだけどそんな長いの書いたこと無かったし
208デフォルトの名無しさん:2010/06/28(月) 14:15:28
そんな事言い始めてもどうしようもないだろ。スクリプト言語なら型が動的に変わるのが当たり前なんだから。だからって、それがダメてわけじゃない。
209デフォルトの名無しさん:2010/06/28(月) 14:17:07
誰もスクリプト言語とか動的とかの話してないけど
関数型言語の保守性が悪いってだけの話で
210デフォルトの名無しさん:2010/06/28(月) 18:11:39
>>206
>>209

なんで関数型だと保守性悪い(悪くなる)の?
最初205でimplicitと使うやつは保守性考えているのか?って言う話だったのに。
議論が全く見えてこないんだが・・・。implicitと関数型の関係は?
211 ◆CgacaMDhSQ :2010/06/28(月) 18:18:12
問題点が混ざってる気がする

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なオブジェクトが共有される事について悩まなくて
済むのは大きい。
212デフォルトの名無しさん:2010/06/28(月) 18:25:33
いや、関数型の保守性はいいとは言えんだろ流石に。
Perlよかマシだけど。
213デフォルトの名無しさん:2010/06/28(月) 18:27:14
>>211
2.8のコレクションライブラリみたいにトリッキーな事

あれは一体どうなっているんだ?
ある程度ソースコード追ってみたけど理解出来ない・・・org
別に使う分には全部理解する必要もないのか?
214デフォルトの名無しさん:2010/06/28(月) 18:27:23
implicitを多用してDSLっぽく使えるライブラリがあるとして
そのライブラリ自体のコードの保守性はさがるけど
そのライブラリを使用して書かれたコードは読みやすかったりして保守性が上がったりするんでそ?
215デフォルトの名無しさん:2010/06/28(月) 18:47:23
関数型だから保守性がいいというのは妄想
規約がなければどの言語でもほぼ同じ
216 ◆CgacaMDhSQ :2010/06/28(月) 20:15:56
>>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
言語というよりプログラミングパラダイムの話をしているつもりだったんだけど、違うのかな?言語の話を
しているのだったら、関数型言語だから保守性がいいってのは確かに妄想だと思う。でも、どの言語でも
同じってのは極論に過ぎるだろう。
217デフォルトの名無しさん:2010/06/28(月) 21:13:31
関数型というかクロージャを多用した他人のコードは読みにくく感じる
名前が不足してるせいだと思ってる
218デフォルトの名無しさん:2010/06/28(月) 21:49:42
>>215
規約があろうとなかろうと、
Prologの方がCOBOLよりは保守性はいいよ。
219デフォルトの名無しさん:2010/06/28(月) 21:54:26
implicit conversionでドキュメント化されてないから訳分からんと言えば、
Liftの事ですな。
220デフォルトの名無しさん:2010/06/28(月) 22:26:20
そこでCOBOL持ってくるのがなんというか
221デフォルトの名無しさん:2010/06/28(月) 23:30:15
プログラム仕様書がない昨今、可読性が保守性を作用するという前提で、
関数言語の特徴である、構文拡張みたいな事を頻繁にされると、読みにくいのではと、
軽い気持ちでかいてしまいました。
すいませんでした。
222 ◆CgacaMDhSQ :2010/06/28(月) 23:44:09
>>221
関数型言語で(具象)構文拡張の機能を標準で持ってるのなんてごく一部だよ
そこそこ名前が知られてる言語の中だと
OCaml(Camlp4),Common Lisp(リーダーマクロ等)くらい?
Template Haskellは標準で持ってるかというと微妙か。あと、Common Lispを関数型言語扱いしていいのかはわからん。
いずれにしても関数型言語の特徴とは言えないのは確か。

で、関数型プログラミングの特徴はというと、色々意見はあるだろうけど、最大公約数的には
不変データ構造と高階関数を多用したプログラミングスタイル、というところだと思う。で、どちらもよほど
変な使い方しなければ可読性は下がらないというかむしろ上がると思うんだけどなあ。
223デフォルトの名無しさん:2010/06/29(火) 00:49:50
関数型プログラミングの威力をみよ!

flip (.) h . ((.) . (f . g))
224デフォルトの名無しさん:2010/06/29(火) 01:24:09
メンテナンス性わりー
225デフォルトの名無しさん:2010/06/29(火) 01:31:37
>>216
例えばSICPでは銀行口座が取り上げられているが、
状態を明示的に操作するパラダイムのほうが、
自然なモデル化を実現できる場合もある

関数型で自然に書けるのであれば、関数型で書くことが勧められるとは思う
というより、効率とかの要求がない限り、わざわざ環境をいじる必然性がない
環境の破壊がないコードは挙動を推論しやすい

関数型かどうかと保守性はあんまり関係ないと思う……
むしろモジュールシステムとか、名前をうまく分ける機能が重要だったりするから
226デフォルトの名無しさん:2010/06/29(火) 12:00:05
そういうのを保守性が悪いと思うなら、Javaを使っておけば良いんだ。
227デフォルトの名無しさん:2010/06/29(火) 13:01:07
>225
他人のソースを読む時には名前、識別子が手がかりなのに、
一見しただけでは名前が出てこないimplicit conversionは超最悪ですよね。
228デフォルトの名無しさん:2010/06/29(火) 13:12:17
関数型に文句を言いたいのか
Scalaに文句を言いたいのかはっきりしてほしい
>>225は関数型の話でしょ

あと、暗黙の型変換はObjectをimportしなきゃいけないから、そんな驚くようなことにはならないよ
229デフォルトの名無しさん:2010/06/30(水) 11:17:32
文句を言いたいとかじゃなくてさ、どうしても必要な時以外は使うべきじゃない機能だ
って話でしょ? gotoとか、演算子オーバーロードみたいなレベルで。

twitterさんもコーディング規約で禁止してるの?
230デフォルトの名無しさん:2010/06/30(水) 17:27:40
そろそろEffective Scalaが欲しいな
231デフォルトの名無しさん:2010/06/30(水) 21:23:41
Liftでセッション毎の情報を持たせるのって
どうやったらいいですか?
232デフォルトの名無しさん:2010/07/01(木) 02:45:36
>231
net.liftweb.http.SessionVar でいいんじゃないの?
javax.servlet.http.HttpSession を直に呼び出す事も出来たはずだけど。
233デフォルトの名無しさん:2010/07/01(木) 02:50:17
RC7きたぁ〜〜〜w

http://www.scala-lang.org/node/6881
234231:2010/07/01(木) 10:50:35
>>232
ありがとうございます。
SessionVarでできました。
235デフォルトの名無しさん:2010/07/01(木) 11:48:23
2.8.0 finalまだぁ〜待ちくたびれた(ry
236デフォルトの名無しさん:2010/07/01(木) 13:08:42
次は、確実にRC8
237デフォルトの名無しさん:2010/07/01(木) 14:10:04
開発者はRCの意味解ってるのか
238デフォルトの名無しさん:2010/07/01(木) 14:27:29
>>237
Remainder of Cloverでしょ。
そんくらい、中卒の俺でも知ってるw
239デフォルトの名無しさん:2010/07/01(木) 18:05:02
>>237
当然わかってるだろうけど
ユーザ数が増えてきて今までのプロジェクトの運営方法ではうまく回らなくなってるんだろう(たぶん)
RCの番号が増え続けてるのも、RC出た後に大きなバグが見つかる→フィックスの繰り返しが起きてるからだし

あとは最初のRCがScala Daysにあわせたものであって品質があまり良くなかったのが響いてるというのもあるかも
240デフォルトの名無しさん:2010/07/01(木) 18:28:23
RCはReleaseCitainaの略
241デフォルトの名無しさん:2010/07/01(木) 19:48:32
>>240

(とりあえずバグあるけど) ReleaseCitemimasita の略
242デフォルトの名無しさん:2010/07/01(木) 20:11:14
業務で使いたいんだが…まだ早いかな?
243デフォルトの名無しさん:2010/07/01(木) 20:18:35
>>242
どうなんだろうねぇ

社内でのJavaで作ったシステムに、ちょっとscalaを混ぜて使ってるけど。
244デフォルトの名無しさん:2010/07/01(木) 20:44:31
正直、コンパイラのバグが怖いなあ
245231:2010/07/01(木) 22:24:43
国内でのそれなりの規模の採用例って
特許を検索するやつ?以外にどこかあります?
246デフォルトの名無しさん:2010/07/01(木) 23:07:08
一定規模以上だと長期のメンテナンスが怖いな。
結構仕様変わってるし。
自分用の小規模コード用なら好きなんだが。
247 ◆CgacaMDhSQ :2010/07/01(木) 23:50:14
>>244
コンパイラのバグについては、特定のコード書くとコンパイラがクラッシュする系の
バグはたまに見つけることがあるけど、計算結果が間違ってるとかそういう系のバグは、安定版(2.7.7)では
まず遭遇しないと思う。0ではないけど、実験的な機能(-Yオプション系の奴)やよほど変態的なコード書かない限りは
それほど恐れることも無いかと。2.8も正式リリースが出たら、安心して使って大丈夫じゃないかな。現状のRC7
でもまず大丈夫だとは思うけど。
248 ◆CgacaMDhSQ :2010/07/01(木) 23:58:59
あとは、既に国外ではTwitterとかLinkedInとかFoursquareとか結構有名なサービスが採用してる
事例もあるし、EDF Tradingみたいな、ちょっとミスが多大な損失につながるクリティカルな現場での採用事例も
あるので、その辺もまあ安心材料になるかな。どちらかというと問題は採用したとしてScala技術者をどんだけ確保
(育成)できるかってところじゃないかねえ。パテントビューロ(上の特許を検索するシステム作ったとこ)の人の
http://qcontokyo.com/pdf/qcon_TakashiMiki.pdf
発表スライドは、実際にScala導入してみようかと考えている人にとっては結構参考になると思う。単なる宣伝だけじゃなくて
実際に採用してみてリプレース前の既存システムでコード量にどれくらい違いが出たかとかの比較もあって結構面白い。
249デフォルトの名無しさん:2010/07/02(金) 00:19:36
こういうのもなんだがll言語よりはちゃんと動くイメージがある

実際にはライブラリのバグの方が日常茶飯事だから気にならない
250 ◆CgacaMDhSQ :2010/07/02(金) 00:33:27
>>249
LL系言語は実行環境も自前で持ってるから、足回りはJVMという安定した実行環境が使える
Scalaなどの言語に比べるとどうしても劣る部分はあるだろうねえ。Twitterがバックエンドを
RubyからScalaに切り替えたのもGCの性能が悪いのが問題の一つだったらしいし。
251デフォルトの名無しさん:2010/07/02(金) 04:28:21
Lift 2.0 age
252デフォルトの名無しさん:2010/07/02(金) 08:37:25
細かいところばっかりだけどね
gcもそうだけど
llだとcと連動するところでトラブルが起きがちなんだよね
文字列をうまく処理できない場合があったり、リソースロックしていたり
それがjvm内で完結しているとトラブルが少ないしデバッグもしやすい
253デフォルトの名無しさん:2010/07/02(金) 09:00:46
foursquare.comでも、LiftのAjaxによるGC回避のpingをやってるんだね。
200秒ごと?
あれは、大きなサイトでも大丈夫なのかなとちょっと心配な仕様だったんだけど。
254デフォルトの名無しさん:2010/07/02(金) 14:06:51
>251
LiftScreenとWizardは面白そう。
タグレベルで細かくいじろうとすると、めんどくさいのかもしれないけど。
http://liftweb.assembla.com/wiki/show/liftweb/Lift's_Screen
255デフォルトの名無しさん:2010/07/04(日) 10:09:13
アンドロイド上でscalaのインタプリタって動くの?
256デフォルトの名無しさん:2010/07/04(日) 17:01:48
動くよ
257200:2010/07/05(月) 10:13:55
お礼遅れてすいません、レスありがとうございます。
ブログの記事の方までレスくださったようで・・ありがとうございましたm(_ _)m

>>org.apache.http.Header -> com.google.appengine.api.urlfetch.HTTPHeader
>>するimplicitも要りそう。

これがやっぱり必要なようですが・・まあ分かってません。
自分でも調べていますが、分かる方いらっしゃったら教えてくださると幸いです。
ありがとうごじましたm(_ _)m
258デフォルトの名無しさん:2010/07/05(月) 13:50:40
>>257
implicit def h2h(h: Header) = new HTTPHeader(h.getName, h.getValue)

試してないけどこれを追加したら動くかも。
間違ってたらごめん。


259デフォルトの名無しさん:2010/07/06(火) 12:15:53
Scalaは短命だったな
覚えて損したわ
260デフォルトの名無しさん:2010/07/06(火) 12:25:56
次の言語、頑張って覚えてね
261デフォルトの名無しさん:2010/07/06(火) 18:11:00
すげー期待してたのにD言語みたいになってきてちょっとショック
262デフォルトの名無しさん:2010/07/06(火) 20:43:05
なにいってるんだ
D言語はバイブルが出てこれから大攻勢に

出るといいな
263デフォルトの名無しさん:2010/07/06(火) 23:14:33
>>261
D言語みたい、ねえ…どのへんが?
264デフォルトの名無しさん:2010/07/06(火) 23:23:50
既に翻訳も含めて日本語のScala本が5冊出てるし
Twitter,foursquare,LinkedIn,などそれなりに知名度があるサービスのScala乗り換え事例
も増えてきてるしそんなに悪い状態とも思わないけどな
265デフォルトの名無しさん:2010/07/06(火) 23:44:41
知名度が出たときに一気にブレイクできなかった言語は衰退するのみ
266デフォルトの名無しさん:2010/07/07(水) 05:08:19
いいんじゃないの、Lispみたいにしぶとく生きてれば
267デフォルトの名無しさん:2010/07/07(水) 06:31:56
>>263
仕様変えてRC出し続けてるところが
268デフォルトの名無しさん:2010/07/07(水) 16:12:58
>>267
2.8の仕様はもうfixされてるはず。RC上がり続けてるのは主としてバグ修正目的
RC1→RC2で継続プラグインが入ったりspecializationが入ったりしてるがこれは元々
2.8で入る予定のものでRC1でまだ入ってなかったというだけの話だし

そんなんでRC出しちゃったのがまずかったというならその通りではあるんだが
269デフォルトの名無しさん:2010/07/07(水) 18:30:43
Scalaの求人と普及中のスクリプト言語の求人を比べてみました。

Scalaの普及が始まってからまだ1年ちょっとしか経っていません。
http://www.indeed.com/jobtrends?q=Scala
Groovyの普及はScalaより1年半ほど先行しています。
http://www.indeed.com/jobtrends?q=Scala,Groovy
Rubyの普及はGroovyより4年半ほど先行しています。
http://www.indeed.com/jobtrends?q=Scala,Groovy,Ruby
Pythonの普及はRubyより2年ほど先行しています。
http://www.indeed.com/jobtrends?q=Scala,Groovy,Ruby,Python

Scalaの普及は続いており、短命だったは事実に反します。
一気にブレークできなかった言語も普及が続き、衰退していません。
プログラミング言語の普及には何年もかかるのです。
270デフォルトの名無しさん:2010/07/07(水) 18:33:59
他のヒットしなかった言語も同じ事言われてたけどね
本当に必要とされてる言語はJavaやPHPみたいにグイっと来るんだよ
271デフォルトの名無しさん:2010/07/07(水) 18:56:53
Cは普及するまでにかなり時間かかったけどな
本格的な普及がANSI C以降とするなら20年前後ってとこか
272デフォルトの名無しさん:2010/07/07(水) 20:12:07
PHPの普及はPythonより2年ほど先行しています。
http://www.indeed.com/jobtrends?q=Scala,Groovy,Ruby,Python,PHP
PHPは安定成長を続ける事でシェアを取りました。

Javaの方は確かに一気に普及しました。
http://www.indeed.com/jobtrends?q=Scala,Groovy,Ruby,Python,PHP,Java
Javaが一気に普及したのは主要プレイヤーがJavaを支持したために
Javaが次の主流言語になると信じた人たちがたくさんいたからでしょう。
LinuxもIBMがRedHatに出資したのがきっかけで普及しました。
JavaよりScalaの方が間違いなく生産性と保守性が高いとされるようになれば
Scalaが大手の支持を受けて一気に普及する目もあるでしょうね。
273デフォルトの名無しさん:2010/07/07(水) 20:17:54
Scalaは保守性が低いからなあ。
274デフォルトの名無しさん:2010/07/07(水) 20:36:51
>>273
煽るわけじゃないけどどの部分が?
275デフォルトの名無しさん:2010/07/07(水) 20:40:02
Javaが急速に普及したのはWebという新しいプラットフォームが登場した事による
UnixでC、WindowsでVBが普及したのと同じ
Linuxが普及したのは十分な性能を持ち安価な1Uラックマウントサーバが登場した事による
同じ土俵で生産性や保守性を理由に後発の言語が普及した例はほとんどないのではないか
DelphiはVBより評価されていたようだがVB以上に普及することはなかった
276デフォルトの名無しさん:2010/07/07(水) 20:44:19
数少ない例外がC→C++かな
Scalaもそうなればいいけど
277デフォルトの名無しさん:2010/07/07(水) 20:48:29
>>275
Rubyがここ数年で普及したのは、Perlと比べたときの生産性や保守性が理由
(もちろん、Railsというフレームワークがあったのが大きいけど)だと思うけど、どうなんだろう…
278デフォルトの名無しさん:2010/07/07(水) 20:53:01
>Perlと比べたときの生産性や保守性

あんま変わらんな
フルビルドだとインストール失敗するし
gemとか糞だし
279デフォルトの名無しさん:2010/07/07(水) 20:54:45
> フルビルドだとインストール失敗するし

そういう問題があるならバグレポートしてくれよ
280デフォルトの名無しさん:2010/07/07(水) 21:10:47
>>276
Cの普及時期から見るとC++の登場は後発と言うほど遅れていない
ANSI C制定(89年)と同時期にARM(The Annotated C++ Reference Manual, 90年)が出された
特にWindowsでは普及期(3.1〜95)にVisualC++の影響でCをやらずにいきなりC++の方が普通だった

>>277
非エンタープライズという意味でのWeb2.0というプラットフォーム(というより顧客/マーケットか)の
登場(拡大)が影響したのではないか
281デフォルトの名無しさん:2010/07/07(水) 21:30:11
現時点で新しめのプラットフォームというとクラウドとスマートフォン
もしiPhoneアプリがScalaでしか作れなかったら・・・
クラウド特にGAEはまだチャンスがあると思う
GAEに特化した有力なフレームワークがあればScalaは普及するのではないか
282デフォルトの名無しさん:2010/07/07(水) 21:45:18
>>281
言う通り、GAEは狙い目かもね
Scalaの表現力を生かして、BigTableへのアクセスとかが簡単にできる良い
Webアプリフレームワークがあれば…
283デフォルトの名無しさん:2010/07/07(水) 21:50:38
GAEならScala + Slim3でどう?
284デフォルトの名無しさん:2010/07/07(水) 21:51:41
Slim3はAPT使ってるせいでScalaと相性が悪い
285デフォルトの名無しさん:2010/07/07(水) 22:01:14
おまいら GAE に夢見すぎ
286デフォルトの名無しさん:2010/07/07(水) 22:08:35
まぁGAEが現状のScalaよりも遙かに普及してくれないと意味がない話ではあるな
287デフォルトの名無しさん:2010/07/07(水) 22:25:45
>274
「有るから使う」程度の理由でimplicit使う奴が大量に居るから。
288デフォルトの名無しさん:2010/07/07(水) 22:35:34
このスレってずっと暗黙の型変換で粘着されてるけど、そんなに嫌なら使うの禁止すれば?としか言いようがない

上のほうでgotoに例えられてるけど、よく知らないやつの怯えっぷりは似てるかもしれない
暗黙の型変換はgotoほど必須ではないと思うが
289デフォルトの名無しさん:2010/07/07(水) 22:49:44
>>288
確かに。なんでこんなに(implicitに)怯えてるのか不思議でならない。
まあ使い方間違えれば可読性に負の影響を及ぼすことはあるけど、別にんなのはimplicitに
限った話じゃないしなあ…
290デフォルトの名無しさん:2010/07/07(水) 22:56:45
怯えるとかそういう大げさな話じゃない。
濫用気味でしょと言ってるだけ。
291デフォルトの名無しさん:2010/07/07(水) 23:00:02
そんなやつが大量にいるようには感じないけど
どちらにせよ規約で縛ればおkな話だな
292デフォルトの名無しさん:2010/07/07(水) 23:19:47
rubyとかで動的にメソッドがばりばり作成されたりするのとかと比べれば
implicitなんか明快すぎて楽勝だろ
変だなと思えば、簡単に調べられるし
293デフォルトの名無しさん:2010/07/07(水) 23:24:51
まあ、怖がっているのはJava層かPHP層だろうな
PerlとかRuby使っているやつがこんなんでうだうだ文句言うとは思えない
294デフォルトの名無しさん:2010/07/07(水) 23:58:28
C++やJavaはimplicit is evilって思想だからなぁ

そこでできるだけexplicitにしてみたらキーパンチが多すぎて収拾が付かなくなったってのが
ここ10年の歴史だとは思うんだけどね。
295デフォルトの名無しさん:2010/07/08(木) 00:07:22
C#の変化の歴史を見ても、「外向けにはexplicit、内向けにはimplicit」が
今の流行じゃないのか?
296デフォルトの名無しさん:2010/07/08(木) 00:11:12
一方歴戦のVBプログラマはoption explicitを使った
297デフォルトの名無しさん:2010/07/08(木) 01:12:40
>>293
Rubyでもevalやリフレクションの濫用が問題になってた(なっている)
強力な機能は使い方を誤るとエライことになる
そこで最近は「ここぞという所にだけ使え」って原則が普及してきたように感じる

まあScalaについては、まずは濫用が問題視されるぐらい
普及してからの話じゃなかろうか
298デフォルトの名無しさん:2010/07/08(木) 01:27:35
もしそう言うのが大々的に問題になったらIDEの機能でimplicitな所は分かりやすく色を変えたりして表示したりみたいな機能がつくんじゃね?
299デフォルトの名無しさん:2010/07/08(木) 01:30:52
だから怖がりすぎだって
evalとかそういう次元じゃないから
300デフォルトの名無しさん:2010/07/08(木) 09:21:54
>>277-278
Rubyメインで使っているけど、言語の良し悪しを置いておくなら、
ライブラリが数そろっててメンテされてて、
優秀な技術者がやとえる(というかもうそういう人しか残ってない予感がする)であろうPerlは
まだまだいけるように見える

RubyはRailsである壁を超えて広まりはしたけど、
ぶっちゃけると他にいいフレームワークがあったら移るような人たちばかりだろ、今使っているのはw

Perlの優秀な技術者どこで見つけてくるんだよって?Rubyも似てるだろ?w

保守性?依存性ごっちゃなgemやらバージョンあげるとすぐに動かなくなるgem郡、
下位互換性もすぐに切り捨てられ常に変わり続けるRailsや周辺プラグイン

「Railsの生産性が高い」と行った場合、結局はwebアプリの開発にどのくらいなれているかで決まってくるし。
(公平に既存の資産がない、という前提)
少なくとも、ふだんRuby書いている奴が、Rails使ったからって簡単にwebアプリ作れない。
だからといって他の言語から乗り換えたい奴は、よっぽど不満なやつだけ。
そういう奴らも、すぐに目移りする。


ようするに仕事だとphp最強!!
301デフォルトの名無しさん:2010/07/08(木) 09:25:48
Rubyメインでのくだりが繋がってないな、失礼。独立した別の行段落と考えてくれ
302デフォルトの名無しさん:2010/07/08(木) 10:17:05
仕事メインはC++で、
週末にrailsで遊んでみたが
毎週gemは動かないし、アップデートするのに半日つぶれる
かといってバージョン固定したらバグやセキュリティーホールは直らないし
で、使うの諦めた

かと言ってC++でwebやる気は起きない
なのでscala+liftに逃げてきた
303デフォルトの名無しさん:2010/07/08(木) 10:26:23
Rubyの話題はもういいよ
ここで長文書くことないでしょ
304デフォルトの名無しさん:2010/07/08(木) 10:28:27
次はRC8?それとも正式リリース?
305 ◆CgacaMDhSQ :2010/07/08(木) 18:12:23
>>304
scala-internalsを読んだ限り、これ以上クリティカルなバグが報告されなければ
正式リリースされそうな感じ。
306デフォルトの名無しさん:2010/07/08(木) 23:42:12
scala1のeclipseプラグインって現状galileoかGanymedeしか対応してなかったという認識だが、
Heliosに対応する予定はあるのか?
もしくはHelios飛ばしてM4のほうが先とか?
307306:2010/07/08(木) 23:48:03
>scala1のeclipse
なぜかscala1とかいうわけわからないタイプミスしたが気にしないでくれ
308デフォルトの名無しさん:2010/07/09(金) 01:00:19
公式サイトにもうすぐへリオス対応するって書いてある
309306:2010/07/09(金) 02:12:57
>308

そうなのか。ありがとう
310デフォルトの名無しさん:2010/07/09(金) 09:19:44
現時点でScalaを書くのに一番良いIDEって何かな?
自分はIntelliJのCEを使ってるんだけど。
311デフォルトの名無しさん:2010/07/09(金) 10:32:57
このスレの人たち的にはrustってどうなの
312デフォルトの名無しさん:2010/07/09(金) 18:56:50
最近EmacsでENSIME + sbt使ってるよ
・補完
・定義ジャンプ
・カーソル位置の変数の型推論
・flymakeっぽい自動コンパイルチェック
くらいはできるよ
Emacs派にはおすすめ
313デフォルトの名無しさん:2010/07/09(金) 19:35:35
>>312
EMSIME、割と評判いいねえ。EclipseのScalaプラグインの出来が
イマイチだから、いっそのこと乗り換えようかな…
314デフォルトの名無しさん:2010/07/09(金) 19:36:02
typoしたorz EMSIME→ENSIME
315名無しさん@そうだ選挙に行こう:2010/07/10(土) 14:55:31
scalaでスクリプトを実行するときの起動時のオーバーヘッドを減らすのってどうやるんでしたっけ?
2年ぐらい前に記事で読んだことがあったような気がして本家を探してみたんですが、見つからなかったです。
もしよろしければ、やりかたかリンクを教えてもらえないでしょうか。
よろしくお願いします。
316名無しさん@そうだ選挙に行こう:2010/07/10(土) 16:22:08
ちょうど昨日見てたけど、URLがみつからない。
Xshare:dumpとかコンパイルしたらどうだみたいな話だったよね?

とりあえず。

Javaアプリを高速起動する方法「JRubyテク」
http://journal.mycom.co.jp/news/2010/03/04/009/index.html

nailgunは、scala-2.8.0-rc5だと、いまのところ使えてない。
Xshare:dumpは、32bit -client用みたい。
317名無しさん@そうだ選挙に行こう:2010/07/10(土) 16:27:12
318名無しさん@そうだ選挙に行こう:2010/07/10(土) 16:36:22
-savecompiled の話か
319名無し~3.EXE:2010/07/10(土) 17:46:17
下記の、どれが存在する言語なのでしょうか?
C+−、C−+、C−−
320名無しさん@そうだ選挙に行こう:2010/07/10(土) 18:00:04
>>316-318
ありがとうございます。
nailgunはちょっと面倒で、-savecompiledは初回が遅いこととjarファイルが作られてしまって邪魔なのが欠点ですね。
ちょいnailgunについて調査してみます。
321名無しさん@そうだ選挙に行こう:2010/07/10(土) 18:42:19
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 メインクラス名
322名無しさん@そうだ選挙に行こう:2010/07/10(土) 19:06:38
test
323名無しさん@そうだ選挙に行こう:2010/07/11(日) 16:41:26
>>294
そんな歴史は無いだろ。
吠えてたのはLL信者だけじゃん。
324デフォルトの名無しさん:2010/07/12(月) 12:01:40
にゃー
325デフォルトの名無しさん:2010/07/12(月) 21:11:52
タプルを引数に渡したいとき、どうするですか?
val xy = (1,2)
def f(i:Int,j:Int): Int = i+j
f(xy) //ここ!
326 ◆CgacaMDhSQ :2010/07/12(月) 21:15:31
>>325
その場合、残念ながら直接渡せないので、
f(xy._1, xy._2)
のようにするしかない。タプルを直接渡せるメソッド(関数ではなく)を定義するには、
def f(ij: (Int, Int)): Int = ij match { case (i, j) => i + j }
みたいに書くしかないけど、これはこれでめんどいし。

タプルを引数に取るメソッドと複数引数を取るメソッドが同じじゃないのはJavaの
calling conventionにあわせた結果なんだろうけど、うっとおしいよねえ。
327デフォルトの名無しさん:2010/07/12(月) 21:21:39
あと、
val (x,y) = (1,2)
ならいいのに、
private val (X,Y) = (1,2)

not found: value X
って怒られるのはなぜですか?
328デフォルトの名無しさん:2010/07/12(月) 21:32:17
なにー!
大文字と小文字で違うのかっ!
329デフォルトの名無しさん:2010/07/12(月) 21:33:00
とりあえず326さん、ありがとうございます。
330 ◆CgacaMDhSQ :2010/07/12(月) 21:48:27
>>327
パターンマッチングの仕様。
パターンの名前が大文字で始まる場合、未束縛の変数ではなく、その名前の値が
既に存在しているとみなされて、その値に対するパターンマッチが行われる。
つまり、
val (X, Y) = (1, 2)
の場合は、Xと1、Yと2が同じかどうか比較されるってこと。
331デフォルトの名無しさん:2010/07/12(月) 22:07:10
>>330
何故にこんな仕様?
332デフォルトの名無しさん:2010/07/12(月) 22:10:20
def f(a: Int, b: String) = ...
val tuples = ...
tuples.map { t => f(t: _*) }

みたいなことできればいいのに。
333 ◆CgacaMDhSQ :2010/07/12(月) 22:22:31
>>331
何故かという事に関しては直接は知らないのだけど(MLを検索すると出てくるかもしれないが)、
この仕様のメリットとしては

1.構文解析が簡単にできる
2.パターン名のtypoが検出できる

という二点があると思う。たとえば、仮に存在しない変数名がパターン部に記述されたら変数パターンだ
という仕様だったとする。すると、match式などの構文解析をするために構文解析時にいちいち変数表などを
もって回るか、構文解析の処理の一部を意味解析に回すことになる。一方、大文字小文字かで区別する
なら、そのような面倒な処理なしに変数パターンが値パターンかを簡単に区別できる。これが一点目。

二点目としては、たとえば、
x match { case R => ... }
のつもりが、誤って
x match { case T => ... }
としてしまった場合、大文字小文字で判定している場合、Tという値は存在しないというエラーを
出すことができるが、存在しない名前が現れたら変数パターンとみなすという仕様だと、Tという
変数が新しく定義されて正しくコンパイルされてしまい、エラーに気づかない可能性がある。
334デフォルトの名無しさん:2010/07/12(月) 23:38:45
>> 325

Function.tupled(f _)(xy)

でどうでしょうか
335デフォルトの名無しさん:2010/07/13(火) 20:17:35
シングルトンオブジェクトを
その名前の文字列から取得するにはどうしたらよいでしょうか?
336 ◆CgacaMDhSQ :2010/07/13(火) 23:07:14
>>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") }
}
337335: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
ってファイル名になるよね?それの変換まで実装したら大変だな・・・
339 ◆CgacaMDhSQ :2010/07/14(水) 02:48:49
>>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))
}
}
341 ◆CgacaMDhSQ :2010/07/14(水) 14:10:27
>>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)
}
}
342デフォルトの名無しさん:2010/07/14(水) 14:25:05
すげー。聞かないとまったく分からなかったです!
(通らないコード書いてすみません。ご推察の通りです。)

あと、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)
343デフォルトの名無しさん:2010/07/14(水) 16:08:32
こんどはこれで引っかかった・・・。
初めて数日なので、エラーに対してまったく勘が効かなくって困っています。
しばしご教授願います。
検索するに、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
344 ◆CgacaMDhSQ :2010/07/14(水) 17:16:28
>>343
ひょっとしてC++ or D系の言語から来た人かな?
JavaやScalaなどの言語では、型パラメータが持っている演算を
制約として明示しないといけない事になっている。この例だと、型パラメータTが+メソッド
を持っていることを、コンパイラは知らないので、怒っちゃうわけだ。required: Stringって
出るのは、T + Stringという文字列連結だと解釈しようとしてそれに失敗しちゃうからだね。

で、解決策だけど、大きく分けて二つあって
1.implicit conversionを使う
2.implicit parameterを使う
のどちらかになる。
345 ◆CgacaMDhSQ :2010/07/14(水) 17:25:11
まず、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以外にも余計なオブジェクトが生成されるので、
メモリにあまり優しくない。
346 ◆CgacaMDhSQ :2010/07/14(水) 17:33:29
次に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)
}
}
347 ◆CgacaMDhSQ :2010/07/14(水) 17:36:11
ちなみに、今回の例の場合、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本を買うなりしてください。
348デフォルトの名無しさん:2010/07/14(水) 17:37:07
> ひょっとしてC++ or D系の言語から来た人かな?
はい、その通りでございます。
Swing使いたいけど、Javaはヤダっていうわがまま。

def +(that:Point[U]): Point[T] = Point[T](x+that.x,y+that.y)
と書いてみて「Uなど存在しない」と怒られたり・・・(トホホ)。
やっぱJava系の型計算をよく分かってないせいでしょうかね。
標準で使えるオブジェクトの種類が多すぎて的を絞れていないです。

> で、解決策だけど
手元にコップ本はあるので、そこら辺をよく読んでみます。
毎度大変助かります。
349デフォルトの名無しさん:2010/07/14(水) 17:41:18
うわ、返信書いてる間に・・・。
親切すぎる!
350デフォルトの名無しさん:2010/07/14(水) 17:57:11
おぉ、コップ本21章は必読ですね。implicitマジックやな、これは。

implicit def 名前テキトー(x:Double) = x.toInt
を勝手に探しにいったりするわけですか。
・・・うかつな使いかたをするとエラーの所在を当てるのが難しくなりそうですね。
351デフォルトの名無しさん:2010/07/14(水) 19:27:27
コップ本の31章の一番最後(573ページ)に、

>パーサー生成でLALR(1)のような効率のよい解析アルゴリズムが使える。・・・(途中略)
>誰かがそのようなジェネレーターを作れば、それは標準Scalaライブラリーに簡単に統合できるだろう。

とか書いてあるけど、誰か作ってる人いるの?(もしくは実はもう出来てるとか?)

これは著者は作る気ないけど"誰か作ってくれないかなぁ〜"ってことなのかな?
352デフォルトの名無しさん:2010/07/14(水) 22:18:17
もうすぐ2.8が正式リリースされるだろうけど
コップ本の内容って役に立つよね?
買おうかどうか悩んでる。
353デフォルトの名無しさん:2010/07/14(水) 22:23:38
>>352
9割以上はそのままじゃなかろうか。
354デフォルトの名無しさん:2010/07/14(水) 23:28:57
>>352
ほかにいい本ないしね。買ったほうがいいよ。
355デフォルトの名無しさん:2010/07/15(木) 01:51:05
ついにキタ!
Scala 2.8.0.final
http://www.scala-lang.org/node/7009
356デフォルトの名無しさん:2010/07/15(木) 01:53:08
ついにfinal RCか。
357デフォルトの名無しさん:2010/07/15(木) 05:24:45
(* ̄∇ ̄)/゜・:*【2.8.0 final】*:・゜\( ̄∇ ̄*)
358デフォルトの名無しさん:2010/07/15(木) 05:47:49
(* ̄∇ ̄)/゜・:*【2.8.0 final】*:・゜\( ̄∇ ̄*)
359デフォルトの名無しさん:2010/07/15(木) 06:07:49
(´・ω・`)人(´・ω・`)
360デフォルトの名無しさん:2010/07/15(木) 08:56:08
一番にキターしたかったのにorz
361デフォルトの名無しさん:2010/07/15(木) 10:23:08
寝る前にチェックしたときはリリースしてなかったのに(´・ω・`)
362デフォルトの名無しさん:2010/07/15(木) 12:10:24
Helios対応 Scala-IDEまだぁ〜待ちく(ry
363デフォルトの名無しさん:2010/07/15(木) 14:26:19
(;^_^ /゜・:*【2.8.0 final】*:・゜\(;^_^
364デフォルトの名無しさん:2010/07/15(木) 18:22:02
次の、2.8.1または2.9または3.0はいつでるの?w
365デフォルトの名無しさん:2010/07/15(木) 19:50:05
>>354
> ほかにいい本ないしね。買ったほうがいいよ。

「ボクらのScala ~ 次世代Java徹底入門 」
を買ったけど、思ったより良かった。

・日本人が書いているから、変な和訳はないので、読みやすい。
・洋書にありがちな、分かりやすいようで分かりにくい例え話は、ない。
・日本の出版社の本は、図とかレイアウトが丁寧で分かりやすい。
・だけど、本の題名で損している。
「ボクらの〜」という題名で敬遠している人は多いかと思うけど
「たのしいRuby」とかと同じ系統の本で、なかなか良い。
「次世代Java入門」っていう副題は、意味不明。内容的にほとんど意味なし。
366デフォルトの名無しさん:2010/07/15(木) 22:43:14
Scalaは自称次世代Javaだから
367デフォルトの名無しさん:2010/07/15(木) 22:47:56
自称してるのは、「次世代javaの先取り」だけどな
368デフォルトの名無しさん:2010/07/15(木) 22:51:25
先取り次世代Javaならまだよかったのに
369デフォルトの名無しさん:2010/07/16(金) 00:50:09

なんでmutableなのにListBufferはvalで宣言して、
しかも+=ができるの?
意味わかんなくて理解できなくて睡魔に襲われたんですけど
370デフォルトの名無しさん:2010/07/16(金) 01:02:58
+=っていう名前のメソッドが定義されてるから
371354:2010/07/16(金) 01:13:37
>>>365
ん〜〜〜・・・初心者にはいいのかもしれないが、ある程度Javaとか知ってるなら、コップ本以外ありえないと思うんだけどなぁ。
自分的は、コップ本で理解できるから、他の本は内容薄くて、まったく買う価値が見いだせないっていう感じ。

>変な和訳、分かりやすいようで分かりにくい例え話、
この辺はどんな洋書の和訳でもそういうものだし、別にコップ本はそういうのあまりないと思うけど。
っていうか、そういう翻訳されたものとか結構読んでるから、洋書独特の例え話とか慣れてしまって、意識すらしてなかったな。


372 ◆CgacaMDhSQ :2010/07/16(金) 01:23:04
>>369
オブジェクトがmutableということと変数がmutableということを混同している
valは、あくまでその変数に再代入不可ということを保証するだけで、その変数が指す先の
オブジェクトがmutableであるかどうかは関知しない。+=に関しては、>>370の言う通り、そういう
名前のメソッドがListBufferに定義されているからだね。
373デフォルトの名無しさん:2010/07/16(金) 02:05:33
ListBufferはインチキしてるから。
インチキの実態は、コップ本に詳しく書いてある。

外向きには関数型言語っぽいけど、ライブラリ内部は全然そうじゃない、ってとこが
Scalaの特徴のひとつだろう。これには幻滅する人も何割か居そう。
374デフォルトの名無しさん:2010/07/16(金) 02:23:38
ScalaでのSymbolってどういうときに使えばいいの?

記法上は組み込みで特別な構文があるけど、Rubyとかと違って、
実態は単なる普通のクラスと何ら変わりないわけだし、
パフォーマンス考えたら、JVMの仕様上、Stringで代用したほうが、速そうな気がするんだけど。

(比較するのは速いかもしれないけど、生成するのにコストがかかる?
JVMはStringは特別扱いするけど、JVMから見ればSymbolは単なる普通のクラスでしかないよね?)


コップ本にも1ページ分くらいしか載ってないし・・・
375デフォルトの名無しさん:2010/07/16(金) 02:30:29
>>373
>外向きには関数型言語っぽいけど、ライブラリ内部は全然そうじゃない

パフォーマンスのこと考えてるんだろうから、それは正しい選択だと思うが・・・
幻滅する人はHaskellでもやればいいよ
376デフォルトの名無しさん:2010/07/16(金) 10:56:07
>>375
Dみたいにconst(final)とimmutableを区別できるのはメリットがあると思うけどな
377デフォルトの名無しさん:2010/07/16(金) 22:41:59
>オブジェクトがmutableということと変数がmutableということを混同している
なるほど…!理解した
378デフォルトの名無しさん:2010/07/17(土) 10:24:55

val x = numbers.head
val y = numbers.last
val r = numbers.tail

ボクらのScalaでListの変数名を r にしてるんだけど、
これってどういう意味合いかわかりますか?
range の意?
(挫折した) Haskellだと複数形の s つけて xs ってしてたような
379デフォルトの名無しさん:2010/07/17(土) 11:10:17
restですかね
いやさっぱりわかりませんが
380デフォルトの名無しさん:2010/07/17(土) 11:51:44
>>378
一時変数で適当につけてるみたいだし意味ないんじゃないの?
そもそも、rのいみわからなくて、そのxとyの意味あいはわかった?

ループ変数のi,jに意味求めるようなものだろう。元の意味や語源はあるけど意識してはつかってない

真意は著者に聞いたほうが早いと思う
381デフォルトの名無しさん:2010/07/17(土) 12:55:35
i, j, k とか x, y とか n は数学的なものでしょ
意味合いも理解できるし、なによりいろんなプログラミング言語でも使われてる
382デフォルトの名無しさん:2010/07/17(土) 13:37:01
i,j,kはFORTRANから。初期のFORTRANは整数型の変数名にI,J,K…しか
付けられなかったためいまだにその名残がある。

それよりscalaはすごく遅いのだがそういうものなんだろうか?
383デフォルトの名無しさん:2010/07/17(土) 14:40:09
>整数型の変数名にI,J,K…しか付けられなかったため

宣言しなかった場合だけだろ
384デフォルトの名無しさん:2010/07/17(土) 15:04:18
初期のFORTRANには宣言が無い。
385デフォルトの名無しさん:2010/07/17(土) 16:18:35
restの頭文字とったんじゃないの
head/tail = first/rest = car/cdr
386デフォルトの名無しさん:2010/07/17(土) 16:23:19
(゚Д゚)クダー
387デフォルトの名無しさん:2010/07/17(土) 17:37:51
>>385
追加
head/tail = first/rest = car/cdr = x/xs

本当はX|Xsと書きたい
388デフォルトの名無しさん:2010/07/17(土) 19:07:09
>>387
> 本当はX|Xsと書きたい
しかし、こういう命名をすると次にXsをheadとtailにわけるとき、名前に困るという罠が
389デフォルトの名無しさん:2010/07/17(土) 19:09:11
yとysでおk
390デフォルトの名無しさん:2010/07/17(土) 19:18:07
つーか再帰して今のXsが次のXとXsに分けられるだけだろ
なんで違う名前が必要なんだ?
391378:2010/07/18(日) 01:15:32
著者にTwitterで聞いてみたら、
書いたときは remainder のつもりだったんじゃないかなと思います。 とのこと
392デフォルトの名無しさん:2010/07/18(日) 01:20:32
著者に気軽に質問ができるなんて、ホント便利な世の中になったもんだ
393デフォルトの名無しさん:2010/07/18(日) 12:18:02
javaの
static class X {
static { ... }
}
(staticオブジェクトが初めて起動されたときだけ実行される)
と同じことをScalaでやろうとすると、

object X {
{
println(new java.util.Date())
}
def exec() = println("world!")
}
X.exec()
X.exec()

これで良さそうですが、
def init() { ... }
みたいなマジックワードがあったりするのでしょうか?
(初期化し直したかったりする場合のため)
初期化コードが長い場合に他のメソッドが埋もれないように、
とりあえず上のように中括弧いれてみましたが、それ以外で。
394 ◆CgacaMDhSQ :2010/07/18(日) 21:13:29
>>393
def init() { ... } みたいな初期化時に呼ばれる専用メソッドは特に無いので、
object X { ... } の中に初期化コードを直接入れるのでOK.ちなみに、{}をいれずに
直接初期化をobject直下に書いた場合、初期化コード中でしか使わないローカル変数を宣言しようと思っても、
フィールド扱いになってしまうので、そういうのを避ける意味でも初期化コードが長くなるなら、初期化
コードを{}で囲むのは良いと思う。
395デフォルトの名無しさん:2010/07/18(日) 21:25:11
マクロ機能はいつサポート予定ですか?
396デフォルトの名無しさん:2010/07/18(日) 21:33:25
これ以上複雑にされると、もうついていけない。
397デフォルトの名無しさん:2010/07/19(月) 02:36:26
>>391
乙乙
疑問が解けた

特に習慣的に決まっていて書いていたわけでもないのねw
398デフォルトの名無しさん:2010/07/19(月) 09:57:49
>>396
>これ以上複雑にされると、もうついていけない。

scala の cheat sheet でも。
http://www.bing.com/search?q=Scala+cheat+sheet
399デフォルトの名無しさん:2010/07/19(月) 12:39:46
>>396
なにがサポートされようが便利なら使えば良い便利でないとか判定できないなら
無視すれば良い。それで困ることがあるはずない。
400デフォルトの名無しさん:2010/07/19(月) 12:42:26
もっと複雑になればJRubyの需要が高まるね(ニッコリ
401デフォルトの名無しさん:2010/07/19(月) 14:29:56
val xs: List[Int] = eval("List(3,2)")
みたいに、リスト限定でevalをしたいのですが、
正規表現、パーサー作る、以外の簡単な方法はありますか?
402デフォルトの名無しさん:2010/07/19(月) 15:38:47
import scala.tools.nsc.Interpreter
val xs = (new Interpreter).evalExpr[List[Int]]("List(1,2,3)")
一応こういうのはあるけど、こう使うものなのかよくわからない
403401:2010/07/19(月) 16:08:34
実は正統なやり方もよくわかっていません。
Cだとsscanfで簡単に3と2を切り出せるのですが、
こういう修飾された文字列からTokenizerを使って読めるのでしょうか?
(検索するとCSVのサンプルはたくさんあるけど、あれは余計なゴミがついてないから・・・)
404401:2010/07/19(月) 20:24:54
なんかいじめとしか思えないのですが、
findInLineを使おうとするとmatchが使えないという・・・
ttp://webcache.googleusercontent.com/search?q=cache:YmIStkq4fN8J:ja.doukaku.org/170/nested/
405デフォルトの名無しさん:2010/07/19(月) 20:41:38
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
406401:2010/07/19(月) 21:34:08
自分のケースについては完全に動作しました。ありがとうございます。
ただ、パターンの部分は勉強しないと読めませんね・・・。
407デフォルトの名無しさん:2010/07/19(月) 22:35:38
Google Web ToolkitをScalaでやるのって可能なの?

あれって、Javaソースコード(.java) => javascriptソースコード(.js)
へコンパイルしているんだろうけど、
Scalaソースコード(.scala) => Javaソースコード(.java) へのコンパイラがあれば、
Scalaソースコード(.scala) => Javaソースコード(.java) => javascriptソースコード(.js)

ていう感じでできるかな?(コンパイルすごく時間かかりそうだけどw)
408デフォルトの名無しさん:2010/07/19(月) 22:39:08
ところがだ
Javaソースコード(.java) => javascriptソースコード(.js)
にとって意味のあるコードは
Scalaソースコード(.scala)
としてはまったく無意味なコードになるであろう
409デフォルトの名無しさん:2010/07/19(月) 22:44:13
ちなみに以前読んだ記憶では一旦JavaのASTにはしてるけど
Javaバイトコードに落ちる前だった。
410 ◆CgacaMDhSQ :2010/07/20(火) 00:06:32
>>407
原理的にはできるし、現状でもexperimentalなjava-srcバックエンド使えば一応できないことも無いけど
現状では十分に実用的とは言い難いってのが正直なところだと思う。一応こんなプロジェクトも
あるけど、どこまで使えるのかはちょっとわからない。
http://scalagwt.gogoego.com/
411407:2010/07/20(火) 02:36:59
>>410
一応プロジェクトもあるのかぁ。ありがとうございます。
412デフォルトの名無しさん:2010/07/22(木) 23:32:27
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>
414デフォルトの名無しさん:2010/07/24(土) 18:24:22
抽象型って抽象メソッドとかと違って実装しなくてもコンパイルできんだな、なんでこんなんなの?

trait Hoge {type A}
class Fuga extends Hoge //コンパイルできる
415 ◆CgacaMDhSQ :2010/07/25(日) 14:10:24
>>414
抽象型はそれだけでも、「何だかわからない不明な型」みたいに型チェッカに扱われるので、コンパイル通る。
416デフォルトの名無しさん:2010/07/25(日) 15:05:50
プログラムの実行ファイルってみんなどうやって作ってるんだろ?
eclipseとかnetbeansにそういう機能がついてんの?
417デフォルトの名無しさん:2010/07/25(日) 15:45:14
416みたいな人(失礼!)でも使うくらい、scalaって知名度があるんだな。
少し見直した。
418デフォルトの名無しさん:2010/07/26(月) 10:10:11
まぁ裏でMavenが何やってるか知っておきたい気はする
419デフォルトの名無しさん:2010/07/26(月) 23:34:38
>>412

package scala.collection
package immutable

とした場合と、

package scala.collection.immutable

とした場合にスコープが違くなるとかそういう話?
420デフォルトの名無しさん:2010/07/27(火) 06:51:27
scalaは書き方が好きなんだけどいざ使ってみるとすごく遅い。
単純なプログラムでも起動してから最初の結果を得るまでに1秒くらいかかるけど
インストールでへまやったんだろうか? みんなもこんなに遅い?
421デフォルトの名無しさん:2010/07/27(火) 08:58:09
>>420
eclipseとかつかってる?
コンパイル(と起動)が遅いだけで、実行スピードは、Javaと対して変わらないよ。
System.currentTimeMillisとかで、起動したときと、終了する前の時間調べればわかるけど
422デフォルトの名無しさん:2010/07/27(火) 09:14:41
そんなあなたにfsc
423デフォルトの名無しさん:2010/07/27(火) 09:27:52
起動が遅いのはJVM系言語の共通の弱点だね
コンパイルが遅いのは、もうちょっと頑張ってほしい
424デフォルトの名無しさん:2010/07/27(火) 12:38:59
レスサンクス。
>>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だと正しく動作します。これってなんで。
426425:2010/07/27(火) 18:26:01
list += Tuple2(1, "a")
だと上手くいきました。
なんか2.8で変わったのかな。
427 ◆CgacaMDhSQ :2010/07/27(火) 18:26:04
>>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
理由まで説明してくださり勉強になりました。
有難うございます。
429デフォルトの名無しさん:2010/07/27(火) 18:51:12
この話、前もあったよね
意外とひっかかるポイントなのかも
タプルは->を使うというのがScalaの豆知識だね
430デフォルトの名無しさん:2010/07/27(火) 21:54:29
lift使いの皆さんはストレージとのやりとりに
mapper and recordとJPAどっちつかってる?

jpaの方がejbにそっててなじみがあるので良いような気がするんだけどどうなんだろ。
431デフォルトの名無しさん:2010/07/28(水) 00:58:51
>>429
要素が3つ以上の時は -> だと駄目だよね
432デフォルトの名無しさん:2010/07/28(水) 07:02:23
>>422-424
Scala気になってるんですが、
こういうのってハックみたいなもので解決する方法ってあるんでしょうか?

Rubyなんかだと、素のRubyは速いけれどライブラリたくさんよむとやたら重くなって
テスト実行時にDRbだかRubyのサーバー?みたいなのを裏で立てておいてライブラリの読み込みを高速化する方法とかあったけど
webアプリは開発モードだと必要なものだけリロードできるし
433デフォルトの名無しさん:2010/07/28(水) 07:33:35
いくら起動が遅いと言ってもインタプリタが動的に読み込むよりは早いんじゃないの
434デフォルトの名無しさん:2010/07/28(水) 14:56:47
ブーチ「ただ、現在、わたしの興味を引く言語の1つとして、
Scalaを挙げることができる。なぜなら、伝統的な言語である
C/C++でもFORTRANでも隠ぺいできていなかった並行性の問題に
Scalaは光を当てているからだ。」
http://www.itmedia.co.jp/enterprise/articles/1007/28/news032.html

>>423-424
Groovyだとこんなのあるね。
ttp://d.hatena.ne.jp/nobeans/20100309/1268149199
435デフォルトの名無しさん:2010/07/28(水) 18:08:25
>>432
fscはそういうアプローチなのでは。
実行はOSGiバンドルでやるとJVMの起動分は早くならないかな?
436デフォルトの名無しさん:2010/07/31(土) 09:28:44
ターミナルもう一つ立ち上げてsbtで監視がFA
437デフォルトの名無しさん:2010/07/31(土) 09:33:15
sbtのことサバトってよんでもいいかな
438デフォルトの名無しさん:2010/07/31(土) 09:43:18
スブタにしようぜ
439デフォルトの名無しさん:2010/07/31(土) 16:51:07
質問させてください

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 が発生しているようです。
440デフォルトの名無しさん:2010/07/31(土) 21:27:52
asInstanceOfはコンパイラ向けであって、
実際にキャストしてるというわけじゃないんだろうね
Manifestを使ってクラスを取ってきて無理矢理キャストしてみるとか?
まあ、そんな関数作らないほうがいいよねw
441デフォルトの名無しさん:2010/07/31(土) 22:18:13
>>439
JVMつかってることによるscalaの型システムの限界かな
442441: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


443439: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)
 }
}

というのはどうかなと思ったところうまくいかなくて、先ほどの質問をしました。
静的型の言語に慣れてないのでうまいやり方がわからないのですが、
皆さんだったらどのようなインターフェースにしますか?
444デフォルトの名無しさん:2010/08/01(日) 01:04:37
そうか、Manifestでクラスを取ってきてもBoxingできないんだね
まあ、自力でテーブル作ればいいけど
445デフォルトの名無しさん:2010/08/01(日) 01:15:40
>>443
いや、それはキャストエラーをNoneで潰しちゃ駄目なんじゃない?
見つからないのか、型が違うのか、区別したほうがいいと思う
446439: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は別に必要ですね。
447デフォルトの名無しさん:2010/08/01(日) 01:44:33
静的型言語でキャスト失敗するって99%バグだからね
むしろ、そうやって型を活かすように書くべきというか
だからキャストエラーなんてそのまま上に投げちゃって構わない
448439:2010/08/01(日) 02:22:15
確かにバグ以外は思い浮かびません。
catching の方は消すことにします。
アドバイスありがとうございます。

最初 Option[T] にせず T をそのまま返してたので気づかなかったんですが、
Option[T] にすると型推論も効かなくなるみたいなのでもうすこし考えてみます。
449デフォルトの名無しさん:2010/08/03(火) 18:26:36
いつのまにやら、helios用のscalaプラグインがでていたようですな

(´・ω・)つ
ttp://download.scala-ide.org/
ttp://download.scala-ide.org/nightly-update-helios-2.8.0.final

450デフォルトの名無しさん:2010/08/03(火) 20:09:26
>449 コレ使うと、liftのビルドおかしくなるのかな、やっぱ。
451デフォルトの名無しさん:2010/08/04(水) 17:24:58
やっとheliosにscalaプラグインインストールできた&かなり良くなってる
452デフォルトの名無しさん:2010/08/05(木) 14:51:42
val a = new String("abc")
val b = new String("abc")

こうやるとa eq bはfalseになるんだけど

val a = "abc"
val b = "abc"

こうするとa eq bがtureになるのはなんで?

453デフォルトの名無しさん:2010/08/05(木) 16:14:59
javaの仕様で同一内容のStringリテラルは同じインスタンスを参照することになってる。
リテラルの場合はaもbも同じインスタンスだからtrue
newした場合はそれぞれ別のインスタンスだからfalse
454デフォルトの名無しさん:2010/08/05(木) 17:35:39
>>451
安定性はどんな感じですか?
455デフォルトの名無しさん:2010/08/06(金) 08:56:28
>>453
サンクス
456デフォルトの名無しさん:2010/08/16(月) 13:13:11
スレ違いでしたらすいませんが質問です
Scalaプログラミング入門を読んでScala初心者始めたのですが
触り始める前の、関数型言語とオブジェクト指向の自然な融合をした実用言語の印象が
それプラス強力なパターンマッチと再帰の組み合わせが新たなパラダイムを開けそうな言語
に見えています。
アクターとパターンマッチングは自分の使ってきた他の言語に見られない特徴なのですが
この機能はどの言語からの輸入なのでしょうか?
(アクターはSmalltalkのメッセージからっぽいのですが・・・)
457デフォルトの名無しさん:2010/08/16(月) 13:22:40
アクターとパターンマッチを組み合わせた実用言語といえば
まずErlangを連想するべき
458デフォルトの名無しさん:2010/08/16(月) 14:45:04
>456
触りはじめなら、F#と比較してみたら?
459デフォルトの名無しさん:2010/08/16(月) 16:37:20
かつてEiffelのdefferdに憧れた俺が来ましたよと
>>456 アクターは昔からあった考え方ですね

Scala開眼に詳しい概説あり
http://www.h7.dion.ne.jp/~samwyn/Scala/scalaindex.htm
460デフォルトの名無しさん:2010/08/19(木) 03:37:38
JVM以外のサポートってどうなってるの?.Netとか対応予定ってみたことある気がするんだけど。昔。
461デフォルトの名無しさん:2010/08/19(木) 12:58:52
>>460

Scalaは、既に.net には対応しているんじゃないの??



JVMは、SwingとかGUIもそろっていて良い面がある一方で
OracleのAndroid訴訟とかあるし、JVMの将来が不安だ。
技術面でなくて、政治的な面で、JVMの将来が不安。。。

だからといって、.netも将来的に不安だし。。
462デフォルトの名無しさん:2010/08/19(木) 16:52:58
ttp://www.scala-lang.org/node/168
バージョンは1.4だけど
463デフォルトの名無しさん:2010/08/19(木) 17:50:42
GJCみたくScalaも叩かれる訳か
464デフォルトの名無しさん:2010/08/20(金) 12:50:53
Sun…じゃなくてOracleのリファレンスJVMなら大丈夫なんじゃないの?
465デフォルトの名無しさん:2010/08/20(金) 13:32:15
質問させてください。

同名の 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 }
}

こんな感じのことがしたいです。
466デフォルトの名無しさん:2010/08/20(金) 15:49:29
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()
468デフォルトの名無しさん:2010/08/20(金) 17:58:01
http://java.sun.com/javase/ja/6/docs/ja/api/java/lang/Class.html#getDeclaredFields()
> この Class オブジェクトが表すクラスまたはインタフェースによって宣言された
> すべてのフィールドをリフレクトする Field オブジェクトの配列を返します。
> これには、public、protected、デフォルト (package) アクセス、および
> private フィールドは含まれますが、継承フィールドは含まれません。
469デフォルトの名無しさん:2010/08/20(金) 18:05:16
おお、なるほど こりゃ失敬しました
でも super[J].getClass.getDeclaredFields もダメなんです
はい、頭固いってよくいわれます
470デフォルトの名無しさん:2010/08/20(金) 18:14:50
!? わかった
this.getClass.getSuperclass.getDeclaredFields
471デフォルトの名無しさん:2010/08/20(金) 18:40:35
できたじぇ

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
472デフォルトの名無しさん:2010/08/20(金) 21:23:53
>>467-471
ありがとうございます。ここまでやらないとダメなんですね。

protected val _a = getClass.getSuperclass.getDeclaredField("a").get(this).asInstanceOf[XXX]

こんなふうに持つようにしたらうまくいきました。
473デフォルトの名無しさん:2010/08/20(金) 21:46:03
あ、あれ?
素直にコンポジションにしろよってツッコミがくると思ってた…
斜め下の回答して、婉曲にあの人頭おかしいっていわれるのが得意です(キリッ
474デフォルトの名無しさん:2010/08/23(月) 13:10:43
protectメンバのテストには無名クラス使えばいいんだけど
テスト対象がprivateの場合はどうしたらいいの?
Inspectorで権限書き換えるしかないのかな?
475デフォルトの名無しさん:2010/08/25(水) 02:55:21
ScalaがJavaと比べて簡潔に書ける理由って具体的になに?
3秒考えてみたけど、リテラルが多いことしか思い浮かばなかった
476デフォルトの名無しさん:2010/08/25(水) 05:09:51
パターンマッチ!パターンマッチ!
477デフォルトの名無しさん:2010/08/25(水) 08:41:20
見た目が簡潔との観点だと
・関数オブジェクト
・多重継承の代用となるミックスイン
・シングルトン代わりのObject
とか
478 ◆CgacaMDhSQ :2010/08/25(水) 11:53:24
>>475
関数リテラルとXMLリテラルと複数行文字列リテラルくらいじゃない?Javaに比べて追加されてるのって。
List(...)とかArray(...)は別にリテラルじゃないし。

個人的には、典型的なクラス定義が簡潔に書けるように考慮された文法(case classなど)、ファーストクラスの関数(高階関数)、
パターンマッチ、placeholder syntax、trait辺りがポイントかなあと思う。あと、packageの扱いが柔軟なのもなにげに嬉しい
479デフォルトの名無しさん:2010/08/25(水) 12:03:18
・Actorで非同期並列処理が簡単に書ける
・遅延評価を用いたif,whileの独自拡張構文が書ける
・パーサーコンビネーターでらくらくDSL構築
・XMLリテラルでXMLパーサーいらず
480デフォルトの名無しさん:2010/08/25(水) 12:16:43
・型推論によってコンパイラが型を特定できる場合は省略可能
・行末の";"がいらない
・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 スケーラブルプログラミングより]
481デフォルトの名無しさん:2010/08/25(水) 12:52:48
クラスのメンバでvalだとゲッタvarだとゲッタ&セッタを作ってくれるってのがなんか感動した
短く書くためのC#の自動実装プロパティとかよりさらに短く書ける上に自然だし
482デフォルトの名無しさん:2010/08/25(水) 13:17:58
・引数が無い関数呼び出しの()を省略できる
・Option[T]でnullチェックいらず
・Javaのfor文の入れ子⇒ジェネレータ"<-"で一つのfor{}にまとめることができる
・複数の結果を返す関数などちょっとした入れ物が欲しいときには括弧でくくるだけでタプルになる
483デフォルトの名無しさん:2010/08/25(水) 15:49:33
よし、まだ忍者は来ていないな。
484▲☆◎Perl忍者◎☆▼ ◆7IYqRceeLmsF :2010/08/26(木) 09:56:04
呼んだ?
485デフォルトの名無しさん:2010/08/26(木) 21:18:40
にゃるほど
コピペで記事にできそうだな
486デフォルトの名無しさん:2010/08/27(金) 07:02:16
Scala+Liftによる超実用開発
http://www.infoq.com/jp/interviews/Scala_Lift
487デフォルトの名無しさん:2010/08/27(金) 09:20:01
GroovyServってのは、nailgunとなんか違うのかな。
488デフォルトの名無しさん:2010/08/27(金) 15:44:59
遅延評価つかうと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したら一杯出てきてどうしよう←いまここ
489 ◆CgacaMDhSQ :2010/08/27(金) 21:32:58
>>488
そういうことしたいなら、
{
import dataout._
writeInt(data.length)
write(data)
flush
}
で、どうかな?
490デフォルトの名無しさん:2010/08/28(土) 02:58:34
スコープを {} で括るのってJavaでもできるけどダサくないっすか
491デフォルトの名無しさん:2010/08/28(土) 03:03:29

Scalaの開発では、1つのソースコードに1つのクラスを書くのが基本ですか?(内部クラスみたいのは除く)
もしそうなら、ソースコードのファイル名も、1文字目が大文字っていう慣例がありますか?

ITProのアクターの記事は1ファイルに数クラス書いてるけど、
これは閲覧者がコード内容を理解しやすいからって認識で良いのかな
書籍はインタプリタでScalaを解説してるから、なんかこういう細かいことで疑問が生じた
 
492デフォルトの名無しさん:2010/08/28(土) 08:54:20
そんな縛りないよ

設計管理じゃなくて"ハック"がしたいんだよ

ScalaはJavaで散見された紋切り型の記述が必要ないので、普通のclassも規
模が小さいし、その周りに粒度の小さいcase classとかtraitとかがわらわら
出てくるのでそんなのにいちいちファイル作ってたらきりがないってのがあ
る。

リファクタリングのコストが高くなって不要なクラスを故意に見逃すくらいな
らそんなファイル作らないぜよ

「ThoughtWorks アンソロジー」のオブジェクト指向エクササイズのように徹
底してやりたいならリリース直前の最終段階で小分けにすればいいやん。
多分みんなそこからブランチつくってプロジェクトが枝分かれするねw

とりあえず >>491 はScalaインストールして実際に手動かすべきだと思う
493デフォルトの名無しさん:2010/08/28(土) 11:37:12
んじゃあ1モジュール1ファイルにするってことでいいのかな
1ファイルにインタフェースと、それを継承した複数の実装を書いちゃう感じでいいの
494デフォルトの名無しさん:2010/08/28(土) 13:31:12
なんとなくこのスレみてて
仕事で使うことは無いだろうなと思ってたら
scala使う案件担当することになったわw
495デフォルトの名無しさん:2010/08/28(土) 13:47:53
くらしき行きたかったなぁ…
496デフォルトの名無しさん:2010/08/28(土) 21:01:36
Scalaの案件…

最近、技術力を求める案件が増えてる気がするなあ
497デフォルトの名無しさん:2010/08/28(土) 21:44:54
Scalaいいたいだけちゃうんかと、ヒゥイッヒヒー
498デフォルトの名無しさん:2010/08/28(土) 22:03:30
>>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.
499デフォルトの名無しさん:2010/08/29(日) 01:15:50
>489とpackage objectは関係ないし、2.8じゃなくてもできる
500デフォルトの名無しさん:2010/08/30(月) 11:50:21
ありがとうございます
さっそくつかってみます
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)
502デフォルトの名無しさん:2010/09/03(金) 18:59:29
常套手段ではないと思うけど頑張ってやるとしたらこんな感じかね

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)
503デフォルトの名無しさん:2010/09/04(土) 10:21:08
Scalaの糖衣構文をまとめた資料ってどっかにない?
504デフォルトの名無しさん:2010/09/05(日) 08:08:23
割と頻繁にJAVAコードを追ったりJVMの動作を考えさせられるのが鬱陶しい
505デフォルトの名無しさん:2010/09/05(日) 09:18:46
確かにJavaの仕様に依存するところも多いがJavaを知っていれば問題はない
Java詳しくないのであれば、Javaの勉強もできて一石二鳥なんじゃね?
506デフォルトの名無しさん:2010/09/05(日) 23:07:11
そりゃプログラムを完成させるだけなら問題ないだろうよ。
俺は暗号化されたようなJAVAコード読みながらちまちまパフォーマンス
を詰めるのが苦痛で仕方ない。
関数型言語ってのは流儀にのっとって書けば効率良いバイナリを
吐いてくれるという幻想が見事に打ち砕かれたわ。
507デフォルトの名無しさん:2010/09/06(月) 09:44:04
508デフォルトの名無しさん:2010/09/06(月) 10:01:29
JavaとかScalaとか言う以前に "The 90/10 Rule" を知らないのかよw
509sage:2010/09/06(月) 11:15:16
デフォルト引数使いたいのに、
case class window(width:Int,height:Int=width)
これが通らないのはダメじゃないかと思うのだが・・・。

参考:
http://www.scala-lang.org/node/2075
510デフォルトの名無しさん:2010/09/06(月) 12:29:09
オーバーロード
511sage: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.
512sage:2010/09/06(月) 13:00:44
classだとできるのにcase classだとできないっぽい。
なぜだ・・・?
513デフォルトの名無しさん:2010/09/06(月) 14:34:36
case class Window(width: Int, height: Int) {
def this(i: Int) = this(i, i)
}

object Window {
def apply(i: Int) = new Window(i)
}
514デフォルトの名無しさん:2010/09/06(月) 14:49:40
Cool!!
515sage:2010/09/06(月) 15:56:18
なんかたらい回してる感もあるけど、現状ベストでしょうね。
ありがとうございました。
516デフォルトの名無しさん:2010/09/12(日) 09:26:42
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
なんかは大丈夫なので、ダメな理由が分かりません。
517デフォルトの名無しさん:2010/09/12(日) 12:24:57
>>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)
}
518デフォルトの名無しさん:2010/09/12(日) 20:42:27
>>517
ありがとうございます!感謝しきれません。
自分のコードでも、一カ所変更するだけでうまくいきました。

どういう機構でそうなるのか理解したいですが、
あいにくコップ本には遅延Streamの記述が見当たらない・・・。
519 ◆CgacaMDhSQ :2010/09/13(月) 19:28:06
>>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
が起きる。
520 ◆CgacaMDhSQ :2010/09/13(月) 19:30:10
>>519
自己レス
誤:1024
正:1026
アホなミスしてしまったorz
521デフォルトの名無しさん:2010/09/13(月) 22:45:01
atmarkitに書いてあるけどなぜScalaってゴミ機能満載にしたの?
522デフォルトの名無しさん:2010/09/13(月) 22:45:50
Java厨が悦ぶから
523デフォルトの名無しさん:2010/09/13(月) 22:46:46
糞言語なんだろ
524デフォルトの名無しさん:2010/09/13(月) 23:20:34
糞サイトはどうでもいいけど、どっかの糞言語開発者も毎回同レベルのイチャモンをつけてくるから困る
525デフォルトの名無しさん:2010/09/13(月) 23:21:40
Scala糞だし
526デフォルトの名無しさん:2010/09/13(月) 23:59:23
お金稼ぎに使わない教養を積むために勉強する言語なんだから
いろいろ面白い機能が実装されてるほうが良い。
Scalaはちゃんと目的を果たしてるし、ゴミとか言われる筋合いはない
527デフォルトの名無しさん:2010/09/14(火) 00:02:24
>>526
教祖様が起業したのはお金のためでしょ?
528デフォルトの名無しさん:2010/09/14(火) 00:15:06
立場が違うと思うの。
529 ◆CgacaMDhSQ :2010/09/14(火) 00:53:58
>>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
みたいな喧嘩があったときも、関数型プログラミングコミュニティで内輪もめしてる場合じゃねえ(意訳)
みたいな事書いてたし。
530デフォルトの名無しさん:2010/09/14(火) 05:45:23
そうだね。Cに対するC++のようなもんだ。Javaに対するScala。
関数型の眼見ればまあいろいろ筋の悪さはあるけど、
ぶつくさ言われつつもやはり広く使われると思うよ。
というかそういう筋悪なものでないと広く使われるようにはならないんじゃない。
そのうちC++に対するJavaのような、Scalaの後を襲う言語も出てくるだろう。
531デフォルトの名無しさん:2010/09/14(火) 07:28:25
ISO申請せずに実用的と言われてもなぁw
532デフォルトの名無しさん:2010/09/14(火) 07:50:44
規格化は時間がかかるし、そもそも規格の意味があるだけ
流行って処理系含めて周辺環境が多様になるのかも
まだ分からんでしょ
533デフォルトの名無しさん:2010/09/14(火) 08:03:43
Java本体すらISO化しとらんのに
534デフォルトの名無しさん:2010/09/14(火) 17:18:28
Javaのように書けて、JavaVM上で動いたらそれはScalaだよもん。
535scalaZa:2010/09/14(火) 23:01:23
536デフォルトの名無しさん:2010/09/15(水) 02:58:37
http://www.y-adagio.com/public/standards/std_lst_jtp.htm
Javaだと、こんなのはあるよ。JIS TR X 0005

Scalaも安定して利用機関が増えたら、下記のパターンやる日が来るんじゃないかな。
http://www.ecma-international.org/publications/standards/Ecma-262.htm
http://msdn.microsoft.com/en-us/netframework/aa569283.aspx
537デフォルトの名無しさん:2010/09/15(水) 18:11:48
Scalaで、対話型のサーバとコマンドをやりとりするクライアントを書こうとしてるんだけど、
何かそういう用途にうってつけの機能とかライブラリとかないかな。
538デフォルトの名無しさん:2010/09/15(水) 23:38:15
ARM
539デフォルトの名無しさん:2010/09/16(木) 00:23:56
EclipseのHeliosにPlugin入れてScalaの勉強はじめてみたんですが、
importの補完って自動でやってくれないんでしょうか。

コードをEclipseでスラスラ書いて、
ビルド→テストはsbtって感じがよさそうだったんですが…
540デフォルトの名無しさん:2010/09/16(木) 00:33:19
>>539
Ruby勉強しなさい
541539:2010/09/16(木) 00:40:02
importの自動補完ができるかどうかと、何の関係があるんですか?
542デフォルトの名無しさん:2010/09/16(木) 00:52:09
SS本を見ると「例外は使うな、Optionにしろ」って書いてあるけど、
Noneにはエラーの原因とか入れられないよね。こういう場合はどうすれば?
543デフォルトの名無しさん:2010/09/16(木) 01:17:57
nullは使うなの間違いじゃないか?
544デフォルトの名無しさん:2010/09/16(木) 01:58:34
Optionより、Boxおすすめ。
545デフォルトの名無しさん:2010/09/16(木) 07:29:37
Some以外つかうな
今後の互換性がない
546デフォルトの名無しさん:2010/09/16(木) 08:05:12
どっかで例外をEitherでラップできるぜみたいなの見たことあるけど
どんなメリットあるんです?
547デフォルトの名無しさん:2010/09/16(木) 19:21:59
EitherでMaybeモナドっぽいことやろうとしたら、

a.right.flatMap(...) みたいなことになってしまったのだが、
もっとスマートな記法はないのだろうか。
548デフォルトの名無しさん:2010/09/17(金) 23:42:47
一方私はEclipseでスラスラという部分になんとも言えない違和感を感じていた
549デフォルトの名無しさん:2010/09/18(土) 00:14:22
そんな私も今ではすっかり『Emacs + ENSIME + sbt』
なぜなら小指とCtrlは決して切り離せない特別な存在だからです。
550 ◆CgacaMDhSQ :2010/09/18(土) 13:32:10
>>545
BoxはLift使う限りでは問題ないのでは?
551デフォルトの名無しさん:2010/09/18(土) 15:14:54
>>550
Box的なものをScala標準ライブラリに取り込む予定はないのだろうか。
552デフォルトの名無しさん:2010/09/18(土) 18:15:17
BoxはLiftから分離されたでしょ?
553デフォルトの名無しさん:2010/09/18(土) 21:14:04
>>552
知らなかった。今はどこが管理してるの?
554デフォルトの名無しさん:2010/09/18(土) 23:14:17
sclala未経験募集してる求人ないの
555デフォルトの名無しさん:2010/09/18(土) 23:44:26
Scala業務経験者なんて日本に何人いるんだ。
556デフォルトの名無しさん:2010/09/19(日) 05:19:28
>>554
Scalaどころか、未経験者募集すら大変だといいうのにw
557デフォルトの名無しさん:2010/09/19(日) 10:42:14
>>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より実用に使われているからこの方針は正しいのでしょう。
558デフォルトの名無しさん:2010/09/19(日) 13:53:14
ややこしいゲームシステムのほうがユーザが燃えるってのと似てるのかな
559デフォルトの名無しさん:2010/09/19(日) 14:09:50
じゃあゴミを取り除いたシンプルなScalaのサブセットを考えようって思考実験すると
俺には取り除けるものが思いつかない
560デフォルトの名無しさん:2010/09/19(日) 16:42:13
直行した機能一つ一つの存在感がでかいからゴチャゴチャしてるように見える
561デフォルトの名無しさん:2010/09/19(日) 19:59:12
>>521-530
>>557
ここでいってるScalaのゴミってのは、Javaとの互換性の話なの?
だとしたらそれはゴミじゃないと思うんだけど
562デフォルトの名無しさん:2010/09/19(日) 20:00:00
腐れ@の記事を見ると言語自体が
糞って書いてあるなw
563デフォルトの名無しさん:2010/09/19(日) 21:58:58
そういう大雑把な批判って、静的型フォビアか、関数型を理解できないか、なんだろうな
どうせOCamlとかHaskellのこともよく知らんのだろう
564デフォルトの名無しさん:2010/09/20(月) 13:49:20
けどRailsの作者の話だろ?
565デフォルトの名無しさん:2010/09/20(月) 14:11:44
いくつかのRubyのコードをリプレースしてみて分かったがやっぱりメンドイ。
respond_to?を大量に書かなくても済むようになったがそれでもメンドイ。
せめてif __FILE__ == $0 thenみたいなのが使えればテストが書きやすかっただろうに。
JVMの立ち上がりの遅さも手伝ってインタープリタの部分は使い物にならん印象。
betterJavaとして見ればとても良い言語だと思うけどね。
566デフォルトの名無しさん:2010/09/20(月) 14:53:59
まー、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
567デフォルトの名無しさん:2010/09/20(月) 14:58:28
>>565
テスト用のフレームワークくらいあるんじゃないのか?
Rubyでも今時、f __FILE__ == $0 ではテスト書かないでしょ?
568 ◆CgacaMDhSQ :2010/09/20(月) 17:22:36
>>565
SpecsやScalaTestみたいなテスティングフレームワークは使わなかった?
立ち上がりの遅さに関しては、sbtみたいなVM常駐型のビルドツールでカバーするのが良いかと思う
あと、インタープリタってREPLのことかな?あれは立ち上げっぱなしにしておいて必要な時にファイルをロード
する使い方が良いと思う
569デフォルトの名無しさん:2010/09/20(月) 18:08:44
ScalaTestは使った。特に不満はないが俺がやりたいのはもっと簡単なことさ。
例えばEmacsで編集中の関数の断片をちょっと動かしてみる・・・とかね。
REPL立ち上げっぱなしの使い方はunloadの仕方が分からずに敬遠してた。
Emacsからスムーズに渡せるとなおいいんだが・・・
今度調べてみる。サンクス。
570デフォルトの名無しさん:2010/09/20(月) 18:49:36
もっとScalaz使えよ
571デフォルトの名無しさん:2010/09/20(月) 19:40:43
Ruby使いってのはeval-regionも知らずにEmacs使ってるもんなのかねえ
それともruby-modeにしかないと思っているのか
572デフォルトの名無しさん:2010/09/21(火) 10:36:26
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)
573デフォルトの名無しさん:2010/09/21(火) 16:57:05
Scalaの内部DSLが読めないってRubyの作者がよく言えるな。鏡見ろよ。
って誰か言っておいて
574デフォルトの名無しさん:2010/09/21(火) 17:04:55
ThoughtWorks社のMunjal BudhabhattiとSudhindra RaoってRubyの作者なの?
575デフォルトの名無しさん:2010/09/21(火) 17:09:55
批判記事をRubyの作者にしたいやつがいるだけだろ
576デフォルトの名無しさん:2010/09/21(火) 18:12:44
ttp://twitter.com/yukihiro_matz/statuses/25098333248
これのことじゃね?
matzにとって困難とは思えん
scala叩きたいがためにアホなフリしてるように見える
577デフォルトの名無しさん:2010/09/21(火) 20:04:30
またやってんのかよw
578デフォルトの名無しさん:2010/09/21(火) 20:16:28
Rubyはメタプログラミング始めるとわけわからなくなるけど、
Scalaは素でわけがわからないときがある、と
Scalaスケーラブルプログラミングのサンプルコードを見て思た。
(一応通読はした)
var a, b = new Hoge が
var a = new Hoge
var b = new Hoge
と解釈されるのは何の冗談かと……。
579デフォルトの名無しさん:2010/09/21(火) 20:36:24
aが初期化されてない変数になるよりよほどいいと思う
580デフォルトの名無しさん:2010/09/21(火) 20:49:46
Dim a, b As New Hoge
581 ◆CgacaMDhSQ :2010/09/21(火) 20:56:11
>>578
ぶっちゃけscala.Enumerationのためにあるような機能なので、正直不要と言えば不要な気がする。
実際Scalaプログラミングしてて、この機能使う必要があるのってscala.Enumerationのときくらいだし。
2.8の限定継続使い出すと、ときどきこれがあると便利な場面が無い事も無いが、そもそも限定継続自体
ごく一部のマニアプログラマ除いてまだほとんど活用されてないからな。標準ライブラリでambとかgenerator
みたいなのをサポートしてくれると嬉しいんだが…。
582デフォルトの名無しさん:2010/09/21(火) 21:17:06
なるほど
val a, b = (1, 2)

val (a, b) = (1, 2)
で動作が違うわけね
これは確かにRubyから来た人は混乱するかもしれないな

つーか、val a, b = 1という記法があることに今気づいたけどw
583デフォルトの名無しさん:2010/09/21(火) 22:51:25
最近Mとかいうのがところ構わず噛みついて
Rubyいいだろ?な?な?言えよほらいいだろ?

って喚いているのがひどくうざい
584デフォルトの名無しさん:2010/09/21(火) 23:26:48
まー、「まとめて代入」は誤解とバグの元なのでC時代から使ってないな。
585デフォルトの名無しさん:2010/09/21(火) 23:47:48
Scalaはいろんな機能を過剰に一般化してるように思う。

メソッドの演算子表記+演算子の結合順序ルール
+プレースホルダ構文
+implicit conversion
+case class+パターンマッチ+抽出子
+traitのスタック
+for式のわけのわからない構文

と、これだけ並ぶと、もはや脳のパーザが限界を超えてハングアップする……。
586デフォルトの名無しさん:2010/09/21(火) 23:54:15
>>583
本人がRubyについて全く言及していない※にもかかわらず、
RubyがRubyがと騒ぐお前のようなやつの方がよほどうざい。

※今回の件限定で言えば、Rubyのことは知り過ぎてるから評価不能、
と最初に棚に上げてる。
587デフォルトの名無しさん:2010/09/21(火) 23:55:55
>>585
真面目に「全て把握」しようとすると辛いんだよなー。
普段、「逆引き本」の類は馬鹿にしているんだが、
Scalaに限ってはそういうものが必要なのかもしれない。
588デフォルトの名無しさん:2010/09/22(水) 00:00:38
Rubyについては持ち上げてるようで実際は貶してる書き込みが多いですよ
589デフォルトの名無しさん:2010/09/22(水) 00:11:15
>>585
そんな難しい抽象化をやめて、二項演算子があって、Auto boxingで、継承はインターフェースで
パターンマッチがなくて、for構文はC互換にした素敵な言語ができるといいのにね!
590デフォルトの名無しさん:2010/09/22(水) 00:14:27
ちょっと聞きたいんですが、
C言語やVBみたいな言語は構造化プログラミングを当たり前の時代にしましたよね
JavaやC#(Rubyでもいいです)でいえばOOPを当たり前にしたように見えます。

Scalaは何を当たり前にする事ができる言語なものでしょうか?
もちろん流行ったら、という前提で・・・

591デフォルトの名無しさん:2010/09/22(水) 00:23:19
>>585

>>メソッドの演算子表記+演算子の結合順序ルール
言語仕様嫁

>>プレースホルダ構文
言語仕様嫁

>>implicit conversion
言語仕様とcategories typesの本1冊嫁

>>case class+パターンマッチ+抽出子
言語仕様嫁

>>traitのスタック
言語仕様嫁

>>for式のわけのわからない構文
言語仕様嫁

以上
592デフォルトの名無しさん:2010/09/22(水) 00:32:31
>>591
それぞれの機能や表記がわからんなんて言っとらんわい。
そいつらを組み合わせて出てきたソースコードがカオス過ぎて、
1センテンス毎にドキュメントをひっくり返さないと分からなかったり、
検索キーワードすら分からなくて途方に暮れたりするのが問題なんだ。
593デフォルトの名無しさん:2010/09/22(水) 00:34:53
591は何がしたいのやら
594デフォルトの名無しさん:2010/09/22(水) 00:35:39
>>592

> それぞれの機能や表記がわからんなんて言っとらんわい。
> そいつらを組み合わせて出てきたソースコードがカオス過ぎて、
> 1センテンス毎にドキュメントをひっくり返さないと分からなかったり、
> 検索キーワードすら分からなくて途方に暮れたりするのが問題なんだ。

具体的に何がわからないの?それぞれの機能や表記がわかれば
組み合わせても一緒でしょ。つまるところ、理解した気になっているだけで
簡単なコードすら書けないんだよね?



595デフォルトの名無しさん:2010/09/22(水) 00:49:34
Javaしかやってないとか、Rubyしかやってないみたいなやつが面喰らってるだけだと思うがね
一回Haskellやってカルチャーショック受けてくればいいのにと思うよ
そうすればScalaなんて、なるほどねーよくできてるねーって感じになるから
596デフォルトの名無しさん:2010/09/22(水) 00:59:12
わけわかんない機能や概念が糞多いから、
初心者はぼくらのScalaから読み始めたほうが馴染み易いぞ
597デフォルトの名無しさん:2010/09/22(水) 01:06:52
記号のオペレータがググれなくて困ることはまれによくある。
598デフォルトの名無しさん:2010/09/22(水) 01:14:24
2.8.1 RC1 age
599デフォルトの名無しさん:2010/09/22(水) 01:15:35
>>595
頑張ってるのはよく分かるつもりだが、
よくできてるかどうかは……悪く言えば、型理論と泥臭い現実のギャップを埋めるために
あれこれ仕様を追加したキッチン言語がScalaだという印象

まあ言語設計は決して間違ってはいないのだろうけど、
SMLやHaskellにある、単一パラダイムがゆえの優美さは当然残ってないね
600デフォルトの名無しさん:2010/09/22(水) 01:26:31
機能がたくさんあってわけわかんないって人は、
全部の機能とか構文を等価値だと思って、全部覚えて使おうとしてるからよくなくて、
慣れている人は、ここはオブジェクト指向的に書きたいとか、
関数型的に書きたいとかの目的があって使う機能を選ぶわけで
先にそういう感覚を身につけるべきなんだよな
その点ではマルチパラダイム言語のScalaより先に機能が特化されている言語に触れたほうがいい
601デフォルトの名無しさん:2010/09/22(水) 01:38:11
(´・ω・`)
602デフォルトの名無しさん:2010/09/22(水) 02:01:38
また自演か
603デフォルトの名無しさん:2010/09/22(水) 04:07:07
Lift勉強したいけどいい本ある?
解説サイト全然ないし不安だけど
604デフォルトの名無しさん:2010/09/22(水) 04:56:22
>>603
和書、洋書含めてもこれしか出てないんじゃないかな。
http://www.amazon.co.jp/dp/1430224215
605デフォルトの名無しさん:2010/09/22(水) 08:09:28
>>603
概要とか設計思想を知りたいなら、この質問にマジレスしてるDavid Pollak本人の投稿とか参考になると思う。
http://stackoverflow.com/questions/2683914/why-would-i-use-scala-lift-over-java-spring

リクエストにGUIDを振ることのセキュリティ的な利点とか色々書いてあって、結構面白い。
606デフォルトの名無しさん:2010/09/22(水) 18:47:33
全然面白くない
607デフォルトの名無しさん:2010/09/22(水) 21:45:17
モノリシックvsモジュール
なんてデジャヴュ
608デフォルトの名無しさん:2010/09/23(木) 15:09:00
どうでもいいが疲れていると記号が顔に見えてきて困る
特に_と<の組み合わせがヤバい
609デフォルトの名無しさん:2010/09/23(木) 15:35:09
m< _, _ >m
610デフォルトの名無しさん:2010/09/23(木) 16:48:46
(_<_)
逆さにすると顔っぽい
611デフォルトの名無しさん:2010/09/23(木) 19:27:33
b(0,0);
612デフォルトの名無しさん:2010/09/23(木) 20:19:00
(T,_.T)
613デフォルトの名無しさん:2010/09/23(木) 22:23:18
>>604
それだと
本にない細かい部分に詰まったら即終了になりそうだね
使ってる企業はどうしてるんだろ
614デフォルトの名無しさん:2010/09/23(木) 23:30:25
>>613
LiftのMLで質問するとか?
615デフォルトの名無しさん:2010/09/24(金) 01:30:45
>>613
ソースを調べる。
616デフォルトの名無しさん:2010/09/24(金) 02:49:51
>>591 はサーバーリソースの無駄だから圧縮したほうがいいと思う

これで↓

>>585
言語仕様嫁

以上
617デフォルトの名無しさん:2010/09/24(金) 09:07:36
^^ まゆげ演算子(eyebrows)をこれからもよろしくね!
618デフォルトの名無しさん:2010/09/24(金) 22:08:01
このトレイトを継承するならクラス、コンパニオンオブジェクト両方つくらなきゃだめだよ。
という制限をかけたいのですが、どうすればよいですか。

例えば、とあるDTOがあり、クラスの方でtoXml, validateを実装し、
オブジェクトの方でfromXml:Dtoを実装するというルールを作りたいのですが。
619デフォルトの名無しさん:2010/09/24(金) 22:42:46
>>618
もちっときちんと書きなさい
曖昧だ
620デフォルトの名無しさん:2010/09/24(金) 22:50:42
>>618
なぜimplicit conversion使わないの?
621618: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はまだ私の理解不足のためか、この場合(どの場合もそうですが。。)使いどころがわかりません。
もう少し御教授いただけますか。
622デフォルトの名無しさん:2010/09/25(土) 08:31:22
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両方作らなきゃダメ
623618:2010/09/25(土) 13:30:12
レスありがとうございます。
そのやり方は私にはなかったので、勉強になります。
只、ちょっと実装側にとって複雑な感じがします。

とりあえず、コンパニオンオブジェクトを使用しないで、
trait Dto {
def apply(node:Node): Dto
def toXml: Node
def validate: Option[ValidationException]
}
にしようと思っています。
624デフォルトの名無しさん:2010/09/25(土) 14:16:42
scala+LiftでMySQLのDBとやりとりしたいんですが、
scala2.7.7からdbcって無くなってます?
もし無くなってたら、DBアクセスの方法を教えて頂けませんか?
625624:2010/09/28(火) 14:38:28
net.liftweb.mapper.DBを使う事で解決しました。
626デフォルトの名無しさん:2010/09/28(火) 20:30:12

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
628デフォルトの名無しさん:2010/09/28(火) 20:52:04
ごめんやっぱりよくわかんない
> 前者はプロパティのオーバーライド扱いだからNG
プロパティのオーバーライドだとimplicit conversion働かないの?
> 後者はメソッドのオーバーロードだからOK
オーバーライドされてないかな?abstract無くてもコンパイル通るけど…

上の例
val i: Int = s
だと働くっぽい。
型推論の問題の気がしてるんだが違うのかな?
629デフォルトの名無しさん:2010/09/28(火) 21:08:25
型推論の結果
val i: String = s
でオーバーライドしちゃってる
630デフォルトの名無しさん:2010/09/28(火) 21:27:42
defの場合は型推論の結果
def i: Int = s2i(s)
にしてくれてますよね、その違いはなぜ起こるのでしょうか?
631デフォルトの名無しさん:2010/09/28(火) 21:36:43
パラメータが
s: String
戻り値が
i: Int
のメソッド扱いだからじゃないかな?

多分trait側だと
パラメータなしの
戻り値が
i: Int
のメソッド扱い
632デフォルトの名無しさん:2010/09/28(火) 22:16:22
ワカンネ
traitの def i: Int が
> 多分trait側だと
> パラメータなしの
> 戻り値が
> i: Int
> のメソッド扱い

classの def i = s が
> パラメータが
> s: String
> 戻り値が
> i: Int
> のメソッド扱いだからじゃないかな?
と言っているの?(これがわからん)
633デフォルトの名無しさん:2010/09/28(火) 22:47:49
つまり馬鹿は使うなってことだ
634デフォルトの名無しさん:2010/09/28(火) 23:03:36
>>632
短縮型で書きすぎてて
class側でシグネチャ(引数と戻り値)の違う新たなメソッド定義してることになってる
だからオーバーロードになってる
635デフォルトの名無しさん:2010/09/28(火) 23:10:50
Source.fromInputStream(System.in).getLines().collect
本のサンプルコードがコンパイルできない。オワタwwww
636デフォルトの名無しさん:2010/09/28(火) 23:15:43
traitの def i: Int は抽象メソッドだから
> class側でシグネチャ(引数と戻り値)の違う新たなメソッド定義してることになってる
だとコンパイル通らないんじゃないですか?
うちの環境だと
val fuga = new Fuga
fuga.i
はStringの"1"じゃなくIntの1を返してるけど
637デフォルトの名無しさん:2010/09/28(火) 23:56:15
じゃオーバーロードじゃなくて普通に抽象メソッド実装してるってことじゃね?
638デフォルトの名無しさん:2010/09/29(水) 00:02:24
うむ、でもvalの場合は実装してくれなくて
valとdefでどうして型推論に違いが出るんだぜ?って質問してたような気がするが
もう眠いからいいやおやすみ
639デフォルトの名無しさん:2010/09/29(水) 00:50:11
>>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
}
640デフォルトの名無しさん:2010/09/30(木) 20:46:13
私は気が付いてしまいました。
Ruby の動的型付けは多くのエラーを引きおこすことに。

そして、安心してデプロイするためには 95% ものテストカバレッジを達成しなければいけないことに。
95% のテストカバレッジを得ることの代償として、私の書いたコードは(テストコードも含めて) Java で書いたものと同等のサイズにまでふくれあがってしまいました。

その上、Rails では動的なコードの変更が可能なため、開発・テスト・デプロイ中にトラブルが続出するようになりました。
高いテストカバレッジを確保しているにも関わらずです。

これらの問題にくわえて、MRI(Matz Ruby Implementation: まつもとゆきひろ氏による Rubyの実装)は速度が遅く、言語仕様も安定していません。
それなのに開発コミュニティはそのことに見向きもしません。

私は他の言語も見てみようと思うようになりました。
そんな時に Scala と出会いました。
Scala を使ってみて、これこそが私が求めていた言語だと思いました。
641デフォルトの名無しさん:2010/09/30(木) 20:49:17
仕様書とか読んだことないなぁ。何ページくらいあるんだろ。
642デフォルトの名無しさん:2010/09/30(木) 21:36:03
そして私が部下に教える言語もScala
なぜなら私の部下も大切ないやなんでもない
643デフォルトの名無しさん:2010/09/30(木) 22:36:58
大切な部下でScala。
644デフォルトの名無しさん:2010/10/01(金) 00:57:31
645デフォルトの名無しさん:2010/10/01(金) 01:33:23
JavaOne プレビュー:Javaの関数プログラミングについて、GridGainのCEOであるNikita Ivanov氏とインタビュー
http://www.infoq.com/jp/news/2010/09/functional-programming-and-gridg
646デフォルトの名無しさん:2010/10/01(金) 13:19:27
647デフォルトの名無しさん:2010/10/01(金) 13:30:33
ごめん自己解決した
まだ検討中の段階で公表はしてないってことがちゃんと書いてた
dbc2も策定中だから今はJavaと同じやり方でやっときます
648デフォルトの名無しさん:2010/10/01(金) 23:32:41
javaのメソッドで可変長引数を扱うものがあって、
かつオーバーロードしてるメソッドをscalaから呼ぶことってできるの?
なんか曖昧な参照でダメって怒られてしまう。


649デフォルトの名無しさん:2010/10/02(土) 00:32:51
>>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");
}
}
650649: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
651デフォルトの名無しさん:2010/10/02(土) 01:14:41
public void validate(final Object validatedObject)
652デフォルトの名無しさん:2010/10/02(土) 01:19:57
↑ミス。すまん。

java側
public void foo(final Object obj)
public void foo(final Object obj, final String... strs)

scala側
foo(obj)

ってやると「ambiguous reference to overloaded definition」と怒られるのだ。
653デフォルトの名無しさん:2010/10/02(土) 03:37:10
2.7.7の頃だけどここで話題になってるね
http://stackoverflow.com/questions/2159248/spurious-ambiguous-reference-error-in-scala-2-7-7-compiler-interpreter

ま、そもそも可変長引数のメソッドをオーバーロードするのは余り好ましくないってのがSunの指針っぽいけど
http://java.sun.com/j2se/1.5.0/ja/docs/ja/guide/language/varargs.html
654デフォルトの名無しさん:2010/10/02(土) 11:35:37
2.8.1 RC2 age
655デフォルトの名無しさん:2010/10/02(土) 12:49:26
ScalaはJavaの置き換えにはならないけど、
Java8までずれ込んだJavaラムダ式までの代替には有用だろうね。
Java7にクロージャが入らなくなった事で逆に市民権を得たかな。
656デフォルトの名無しさん:2010/10/02(土) 16:31:40
>>655
別にクロージャ云々は別の言語でもできるし
どうでもよい。型推論やもっと他のことを
見なさい
657デフォルトの名無しさん:2010/10/02(土) 16:34:15
見なさいって非ユーザからはそれくらいしか注目されて無いような・・・
658デフォルトの名無しさん:2010/10/02(土) 17:07:43
Javaでクロージャ導入されたらScalaいらないよね。そうだよね。わかるわかる。













次の方どうぞレベル
659デフォルトの名無しさん:2010/10/02(土) 17:16:29
非ユーザと言えばどんなトンチンカンな主張も許されるなんてわけがないだろう?
660デフォルトの名無しさん:2010/10/02(土) 17:19:27
関数型と手続き型の違いなんてそんなもんだ
661デフォルトの名無しさん:2010/10/02(土) 17:25:35
確かに言語としてのJavaがC#程度に強力ならScalaこんなに注目浴びてなかったろうな
662デフォルトの名無しさん:2010/10/02(土) 17:37:24
>>661
F#がScalaに比べてそれほど注目を集めていないのもその辺に原因があるんだろうね
テキトーな印象としては、ScalaとJavaの力の差を10とすると、F#とC#の力の差は3くらいな感じ
パターンマッチングとかも便利なんだが、ファーストクラスの関数とかに比べて強力さを少し説明しづらい
んだよなあ。
663デフォルトの名無しさん:2010/10/02(土) 17:42:26
F#が遅延評価だったりしたらそれはそれでびっくりだったんだが。
664デフォルトの名無しさん:2010/10/02(土) 18:32:28
F#にtraitみたいなのある?
あるならちょっと勉強しようかな
665デフォルトの名無しさん:2010/10/02(土) 19:32:24
いまだにtraitをextendするのには違和感がある。
そこはincludeか何かだろう・・・
666652:2010/10/02(土) 22:18:03
667デフォルトの名無しさん:2010/10/05(火) 18:24:34
scala-armについてググってたら、「あれってモナドじゃないよね」とか
「for内包記法の悪用なんじゃないの(英語)」的な声を散見したんだけど、
実際のところどうなの?

教えて識者の人!
668デフォルトの名無しさん:2010/10/05(火) 20:03:24
>>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デフォルトの名無しさん:2010/10/05(火) 20:31:56
>>668
このへん。
http://twitter.com/okomok/status/24398921185
http://polyglot-window.blogspot.com/2009/03/arm-blocks-in-scala-revisited.html

モナド則を満たしてないと、具体的にはどういう弊害があるの?
670デフォルトの名無しさん:2010/10/06(水) 00:00:25
>>669
モナド則みたさないとかありえないだろ
この糞ライブラリ作った奴だれよ?
671 ◆CgacaMDhSQ :2010/10/06(水) 01:28:26
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式で使う上でどのような問題をはらんでいるかだけど、これは使ってみないとよくわからないなあ。
672 ◆CgacaMDhSQ :2010/10/06(水) 01:28:57
あ、ごめん。s/ドキュメント自体/ソースコード自体/
673デフォルトの名無しさん:2010/10/06(水) 07:58:24
>>671
『「モナドっぽく」使えるモナドじゃない何かだけど、他のmanaged resourcesと連結する
便利機能があるんだよ』という訳であってるかな?

モナドは最近少し勉強をしてるけど、モナド則に従ってないモナドっぽいもの、
みたいのがなぜ「ダメ」なのか、みたいなのがまだよく分からない。
他のモナドと特定の組み合わせ方ができない、とかそういう感じなのか。

ちなみに、上の指摘をしてた方もARMライブラリを作ってるぽい。
こっちはきちんとモナドになってるのかな。
http://github.com/okomok/mada
674デフォルトの名無しさん:2010/10/06(水) 14:03:46
ゼノブレイドスレかと思ったら違った
675デフォルトの名無しさん:2010/10/06(水) 20:04:06
擬モナド
676デフォルトの名無しさん:2010/10/06(水) 23:58:20
山本モナド
677デフォルトの名無しさん:2010/10/07(木) 00:02:25
モナドグランプリ
678デフォルトの名無しさん:2010/10/07(木) 00:19:13

   ∧_∧  / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
  ( ´∀`)< モナドってなんか美味しそう
  (    )  \___________
  | | |
  (__)_)
679デフォルトの名無しさん:2010/10/07(木) 23:31:12
食べ物だとしたらまんじゅう系だな。
680デフォルトの名無しさん:2010/10/07(木) 23:42:01
モナドセレクション
681デフォルトの名無しさん:2010/10/08(金) 01:19:57
Scalaで異常系ってどう書くのが正しいんだろう?

Box使って、既存ライブラリの例外をラップしつつ、Failureをチェーンしていけばいいのか、
と思ったんだけど、Failure[Int]を ?~! してFailure[String]で返す、みたいなことをやろうとすると
(当たり前だけど)型が合わないって怒られるし、そもそもJVMがやってる例外を投げる処理を
自分で書いてるのも同然なので本末転倒感が。

例外のいいところって、例外を投げたコード位置と説明をパッケージできるところだと
思うんだけど、Option/Boxを使って似たようなことを(スマートに)できないのかな?
682デフォルトの名無しさん:2010/10/11(月) 19:31:39
??
「異常系処理を正常系処理と明確に分けて記述できるのがいいね」って誰かが
言い始めたから取り入れられたんですよね?

関数型で処理を実行している場合、正常系の一形態としてエラーを無視すると
いうケースが有用な場合があるよという例が一人歩きして混乱を招いている感じがあるます
683デフォルトの名無しさん:2010/10/11(月) 19:32:58
例外処理って
>「異常系処理を正常系処理と明確に分けて記述できるのがいいね」って誰かが
>言い始めたから取り入れられたんですよね?
684デフォルトの名無しさん:2010/10/12(火) 01:17:57
>>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]みたいなのを定義するとしても、
どうするのが筋がいいのでしょうか?
686685: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))
}
687685:2010/10/12(火) 12:00:25
あと、Fractional[Double]に対応するのはIntegral[Int]だと分かったのですが、
上の文脈でうまく使えない・・・orz
688685:2010/10/12(火) 12:02:38
これですが。

scala> implicitly[Integral[Int]].quot(3,2)
res0: Int = 1
689 ◆CgacaMDhSQ :2010/10/12(火) 16:17:16
>>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))
}
690685: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))

これが通らないのです・・・。
691685:2010/10/12(火) 17:21:29
あと、実装をみるとBigDecimalにキャストしてるのもむかつきます。
http://lampsvn.epfl.ch/trac/scala/browser/scala/tags/R_2_8_0_final/src//library/scala/math/Numeric.scala
692 ◆CgacaMDhSQ :2010/10/12(火) 23:45:58
>>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++のそれと似てて、初心者に厳しいですね。
694 ◆CgacaMDhSQ :2010/10/13(水) 00:44:32
>>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))
}
695デフォルトの名無しさん:2010/10/13(水) 00:54:29
2.8.0-finalで、正規表現マッチを大量に並べたパターンマッチを作ったら
コンパイラが固まったんだけど、この現象って既出?
696 ◆CgacaMDhSQ :2010/10/13(水) 01:10:56
>>695
tracに関係ありそうなキーワードで検索かけた限りでは引っかからなかった。
現象再現するコード提示してくれれば、代わりにバグ報告しても良いよー
697デフォルトの名無しさん:2010/10/13(水) 07:53:52
>>696
ありがとう、ではお言葉に甘えてお願いします。

http://www.geocities.jp/dryad_saddle/shogi/AkaraLogParser.scala.txt
汚いコードでお目汚し恐縮ですが、@tailrec def parseAkaraLog()とこです。
orElseで分けてあるところをつなげて、全て一つのmatch文に収めてやると、
scalacでのコンパイルが途中で沈黙したり。再現しますかね?
どちらかというと何かの計算量が爆発してる感じがしますが。
698697:2010/10/13(水) 08:03:00
あと、実はもう一つあって、これを最初にスクリプトとして書いていて、Windows XP上で
 scala AkaraLogParser.scala < akara2010.log > akara2010_jp.log
みたいに実行したら、実行完了後も、何かのjavaプロセスが_jp.logの方をロックし続けて、
二回目以降に「プロセスが占有して」云々というエラーが出て実行できなくなる
現象がありました(タスクマネージャから強制終了してやるとなおる)。

なんかこっちは既出そう。。
699 ◆CgacaMDhSQ :2010/10/13(水) 11:41:10
>>697
現象再現できました(Scala 2.8.0.final on jdk1.6.0_20 on Windows 7)。少なくとも、数分以内にはコンパイル
が終わらない事を確認しました。どっかで無限ループしてるのか、あるいは、なんかの理由で指数関数的に
計算量が爆発して、終わらないように見えてるのか…。現象を再現できる最小のコードにしぼる必要があるので、
多少時間かかりそうですが、報告しときます。
700685: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が欲しい訳ですが、なかなか難しくて・・・。
701685:2010/10/13(水) 15:51:21
ていうか、みずしまさんなのですね。
『Scalaで型レベルプログラミング』の最後に
「本格的にScalaで型レベルプログラミング するのは現時点では時期尚早」
ってあるのに見事にはまってます・・・トホホ
702デフォルトの名無しさん:2010/10/17(日) 04:09:46
2.8.1 RC3
703デフォルトの名無しさん:2010/10/17(日) 11:57:24
RCの意味が解ってない。

きちんとバグはバグで修正しろ
704デフォルトの名無しさん:2010/10/18(月) 06:06:18
ベータでいいだろ普通にこれ
705デフォルトの名無しさん:2010/10/19(火) 20:42:58
ListからVectorに変換したいのに、toVectorというメソッドはありません。
要素ごとに自分で構築するしかないのでしょうか?

たとえば下は通りませんが、コレクションのどれかを経由すれいいとか。
val v:Vector[Double] = List(3.2,1.2).toIndexedSeq
706デフォルトの名無しさん:2010/10/19(火) 22:06:30
>>705
val v = Vector(List(3.2,1.2): _*)
707デフォルトの名無しさん:2010/10/20(水) 00:45:19
構文が変態すぎて意味わからん
Lisperなら普通に理解できたりすんの?
708デフォルトの名無しさん:2010/10/20(水) 00:55:04
Lispの構文はむしろ単純だよ……ただ、S式はあまりに単純すぎるので
逆に読みづらいとも言われるだけ
709デフォルトの名無しさん:2010/10/20(水) 01:33:06
>>707
>>706のは、可変長引数を取るメソッドにコレクションを渡すために
:_*という専用の記法があるというだけの話だが、変態という程のことか?むしろ
簡単な話じゃないか
710デフォルトの名無しさん:2010/10/20(水) 02:11:06
短く書けた方がいいと記号を使いだすと、ろくなことにならない
ってのは歴史が証明しまくってるんだけどねぇ。
711デフォルトの名無しさん:2010/10/20(水) 02:32:35
展開構文なんて他の言語にもあるだろう
まさかScala特有だとは思ってないよな
712デフォルトの名無しさん:2010/10/20(水) 03:20:21
Scala特有だろうとなかろうとそれはどうでも良くて

C系の言語と比べて、構文もそうだし、概念にしても想像つかないやり方ばかりなんだ
コード数行読むだけで行き詰まる

構文逆引き辞典つくれ
おまえに毎日このスレに5個づつくらい貼る作業を与えてやる
713デフォルトの名無しさん:2010/10/20(水) 03:41:37
:_* でぐぐって結果が出れば良かったのに。
714デフォルトの名無しさん:2010/10/20(水) 04:23:49
レス遅くてすみません。706です。
自分はこの記法知ってましたが(思いつかなかったけど)、
「要素ごとに自分で構築する」のシンタックスシュガー
って感じがします。

要素数が巨大な場合は不自然な感じがするので、きっと他のやり方があるに違いないと思っています。
他に思いついたらまたお願いします。
715706:2010/10/20(水) 04:29:23
今のところ、ひとつ思いついてるのは
val vec = Vector.empty[Int]++List(1,2,3).toIndexedSeq
です。
716705:2010/10/20(水) 04:31:04
間違えた。質問者(705)です。
717705:2010/10/20(水) 04:39:50
>>707,712
Lispじゃないけど関数型のノリで入ると習得はすごく楽だと思いますよ。
使いこなすには経験積んで細かいテクを叩き込まないと難しそうですが。
(自分はまだこの段階)
718デフォルトの名無しさん:2010/10/20(水) 06:15:41
>>714
可変長引数は内部的にはコレクションにまとめて渡してるだけだし、
>>706のソースはList.apply()の結果をそのままVector.apply()に渡すように
コンパイルされるので、そんなに気にする必要はないと思うが。
719705:2010/10/20(水) 11:08:51
>>718
へぇ、そうなんだ。勉強になりました。
720デフォルトの名無しさん:2010/10/20(水) 15:11:55
構文が複雑すぎて、しばらく使わなかったらすぐに忘れそう
721デフォルトの名無しさん:2010/10/20(水) 22:48:58
そういう時は、チートシートを見ればいいよ。

なので、誰かいい感じのチートシートを紹介しろ。
722デフォルトの名無しさん:2010/10/20(水) 23:29:16
チートシートを探しましたが3種類しか見つかりませんでした。
一番上は初代スレ860のリンク先の更新版ですね。

=Scala= CHEAT SHEET v0.1
http://www.geekontheloose.com/wp-content/uploads/2010/02/Scala_Cheatsheet.pdf
http://cheat-sheets.org/saved-copy/Scala_Cheatsheet.pdf
Cheat sheet for scala syntax
http://anyall.org/scalacheat/
Scala to Java Cheat Sheet
http://www.softwaresecretweapons.com/jspwiki/scala-to-java-cheat-sheet
723デフォルトの名無しさん:2010/10/21(木) 00:12:46
>722
: _* が載ってるのが一つもないじゃん。
724705:2010/10/21(木) 00:44:38
>>723
読んだとき分かりにくいというのには同意するし、確かに忘れます。
>>715
で出した代替案とかは公式のAPIを探索すれば原理的には探し出せるので、
そういう意味でいいんじゃないでしょうか?
725デフォルトの名無しさん:2010/10/25(月) 00:25:20
汎用言語と思って使い始めると意外なモノがなくて苦労するよな。
少し前使ってたときはFTP関係とIME関係で詰まって放棄してしまった。
Javaのプリプロセッサだと割り切ればいい言語なんだが・・・
726デフォルトの名無しさん:2010/10/25(月) 00:36:28
だれか、
本当に役にたつ チートシートを作ったら、ヒットするんじゃない?

で、言語のお遊びみたいなのを卒業したら、
次は実践的なTIPS集だな。

Scala逆引き辞典
みたいなの。
727デフォルトの名無しさん:2010/10/25(月) 01:02:51
FTP関係とIME関係が言語で用意されてたら逆に汎用言語ではなくて
目的が限定された言語のような期がするが
728デフォルトの名無しさん:2010/10/25(月) 06:58:11
基本的なものが出揃うまで、まだ時間がかかりそうってこと?
729デフォルトの名無しさん:2010/10/25(月) 10:59:25
>>725 >>727
それは利用者が少なくてライブラリが少ないという話では

>>728
基本的なものというのが用途によるんでしょ
Javaがサーバーサイドで使われているのなら、その用途に関しては揃っているんじゃないの
730デフォルトの名無しさん:2010/10/25(月) 23:16:03
IMEは必要に迫られたことはないが文字コード変換用のフィルタはperlかPHP並の
モンが登場して欲しいところだな
731デフォルトの名無しさん:2010/10/26(火) 08:09:37
Windowsプログラミングがしたいなら、素直にC#使えばいいと思うんだ。
732デフォルトの名無しさん:2010/10/26(火) 14:32:39
うわー閉鎖的だなー
733デフォルトの名無しさん:2010/10/26(火) 21:15:06
ファーザー「.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名乗れ。
735デフォルトの名無しさん:2010/10/27(水) 19:40:57
ばた?
736デフォルトの名無しさん:2010/10/27(水) 23:34:16
2.8系をこれからさわり始めようと思うんだけど、IDE使わない場合の
ビルドツールのおすすめってなにかな?

sbtは2.8だと使えないみたいな話もあるけど・・・
737デフォルトの名無しさん:2010/10/27(水) 23:38:06
『sbt?そんなビルドツールで大丈夫か?』

『David Pollakは言っている、Mavenを使えと!』
738デフォルトの名無しさん:2010/10/27(水) 23:49:13
>>736
普通に使えるから大丈夫
739736:2010/10/28(木) 00:04:49
>>737
Mavenはあの長大なpom.xmlを見るだけで敬遠しちゃうんだよなー

>>738
とすると使えない云々は昔の話なのか。

ところで、sbt使って開発したとして、完成したプログラムはどうやって実行するのが普通?
「sbt run」だとごちゃごちゃとメッセージが出力されてうっとうしいんだけど
代替手段がよく分からない。scalaコマンドも引数指定面倒だし。

740デフォルトの名無しさん:2010/10/28(木) 01:38:16
0 to Int.MaxValue
ってやると空のRangeが返って来るんだけどなんでなん?バグ?
741デフォルトの名無しさん:2010/10/28(木) 13:56:07
ほんとだ、(0 to Int.MaxValue).lengthで-2147483648が返ってくる
Range.scalaの74行目
>def length = fullLength.toInt
でオーバーフローしてるっぽい(scala2.8.1RC4)
742デフォルトの名無しさん:2010/10/28(木) 22:45:24
某所で紹介されてた「type -->[A,B] = PartialFunction[A,B]」で、
「val pf: String --> String = { case "": ... }」って書けるのは何で?
743デフォルトの名無しさん:2010/10/29(金) 00:34:27
Type[A, B]

A Type B
って書けるようになってる。
744デフォルトの名無しさん:2010/10/29(金) 00:58:56
>>743
なるほど。ほんと何でもアリだな・・・。
745デフォルトの名無しさん:2010/11/02(火) 02:56:43
>>739
sbtはデフォルトだと2.7.7がインストールされる
Scala2.8使うには、対話モードで 'set build.scala.versions 2.8.0' して
'reload' すると2.8がダウンロードされる。
build.propertiesも更新される。あとは '+compile' すれば完了

コンソール出力ごときでストレス感じるなら
いい感じにIDE対応するまで大人しくしてれば
746デフォルトの名無しさん:2010/11/02(火) 09:20:57
IDEやだー
ゴスリングに見捨てられても僕らは死ぬまでイッイイイッイーマックス
大丈夫だ、問題ない。
747デフォルトの名無しさん:2010/11/02(火) 22:46:45
そんなemacsで大丈夫か?
748デフォルトの名無しさん:2010/11/03(水) 00:47:26
一番いいmacsを頼む!
749デフォルトの名無しさん:2010/11/03(水) 08:41:37
つYmacs
750デフォルトの名無しさん:2010/11/03(水) 14:49:39
NetBean6.9.1とプラグインでLiftはじめようとしてるけど
http://sourceforge.net/projects/erlybird/files/nb-scala/

ぜんぜんわからん
751デフォルトの名無しさん:2010/11/04(木) 00:44:49
プログラムを可能な限りextractorで実装したら、珍妙なコードになって面白い。
752デフォルトの名無しさん:2010/11/06(土) 04:13:46
IDEAの補完がもたつくの俺だけ?
補完の遅延とか同じ設定でJavaだとさくさく。なんでぞ
753デフォルトの名無しさん:2010/11/06(土) 09:46:35
というか、Scalaコードをまともに編集できるIDEって存在するの?
IntelliJ IDEAがそうなの?
754 ◆CgacaMDhSQ :2010/11/06(土) 16:23:38
>>753
現時点でScalaに一番ちゃんと対応してるのがIntelliJ IDEA
Java-Scala言語間横断した名前変更とかもちゃんと機能するのは素直に凄い
ただ、ある程度PCの性能を要求するので低スペックPCには向いて無い。
755デフォルトの名無しさん:2010/11/06(土) 22:03:01
EclipseとNetBeansだったら、どっちがまとも?
Scala 2.8で比較するとして。
756デフォルトの名無しさん:2010/11/06(土) 22:14:18
vimかなぁ
757デフォルトの名無しさん:2010/11/06(土) 23:11:15
Eclipseは普通に編集できるようにするだけで苦労するレベルだった
Emacsかなぁ
758デフォルトの名無しさん:2010/11/06(土) 23:20:35
Eclipseで普通に編集するだけでも、IDEと格闘するレベルの努力が必要だったのは、
Scala 2.7系時代の話。

2.8系になってからは、……知らん。
759デフォルトの名無しさん:2010/11/07(日) 00:13:27
Emacsはそれ自体使い始めるまでが苦労するからなぁ
面倒くさくないのならIDEAかなぁ
760デフォルトの名無しさん:2010/11/07(日) 01:20:39
今まで使い慣れているという理由以外でEmacsを選ぶ理由はあんまりないと思う。
761デフォルトの名無しさん:2010/11/07(日) 03:13:49
口車に乗せられてIntelliJ IDEA入れてみてみたが、地味すぎて死にたくなる。
762デフォルトの名無しさん:2010/11/07(日) 03:52:50
地味っつーかなんか使いづらいんだよな
763デフォルトの名無しさん:2010/11/07(日) 06:17:30
Emacsはヌーの絵が嫌い
764デフォルトの名無しさん:2010/11/07(日) 09:20:49
あれがアルパカだったら・・・いや、なんでもない
765デフォルトの名無しさん:2010/11/07(日) 13:13:33
IntelliJだが、補完とかはまあまあ安定している気がするが、
何かの拍子に一度駄目になる(空白の補完ポップアップが出るようになる)と
再起不能っぽい。

あと、上にも同じ事書いてる人が居るが、かなり遅い。
766デフォルトの名無しさん:2010/11/07(日) 13:23:55
TwitterだかGoogleだかが使ってるとかいうから試したけど
3日頑張ってEclipseに戻した
767デフォルトの名無しさん:2010/11/08(月) 00:49:00
64bit IDE+JVM だと、ClientVMないから余計厳しいかも
768デフォルトの名無しさん:2010/11/09(火) 01:11:22

今日の構文
(1 to 10).foldLeft(1) { _ * _ }

この肛門みたいな構文の意味だれか教えろ
foldLeft関数から教えろ
769デフォルトの名無しさん:2010/11/09(火) 01:30:25
>>768

10!
770デフォルトの名無しさん:2010/11/09(火) 01:34:51
答えちゃうねん
仕組みやねん
771デフォルトの名無しさん:2010/11/09(火) 01:55:10
foldというのは折り畳むという意味だな
最初に、引数の要素(単位元になることが多い)と、
レシーバーの一つ目の要素を使って計算して結果を出す
次はその結果とレシーバーの二つ目の要素を使って計算する
これを最後まで繰り返す
foldLeftというのは左から処理していくということだ
foldRightというのもあるが末尾再帰でないから、
できればfoldLeftを使ったほうがいい
関数型言語の基本的な関数の一つだな
772デフォルトの名無しさん:2010/11/09(火) 02:20:03
>>770

「肛門みたいな」が問題なら、

(1 to 10).foldLeft(1) {(ret, i) => ret * i }

の略記法が、

(1 to 10).foldLeft(1) { _ * _ }

ってわけ。
773デフォルトの名無しさん:2010/11/09(火) 02:53:26
親切にありがたいけど、 まだわかんない

def fact(n: Int): Int = {
 return (1 to n).foldLeft(1) {_*_}
}

fact(0)としたとき、この式でなんでちゃんと1が返るのか読み取れない
最初にfoldLeft(1)の1とnの0を掛けて0になっちゃわない?
774デフォルトの名無しさん:2010/11/09(火) 05:09:45
絵で描いてみろ
775デフォルトの名無しさん:2010/11/09(火) 08:23:35
いや、それは単に空のレシーバーに対しては引数の値がそのまま返るというだけ

関数型言語はライブラリのコードが簡単だから、
ソースコードを直接見て覚えたほうがいいんだけど、
Scalaはその点でコレクションのコードを見てもさっぱりわけわかめだから、
関数型の動作をScalaで覚えるのはあまりおすすめしない
776 ◆CgacaMDhSQ :2010/11/09(火) 11:06:53
>>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がそのまま返される、という言い方もできる。
777デフォルトの名無しさん:2010/11/09(火) 11:16:08
>最初にfoldLeft(1)の1とnの0を掛けて0になっちゃわない?
このレス見ると1 to 0がRange(0)みたいなのを返してると勘違いしてるんじゃないか?
778デフォルトの名無しさん:2010/11/09(火) 11:58:57
>775
ソース見るなら、2.8より前のだな。
779 ◆CgacaMDhSQ :2010/11/09(火) 22:44:09
2.8のコレクションライブラリは、コードの重複排除と拡張性を手に入れた代わりに
実装がやけに読みづらくなってるからなあ。ユーザ側としては間違いなく使い易くなってると
思うんだけど、いざ実装追いたくなったときにめんどいよね
780デフォルトの名無しさん:2010/11/10(水) 06:51:47
2.8.1.final
781デフォルトの名無しさん:2010/11/10(水) 08:54:09
2.8.1
キタ━━━━(゚∀゚)━━━━ !!!!!

akka 1.0もすぐ?
782デフォルトの名無しさん:2010/11/13(土) 02:11:18
関数型の記述ができるようになるためにはどうやって勉強したらいいかな?
関数型で書かれたアルゴリズム本とか誰か知らない?
783デフォルトの名無しさん:2010/11/13(土) 09:35:46
関数型のアルゴリズム解説というと、ML扱ってる「関数プログラミングの楽しみ」かな。

ML自体の説明は、
http://min-caml.sourceforge.net/tutorial-ml-1.htm
http://www.sato.kuis.kyoto-u.ac.jp/~igarashi/class/isle4-05w/mltext/
http://ocaml.jp/チュートリアル
784デフォルトの名無しさん:2010/11/13(土) 09:57:05
>>783
ありがとうございます。
まずHaskellから勉強する必要がありそうですね。
785デフォルトの名無しさん:2010/11/13(土) 12:23:04
Haskellはちと方向が違う
786デフォルトの名無しさん:2010/11/13(土) 12:45:57
『関数プログラミングの楽しみ』ってHaskellの本だよね?
787デフォルトの名無しさん:2010/11/13(土) 13:13:54
やっと hellolift できたお!
最初Mavenでアーキタイプ指定してプロジェクトをダウンロードして、そのあと SBT で
sbt update
sbt jetty-run

ってやったんだけど、これ全部SBTでできないの?
前にSBTだけで構築しようとして試行錯誤したときは
sbt jetty-run で jetty がねーよってエラーでてダメだったんだよね
788デフォルトの名無しさん:2010/11/13(土) 13:28:00
既存のアルゴリズム本を関数型言語で書き直したみたいな物があれば一番いいんだけど、そんなのないよね?
789デフォルトの名無しさん:2010/11/13(土) 13:52:05
洋書ならあったような
790デフォルトの名無しさん:2010/11/15(月) 00:13:03
Javaではメンバー変数はデフォルトprivateで、それが「良い仕様」って事になってたと
思うんだけど、デフォpublicなScalaはなんか思想か解釈が変わったの?
どう気持ちを切り替えたもの?
791デフォルトの名無しさん:2010/11/15(月) 00:23:46
privateだったっけ?
792デフォルトの名無しさん:2010/11/15(月) 03:31:51
>>790
Java の場合、フィールドを public にしたら、後で、値の取得・設定時に何らかの処理を挟みたくなっても呼び出し側の
コードを getter/setter 呼び出しに変更してもらう以外に行う術がない。
だから、フィールドに直接アクセスさせずにあらかじめ getter/setter 経由にしておく。
一方、Scala の場合、呼び出し側のコードを変更することなしに、フィールドをプロパティに変更するだけで可能になる。
だから、Scala の場合はデフォルト public で問題ない。
と解釈している。

>>791
Java の場合、デフォルト(公開識別子省略時)はパッケージ private だね。
ただ、>>790 の言う「メンバー変数はデフォルトprivate」の部分は、「フィールドを書くときには private を明示的に付けて
宣言するのが良い仕様のデフォルト(標準)」と言っているんだと思う。
793デフォルトの名無しさん:2010/11/15(月) 03:54:41
>>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がどうなるかは知らない。
794デフォルトの名無しさん:2010/11/15(月) 04:08:52
ついでに聞くけど、C#の

public int piyo { get; private set; }

も真似出来る?
自動実装のプロパティで、且つセット出来るのは内側からだけって奴。
795デフォルトの名無しさん:2010/11/15(月) 08:11:07
一つ上のレスも見れんのか
796デフォルトの名無しさん:2010/11/15(月) 16:09:14
LinkedIn Signal: Scala, JRuby と Voldemortのケーススタディ
ttp://www.infoq.com/jp/articles/linkedin-scala-jruby-voldemort
797デフォルトの名無しさん:2010/11/15(月) 23:11:33
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

です。
799デフォルトの名無しさん:2010/11/17(水) 00:17:56
>>798

たいして面白くもない創作文章をあちこちのスレにマルチ投稿するなよ。


ところで、Cygwinって今時使っている人居るのかなあ。。
800デフォルトの名無しさん:2010/11/17(水) 11:34:30
>>799
使ってるよ
ただし今はもはや実質 ssh クライアントとしてしか使ってないけど

Cygwin なかったら Windows でどうやって ssh すればいいのかわからんw
801デフォルトの名無しさん:2010/11/17(水) 12:12:21
git と zsh で grep **/* のためにつこうとる
Tortoiseのようなエクスプローラ拡張系は再起動求められるからいややねん
802デフォルトの名無しさん:2010/11/17(水) 13:05:59
最近、sbt流行っとるの?
803デフォルトの名無しさん:2010/11/17(水) 14:22:14
>>800
puttyおすすめ
804デフォルトの名無しさん:2010/11/17(水) 15:07:32
http://groups.google.com/group/play-framework/browse_thread/thread/cf029b08e0807793

Scala + Play! Framework で、RailsライクなScailsを作るそうですよ。
805デフォルトの名無しさん:2010/11/17(水) 23:00:49
>>804
ジョークや言うてはるで
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
みたいなアクセスができるとなおよい。

質問が乱暴で申し訳ないが、ピンときたら教えてくださいませ。
807806: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"))
808デフォルトの名無しさん:2010/11/19(金) 21:29:41
decimalNumberの代わりにwholeNumber使うとおk。
あとドキュメント読むと分かるけど、guardは入力を消費しない(it will not consume any input)ので、
guard(".html")にマッチした時点で".html"という入力がまだ余っている。
んでparseAllは入力の最後まできっちりパースしようとするから、".html"が余ってんぞコラってエラー出す。
parseAllをparseに置き換えたら通る。
別にguard使わんでも".html"にマッチさせて<~で読み捨てればいいと思うけど
809806:2010/11/19(金) 22:08:31
おぉ、通った。ありがとうございます!
IDE使ってない(てかそもそもいいのはない?)ので、実行時エラーでは手も足も出ないなぁ。
思いがけないところで勉強になりました。
810デフォルトの名無しさん:2010/11/19(金) 23:00:31
スタックトレース嫁!!

あと、パースして返ってきた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) こんな感じで。
811デフォルトの名無しさん:2010/11/19(金) 23:13:55
あ、>>808のparseAllはパースに失敗するだけで、
get呼んだところではじめて例外が投げられるんでしたごめん
812デフォルトの名無しさん:2010/11/20(土) 16:40:47
NetBeansからIntelliJ IDEA + sbtに移行して、わりと使いやすくなった。

参考になったのはこのページ↓
http://heikoseeberger.blogspot.com/2010/08/how-to-setup-scala-project-with-sbt-and.html
813デフォルトの名無しさん:2010/11/22(月) 00:21:06
>>812

NetBeansはどのへんがだめでしたか?
814デフォルトの名無しさん:2010/11/23(火) 01:38:24
ところでお前らScalaで学ぶ関数脳入門どうだったよ?
815デフォルトの名無しさん:2010/11/23(火) 02:01:45
あー、そうか、もう発売されたか。買おうかな。
816デフォルトの名無しさん:2010/11/23(火) 02:48:34
へーそんな本が
817デフォルトの名無しさん:2010/11/23(火) 02:52:49
なんとか脳ってネーミングセンス自体が、00年代脳って感じでついて行けません。
818デフォルトの名無しさん:2010/11/23(火) 02:59:41
だれかさっさとLift本の翻訳してください
819デフォルトの名無しさん:2010/11/23(火) 11:55:31
amazon
>Scalaで学ぶ関数脳入門
>この本は現在お取り扱いできません。

なんで?
820デフォルトの名無しさん:2010/11/23(火) 16:19:14
ん?Amazonで普通に買えるが。

-------------
オブジェクト指向プログラマが次に読む本 -Scalaで学ぶ関数脳入門 [単行本(ソフトカバー)]
株式会社テクノロジックアート (著), 長瀬 嘉秀 (監修), 町田 修一 (監修)
価格: ¥ 3,339 通常配送無料 詳細
-------------

ちなみに、、、
半年ほどボチボチScalaを学んできたが、いまいち、取得できない。
関数型言語習得して、何が良いのだろう。メリットは...?

C++,Java,Rubyに比べると、Scalaは格段に難しく感じる。
Scalaを取得するメリットが分からなくなってきた。。

スランプかなあ。
上述の本買ってみるか。内容不明だけど。
821デフォルトの名無しさん:2010/11/23(火) 16:38:55
連投でスマヌが、、

Scalaで、普通に int型の変数を宣言することって出来なかったっけ?

C言語で言うところの
int i;
みたいなの。


scala> var i:Int = 0
と初期値を指定すれば良いのだが、
scala> var j:Int
とか
scala> var k = new Int
はエラーなんだよなあ。
822デフォルトの名無しさん:2010/11/23(火) 17:01:08
さらに連投スマヌ

>>820
の本に関連したiPAD用アプリ。

----------
http://www.speakipad.com/ipad-apps/scala-ebook-books

Description:

iPad上でScalaのソースコードを動かしながら、関数脳を学習できるブックアプリです。
技術評論社刊『オブジェクト指向プログラマが次に読む本?Scalaで学ぶ関数脳入門』の一部を元にしています。
----------

ScalaってiPad上でも動いたんだっけ?

と思ったら、サーバ上で実行している、らしい。
823デフォルトの名無しさん:2010/11/23(火) 17:12:49
>>821
var x: Int = _
824デフォルトの名無しさん:2010/11/23(火) 17:19:17
関数型がわからない人が保守できなくなるリスクを負ってまで関数型で書くメリットはあるんだろうか?
825デフォルトの名無しさん:2010/11/23(火) 17:26:47
手当たりしだい一時変数使いまくって、どこからリファクタリングの手をつけたらいいかわからないような劣悪なコードを書く人に人生をあきらめさせるメリットがある
826デフォルトの名無しさん:2010/11/23(火) 17:35:16
>>825
関数型で書けば劣悪なコードが減るってこと?駄目なやつは関数型だろうがなんだろうが結局劣悪なコード書きそうな気がするんだが。
827デフォルトの名無しさん:2010/11/23(火) 17:40:49
>>823
> var x: Int = _

おおー!
ありがとうございました。 (_<_)

しかし、Scalaは、記号が分からん。どこかに一覧表はないものか。。。


>>825

なるほど。
大昔のC言語みたいに「関数の先頭以外では、変数宣言できない」ってことはないから、
「変数は使うときに宣言せよ」→「使うときには初期値分かっているから、宣言と同時に代入しろ」、ってことか?
828デフォルトの名無しさん:2010/11/23(火) 18:13:20
>>821
var i = 0
でも可。型推論で i はInt型になる

Javaできるならコップ本が分かりやすいと思うなー
829デフォルトの名無しさん:2010/11/23(火) 18:50:55
>>828
> var i = 0
> でも可。型推論で i はInt型になる


初期値なしで変数宣言したかったので。。


次のように、クラスのメンバ変数を宣言するときに、
C++とかだったら初期値(初期化)なしで、とりあえず変数宣言することが多いが、
おなじようにScalaでも書きたかったので。
---------
class Test1 {
var m:Int= _ ; //<< ここ
def setM(s:String) = { m=s.toInt}
def view = {println( m ); }
}
---------
830デフォルトの名無しさん:2010/11/23(火) 19:01:06
sbtって2.7.7までしか対応してないよね?
それより新しいバージョン指定しても、2.7.7使うんで(キリッ とか言われる気がする

64bit Windowsなんだけど、IntelliJ IDEAでfsc使おうとするとコンパイルが終わらない
コンパイルのプロセスをタスクマネージャから強制終了すると実行結果が返ってくるからサーバーの連携に失敗してる?
海外のフォーラム見て回ってるんですが、似たような症状の人いませんか
831デフォルトの名無しさん:2010/11/23(火) 19:09:39
>>829
Scalaでは、初期化無し(デフォルト値で)でvarを宣言するのはあまりいいスタイルでは無い気がする
コンストラクタ中で必ず初期値が代入されるようにするのが定石というか…

>>830
sbtはScalaのバージョン指定で2.8.0とか入れれば、ビルド対象のプロジェクトは2.8使うようになるよ
デフォルトで2.7を勝手にダウンロードするのはたぶんsbtのブートに使ってるのであって、プロジェクトの
設定とは別物。

IDEA+fscの方は同じ状況になったことが無いのでよくわからない
832デフォルトの名無しさん:2010/11/23(火) 19:19:52
sbt-0.7.5.RC0ではプロジェクト作成時にデフォルトで2.8.1使うようになってる
833デフォルトの名無しさん:2010/11/23(火) 19:36:11
オブジェクト指向プログラマが次に読む本 -Scalaで学ぶ関数脳入門
ってどうなの?

株式会社テクノロジックアートってやばい感じするんだけど?
834デフォルトの名無しさん:2010/11/23(火) 19:40:37
>>829
var x: Int = _

これは初期値なしって意味じゃないよ
デフォルト値(Intなら0、参照型ならnull)で初期化する
835デフォルトの名無しさん:2010/11/23(火) 19:48:55
>>829
その例だったらOption使うのがいいのでは

class Test1 {
var m: Option[Int] = None
def setM(s:String) { m = Some(s.toInt) }
def view { m foreach println }
}
836デフォルトの名無しさん:2010/11/23(火) 20:31:38
別に初期値あってもよくね
837デフォルトの名無しさん:2010/11/23(火) 20:40:34
Javaの確実な代入みたいな機能があれば、
わざと初期化しないでおいて
分岐のどれかで初期化漏れない事を
コンパイラにチェックさせる手もあるが。
838デフォルトの名無しさん:2010/11/23(火) 20:59:11
>>833
それだけでチェックする気にもなれない
839デフォルトの名無しさん:2010/11/23(火) 21:08:40
>830
> 64bit Windowsなんだけど、IntelliJ IDEAでfsc使おうとするとコンパイルが終わらない

たしかに、そういう時はある。
外部で別途fscを立ち上げて置いてから、
Compiler > Scala Compiler の "Use fsc"にチェックを入れて使うのが確実な気がする。
Process Explorerで監視推奨。

つーか、sbt用意したのなら、IDEAでコンパイルする必要があんまり無いような。
あと、俺は使ってないけど、IDEA用のsbtプラグインが有るので、使ってみれば?
840デフォルトの名無しさん:2010/11/23(火) 23:48:44
久し振りにPredefみたら、知らん関数がいくつかあった。
あと、"hoge = %d".format(hoge) とか、いつからあったんだ?
841デフォルトの名無しさん:2010/11/24(水) 00:25:36
>>840
記憶してる限り、2.7前後で入った関数だったはずなので、結構前からあると思うよ
842デフォルトの名無しさん:2010/11/24(水) 01:34:59
sbtの依存ライブラリを書くところ、指定のjarを除外したい時にはDSLで書けない
みたい?

除外指定の部分だけ、
override def ivyXML = ...
でXMLを書いたら、一応目的は達せられたけど、ちょっと不格好になった。
843デフォルトの名無しさん:2010/11/24(水) 20:34:03
implicitパラメータでevって言うパラメータ名なのをよく見るんだけどevってなんの略?
844デフォルトの名無しさん:2010/11/25(木) 02:01:54
>>843
evidenceの略
845デフォルトの名無しさん:2010/11/25(木) 11:43:55
>>844
d
846デフォルトの名無しさん:2010/11/27(土) 00:21:38
Scalaで学ぶ関数脳入門かった
読みやすくてわかりやすい
847デフォルトの名無しさん:2010/11/27(土) 09:20:06
>>846
社員乙
848デフォルトの名無しさん:2010/11/27(土) 13:47:33
俺も俺も
849デフォルトの名無しさん:2010/11/27(土) 14:54:22
そんなに評判は悪くなさそうなので買ってきてみる。気が向いたらレビューするかも。
850デフォルトの名無しさん:2010/11/27(土) 15:06:19
表紙絵とタイトルが最悪。
中身は、意外に広い範囲を扱ってた。
851デフォルトの名無しさん:2010/11/28(日) 00:10:02
852デフォルトの名無しさん:2010/11/28(日) 00:12:02
>>850
> 表紙絵とタイトルが最悪。
> 中身は、意外に広い範囲を扱ってた。

「ボクらのScala 次世代Java」もそんな感じ。

タイトルと本の中身が一致していない。
中身は非常に良いのに、タイトルで避けられていたら残念。

あと、プログラミングのための線形代数 とかいう本も、
中身とぜんぜんミスマッチした表紙絵だったなあ。



ああいうのって、作者の意向と関係なしに、出版社側が勝手にタイトルとか表紙絵
をつけるみたいだけど、企画した人は批評の数の分だけ減給にするべきだな。


853デフォルトの名無しさん:2010/11/28(日) 02:24:23
関数型をアピールすると売れるのかね
とてもそうは思えないけどw
854デフォルトの名無しさん:2010/11/28(日) 02:40:10
冒頭にOdersky先生のコメントが入ってるけど、先生にはタイトルを
"Getting into Functional Programming World in Scala"って伝えてるらしい。
855デフォルトの名無しさん:2010/11/28(日) 03:25:46
Haskellの本で純粋関数型言語に入門してちびった俺からすると、
Scala「で」関数型に入門という趣旨はありだと思うけどね。

タイトル見て多少ミスリードはあるが、Scala=関数型言語という売り方ではないし
いや中身は読んでないけどw

マルチパラダイム言語ってのはわかってて付けてるでしょう。
856855:2010/11/28(日) 03:27:34
> 内容紹介
> 本書はオブジェクト指向では飽き足らなくなったエンジニアに、話題の関数型言語であるScalaを使って、
> 今エンジニアに求められる必須プログラミングコンセプトを解説します。 
> 関数型言語の基本が身につくほか、コレクションや再帰、並行プログラミング、DSLなどの勘所を、
> 実際のコードを見ながら理解することができます。
http://www.amazon.co.jp/dp/4774144363/


「関数型言語であるScala」
「関数型言語であるScala」
「関数型言語であるScala」
「関数型言語であるScala」
「関数型言語であるScala」

早速、撤回するわ orz
857デフォルトの名無しさん:2010/11/28(日) 09:17:19
Lispだって関数型言語と普通に言われてるんだから、ありだろ
858デフォルトの名無しさん:2010/11/28(日) 11:03:11
Lispは手続き型言語だろ
859デフォルトの名無しさん:2010/11/28(日) 11:53:45
Lispを関数型言語うんぬん指摘するネタ飽きた
860デフォルトの名無しさん:2010/11/28(日) 14:32:35
関数型言語でもある=>関数型言語である
という事じゃないか。
@itあたりに連載あるから、本みなくてもどういう感じか分かるはず。
861デフォルトの名無しさん:2010/11/29(月) 09:22:44
>>860
それくらい行間よめよってことだろうが、ちょっとまってほしい
まがりなりにも関数型言語をかたるなら命題くらいは丁寧に扱って欲しいものではないだろうか
862デフォルトの名無しさん:2010/11/29(月) 18:25:43
かたるを漢字にしていないところがポイントかw
863デフォルトの名無しさん:2010/12/01(水) 02:47:42
InteliJ IDEAのAOTコンパイルした32bit版(windowsとlinux)
http://www.excelsior-usa.com/blog/excelsior-jet/native-compiled-intellij-idea/
一緒に、Eclispe 3.6のWindows版もあった。
http://www.excelsior-usa.com/jetgallery.html
ちなみに64bit版はJETのAOTがまだ対応してないので無い。
http://www.excelsior-usa.com/blog/category/excelsior-jet/64-bit/

GCの長い停止が解消される(Linuxのが顕著)ということらしいが、
まだインストールしてないので、どんな体感になるのかよくわからない。
864デフォルトの名無しさん:2010/12/01(水) 05:59:39
試してみたけどJREがいらなくなるだけで特にメリットはないな。
体感速度も変わらず。AOTコンパイラなんて無駄なもの作っちゃってる会社はかわいそうだわ。
努力が何のプラスにもなってない
865デフォルトの名無しさん:2010/12/01(水) 11:54:09
定性的には、
起動時 AOT>int>JIT
起動後 JIT>AOT>>int
なんだろうけど、HotSpot Client VMが、他のAOTより起動が速いという…
866デフォルトの名無しさん:2010/12/02(木) 08:03:52
関数脳本、100ページくらい読んでみたけど、「関数型を学びながらScalaに入門したい」
という向きにはかなり良書の匂いがする。文章がしっかりしてるし説明が非常に丁寧。
単なるBetter JavaとしてScalaに興味がある人向けではないけど、入門書のバリエーションが
増えたという意味では良さそげ。
867デフォルトの名無しさん:2010/12/02(木) 23:16:10
すみません。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 ))
^

この挙動はどう理解すればよいのでしょうか?
868デフォルトの名無しさん:2010/12/02(木) 23:18:25
すみません。
空白を変換し忘れました。
上の最後のパースエラー箇所指摘記号(^)はxの直後の空白をさしています。
869 ◆CgacaMDhSQ :2010/12/03(金) 00:19:27
>>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]が生成されてしまったんだな。
870866:2010/12/03(金) 00:29:22
「関数脳」本読了。
関数型プログラミングの作法について一通り学べる感じなので、なかなか良いのではないでしょうか。
871デフォルトの名無しさん:2010/12/03(金) 00:29:42
>>869
うまくいきました。
ありがとうございます。

なるほど、式全体がParser[String]型でも部分式にはParser[Char]型が推論されうるんですね。
暗黙型変換は便利だけど、つまづいたときに原因究明がやっかいですね。
872デフォルトの名無しさん:2010/12/03(金) 01:10:46
>>869
新種の顔文字かと思た → '('と')'
873 ◆CgacaMDhSQ :2010/12/03(金) 01:42:07
>>871
ところで、指摘し忘れていたけど、ident ^^ { case s => s }は同じもの返してるだけだから無駄なので単にident
でいいし、"(" ~ term ~ ")" ^^ { case s1~s2~s3 => s2 }は、"("と")"の部分の値を利用しないので、
"(" ~> term <~ ")" とするのが良いと思うよ。まとめると、

def term : Parser[String] = ident | "(" ~> term <~ ")"
874デフォルトの名無しさん:2010/12/03(金) 23:29:52
>>873
ありがとうございます。
便利なコンビネータですね。
scalaはちょっと便利な小技が満載で楽しいです。
875デフォルトの名無しさん:2010/12/04(土) 10:42:04
emacsのscala-modeで使っている人いる?
scalaインタプリタを生で使っていると補完(tab)やヒストリ(C-p)がきくのに
emacsからだとどちらも無効になる。
なんとかならない?
876デフォルトの名無しさん:2010/12/04(土) 13:01:36
>>875
補完は無理っぽいね
ENSIMEのソースにも「TODO Fix completion...」って書いてあるし
ヒストリは M-p と M-n で動くのでは?
877デフォルトの名無しさん:2010/12/04(土) 17:36:49
ensime で補完つかって編集したものを ensime-inf-eval-region すれば問題ない。
878デフォルトの名無しさん:2010/12/05(日) 00:55:22
http://www.scala-lang.org/node/959
日本の本の表紙が異質すぎる。
特に関数脳入門はなんとかしろ。
879デフォルトの名無しさん:2010/12/05(日) 05:28:43
>>878
コップ本と入門本はカッコいいじゃん
外国の表紙はいかにも教科書っぽくて
しかし日本の本、出過ぎだな
明らかに供給過多
それでいてLiftの本は出ないと
880デフォルトの名無しさん:2010/12/05(日) 08:38:00
>>876
ありがとう。
ヒストリは確かに動きました。

しかしロードは遅いしエラー時の行番号もでないしメモリリークはあるしで
結局scalaインタプリタはコンパイラのおまけと思った方がいいね。
881デフォルトの名無しさん:2010/12/05(日) 18:21:06

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が出力されるんだけど何故?
882デフォルトの名無しさん:2010/12/05(日) 18:50:32
わかった、こうすると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
883デフォルトの名無しさん:2010/12/05(日) 20:27:57
> val it = Iterator("a", "number", "of", "words")
> val it2 = it dropWhile (_.length < 2)
> println(it.next())
どういうこと?
it dropWhile (_.length < 2)
の評価によってitの参照しているIteratorオブジェクトは変化すると思ってたのだけど違う?
なぜaが出力されるかわからない。
884881:2010/12/05(日) 20:49:20
Iteratorのソースを見ると新しいイテレータを作って返すだけでこの時点ではまだ自分自身は変化させないように見える
ttps://lampsvn.epfl.ch/trac/scala/browser/scala/tags/R_2_8_1_final/src//library/scala/collection/Iterator.scala#L526
toStringはhasNext使ってnon-emptyかemptyか出力するけど
ttps://lampsvn.epfl.ch/trac/scala/browser/scala/tags/R_2_8_1_final/src//library/scala/collection/Iterator.scala#L1017
dropWhileで作られたイテレータはhasNextでskip()を呼び出してるのでこうなると。
885881: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
886デフォルトの名無しさん:2010/12/05(日) 23:41:52
>>884
ありがとう。よくわかった。
やっぱりライブラリはソースを見て使わないと駄目だね。
887デフォルトの名無しさん:2010/12/06(月) 08:38:50
>>878
> 日本の本の表紙が異質すぎる。
> 特に関数脳入門はなんとかしろ。


関数脳入門は、本の内容は良いのに、表紙イラストで評価さげているな。

あのイラストは、本文では全く使われていなくて、表紙だけに使われているんだけど、
あれにいくらのお金が入っているんだろう?

オレが、この本の売り上げを分配するとすれば、

・執筆者 : 8割 (内容はすばらしい)
・校正者 : 3割 (誤植少なそうだ。)
・編集者 : 4割 (企画としてはまあまあ良い。)
・タイトル考えた人: なし。 ( もっと頭ひねろ)
・表紙イラストレータ: - 50%(イラスト使ってやったんだから金払え)

だね。
888デフォルトの名無しさん:2010/12/06(月) 08:50:35
>>879
> コップ本と入門本はカッコいいじゃん

コップ本のあの表紙は、日本語版のオリジナルなんだね。
アレは、なかなかセンスが良いし、カッコイイよね。
コップ本というように愛称で呼ばれるにはそれだけの理由がある。


>それでいてLiftの本は出ないと

Lift本みたいなは、電子書籍で出て欲しいね。
ササっと出版されて、ササっと読まれるような旬の話題を扱った本は、電子書籍が良い。
889デフォルトの名無しさん:2010/12/06(月) 09:14:35
x もっと頭ひねろ

o もっと頭ひねれ
890デフォルトの名無しさん:2010/12/06(月) 09:17:10
>>888
ここに頼め
http://tatsu-zine.com/
891デフォルトの名無しさん:2010/12/06(月) 09:25:40
amazonで関数脳本の中古の方が高いのはなんでなんだぜ?
892デフォルトの名無しさん:2010/12/06(月) 09:29:23
ボッタ栗狙いの転売ヤーが出品中だから
893デフォルトの名無しさん:2010/12/06(月) 12:02:48
Lift本は、2冊目が出るんだな。2.1対応か。
894デフォルトの名無しさん:2010/12/06(月) 13:02:55
>>891
> amazonで関数脳本の中古の方が高いのはなんでなんだぜ?

Amazonでマーケットプレース出品者による、定番の売り方だよ。


一時的に売り切れになる/なった本は、高い値段にして中古本を出品する。
それを見て勘違いして
「これは中古でプレミアムが付いた値段でしか買えないんだ→すぐ買おう」
と言う感じで買っちゃう人が、たまにいるから。

そういうわけで、新品を中古として出品することもある。
895デフォルトの名無しさん:2010/12/11(土) 00:25:30
package文があるとインタプリタでエラーになるのは仕様?
896デフォルトの名無しさん:2010/12/13(月) 04:58:02
.NETでScalaが動けばそれが最強
とおもったが
アクターなんぞ使わんでも並列は十分充実してるわな
897デフォルトの名無しさん:2010/12/14(火) 01:26:36
MS界では、VC++にActorライブラリがあるが、.netにはAxumという言語作ってるので、ライブラリがないみたい。メンテナンス大丈夫か?
http://parallelpatterns.codeplex.com/
http://blogs.msdn.com/b/maestroteam/

JVMなら、Java実装から、scala、AkkaのOTPっぼいのまで色々ある。(使われてる?)
898デフォルトの名無しさん:2010/12/14(火) 01:57:36
2.9に入るというSTMと並列コレクションが楽しみ
899デフォルトの名無しさん:2010/12/14(火) 13:57:06
再代入出来ない利点活かして
効率的に、簡単に、する仕組みは大歓迎
900デフォルトの名無しさん:2010/12/14(火) 15:55:25
http://eed3si9n.github.com/scala-collections-doc-ja/
これ読んで勉強になった
901デフォルトの名無しさん:2010/12/14(火) 19:18:40
>>897
上のURLで掲示してるTask Parallel Libraryなら標準ライブラリ入りしてるので
メンテ大丈夫かといったら大丈夫に決まってるわけで……。
RoboticsのConcurrency and CoordinationやMS Researchのプロジェクトなど
.NETにも野心的で面白いものはいっぱいある。
902デフォルトの名無しさん:2010/12/15(水) 04:35:01
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として爆発的に普及する
903デフォルトの名無しさん:2010/12/15(水) 07:12:15
Prologのように細々と生息
904デフォルトの名無しさん:2010/12/15(水) 08:13:25
え、Prologって生息してんの?
とりあえず今Javaがピンチなんで、Scalaの未来はそれに影響されるかと
905デフォルトの名無しさん:2010/12/15(水) 08:17:39
Javaがピンチってw
906デフォルトの名無しさん:2010/12/15(水) 09:57:09
ORACLEに飼い殺しにされるよ
907881:2010/12/15(水) 12:29:13
ttp://dailynewsagency.com/2010/12/13/popular-programming-language/
まああてにならんけど、StackOverFlowとかGithubとか使ってる層にはすでにそこそこ人気ってことか
908デフォルトの名無しさん:2010/12/15(水) 16:36:27
>>907
その記事を信じるならScalaは成長軌道に乗ったという事ですね。
Pythonの歴史をみると言語が離陸するとライブラリがどんどん増えます。
今後のScalaは2000年以降のPythonのようにライブラリが急増するのでしょう。

Python Storylines
http://www.michaelogawa.com/michael/projects/evolines/python.svg
code_swarm - Python
http://www.vimeo.com/1093745
複雑に絡み合うコード……プログラムの進化を視覚化すると大変なことに
http://dailynewsagency.com/2010/10/28/code-evolution/
909デフォルトの名無しさん:2010/12/15(水) 18:27:47
インフラ周りでJava使っていた層がScalaにじわじわ移住しているっぽい。
あと、ApacheのJCP脱退で、Apache関連のJavaベースのソフトどうなるかだね。
まあ、C++的なポジションになるのかね。
910デフォルトの名無しさん:2010/12/15(水) 20:58:25
言語と処理系の完成度をもう少し高めて欲しいな。

関数型言語を謳っているが型推論が弱いから、面倒で仕方ない。
せめて多相型推論を導入してくれ〜。
無名関数の引数にいちいち型注釈をつけさせないで欲しい。
911デフォルトの名無しさん:2010/12/15(水) 22:45:59
ScalaでネックとなってるのはIDEと日本語の情報くらいだろ
Javaで培った知識と技術はそのまま活かせるんだから伸びないわけがない

採用実績もあるんだしな
912デフォルトの名無しさん:2010/12/15(水) 23:01:28
2週間ほど仕事でeclipse+Scala IDE使ってみたけど
そんなに悪いもんでもなかったよ

流行るかどうかはあやしいいよね
職場の反応見てると
Javaで事足りる層にとっては面倒な物にしか見えないらしいし
結局Scalaで書いてjadしたJavaコード見せると安心する人多いww
913デフォルトの名無しさん:2010/12/15(水) 23:07:29
流行ることはないだろうな
流行る必要もないし
いまだにJava1.4使ってるSIerがScala採用とかありえんw
914デフォルトの名無しさん:2010/12/16(木) 00:09:12
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上には、スクリーンショットは見当たらないけど、
実際に起動してみると、なかなかおおがかりなアプリだと思う。
916デフォルトの名無しさん:2010/12/16(木) 00:32:45
>>914
jadで吐いたコード眺めてて
言語としてはあれだけど
Javaから使える便利なライブラリとしてならアリだと思った
917デフォルトの名無しさん:2010/12/16(木) 01:38:52
>>912-915
実際にScalaでしかできないことって何かある?

>>912じゃないけど初学者として

>Javaで事足りる層にとっては面倒な物にしか見えないらしい

というのが気になってる。

Rubyスレみたいに、Rubyを選ぶ利点はRubyで書けることだ、なんていわれたら
新進気鋭の会社がエンジニアを釣るのには良さそうな言語なんだなと思ってしまうよ。

逆に言うとまさに「Javaで事足りる層に」は無用なんじゃないかと


担保のなけりゃ言語を覚える気もないのかお前は!というのとそういうわけではなく雑談と思ってくれればいいけど。
918デフォルトの名無しさん:2010/12/16(木) 02:23:41
しばらくRubyやC#触ったあとにJavaに戻ってくると、なんだか古代の言語を触ってるような
印象を受けて萎える。

そんな時に「Scalaがあるよ!」と言えば、受け入れやすいと思う。
919デフォルトの名無しさん:2010/12/16(木) 02:24:37
そりゃ事足りるやつには無用なんじゃね、なんでもな
スクリプト言語ブームだって、本当はJavaで事足りてるやつには無用だっただろうな
920デフォルトの名無しさん:2010/12/16(木) 02:59:46
>>917
JavaプログラムにできなくてScalaプログラムにできる事は何か、
という意味ならそんなものはないに決まっています。
JavaやScalaも含めて多くのプログラミング言語はチューリング完全であり、
計算能力(計算速度ではなく何を計算できるか)は全く同じです。
JVM系言語は同じJVMの上で動かすのだから何を操作できるかは全く同じです。

広く使われるプログラミング言語が交代するのは、
ソフトウェア作成に必要な労力がプログラミング言語によって違うからです。
Scalaの意義はJavaより簡潔に何をしたいか記述できる事、ただそれだけです。
921デフォルトの名無しさん:2010/12/16(木) 03:02:17
>>920
> 広く使われるプログラミング言語が交代するのは、
> ソフトウェア作成に必要な労力がプログラミング言語によって違うからです。

かつてそんなことがあったか?
922デフォルトの名無しさん:2010/12/16(木) 03:15:34
言語が交代するのは企業が無理矢理流行らせるときか、キラーアプリが出るときでしょ
Scalaもどこかデカいところが採用するのを待つしかないね
923デフォルトの名無しさん:2010/12/16(木) 03:38:43
>>921
アセンブリ言語で全て記述できるのに
高級言語、構造化プログラミング言語、オブジェクト指向言語が
使われるようになったのはソフトウェア作成の労力削減のためです。
924デフォルトの名無しさん:2010/12/16(木) 04:10:25
ScalaやRubyを実務に取り入れたいけど、
結局、新しい事やより良いものを学んで
成長しようという意思のない人たちに
何を言っても無駄なんだな、という
諦観が芽生えてきたよ。
やるせないけどね。
925デフォルトの名無しさん:2010/12/16(木) 06:24:04
JVM上でRailsを動かすためにJRubyを使うのは理解できるし実際にメリットもあるらしいけど、
RailsでないJavaアプリケーション開発でRuby使いがJRubyを使おうと言い出したら冷たい目で
見てしまいそう。

Scalaは設計段階からJavaとの親和性を考慮してあるとはいえ、知らない人から見たらJRubyと
同じことで、>>912のような反応が当然だろうな。
実務で使おうと思ったら、Railsに相当するそれ自体が目的となるようなものが無いと。

まぁ少なくとも、成長しようという意思(笑)だけでは実務に取り入れることはできないな。
926デフォルトの名無しさん:2010/12/16(木) 06:50:03
Scala はもっと開発環境周りでJavaベースなところをアピールできないと流行らないんじゃないかね。
今のところコンパイル言語とスクリプトの悪いとこどり言語みたいになってる。
927 ◆CgacaMDhSQ :2010/12/16(木) 09:56:12
>>910
ML系言語が採用している型システムであるHindley-Milnerと違って
残念ながら、Scalaの型システム(Javaの型システムも)は型推論と色々相性が悪い。
特に、完全な型推論をやろうとすると理論的に決定不能。
ちなみに、無名関数の引数に関しては現時点でも型注釈を付けなければいけない箇所はそんなに多く無いと思うけど。
以前どっかでも書いたことがあるけど、型システムの表現力は一般には型推論の強さとトレードオフになっちゃう
928デフォルトの名無しさん:2010/12/16(木) 13:38:27
COBOL難民はJavaにうまいこと導けたけど
Scalaは敷居高そう
929デフォルトの名無しさん:2010/12/16(木) 23:08:35
>>927
うーん、ぴんとこない。

たとえば、
case class Nil[T]() extends List[T] {}
とあるとき
Nil()に対して∀T.List[T]を推論するとどこがまずくなるん?
930デフォルトの名無しさん:2010/12/16(木) 23:10:02
>>923
その中で妥当なのは高級言語だけだな。
あとは普及していた言語が構造化・オブジェクト指向化したか、
別の理由で普及した言語が構造化・オブジェクト指向化されてたか。
高級言語内じゃ「ソフトウェア作成の労力削減」が理由で
「広く使われるプログラミング言語が交代」したことはない。
931デフォルトの名無しさん:2010/12/17(金) 09:49:29
scalaでないとできない必須の機能がないと移行しないだろうなぁ
932917:2010/12/17(金) 10:04:03
文字通り捉えられて>>920 みたいな質問が来てしまった。本当に済まない。
さすがにチューリング完全だから〜などと言われたら、訂正せざるを得ない。

> 実際にScalaでしかできないことって何かある?

実際にScalaでしか(楽に)できないことって何かある?

> JavaプログラムにできなくてScalaプログラムにできる事は何か、

JavaプログラムにできなくてScalaプログラムに(楽に)できる事は何か、


とはいえ、JVMで動くライブラリを書けばScala向けだろうが結局Javaでも使えるだろうし、意味がないか
933デフォルトの名無しさん:2010/12/17(金) 10:08:53
>>924
”成長しよう”というのはともかく、"新しい事やより良いものを学んで"というのがないと、
常にその時代に今流行ってる(今ならJavaかPHPか?)ものを使うわけだろ。
プログラマーがたくさんいて、常に安値で雇われ続けるわけだ。
アホじゃねーかw

934デフォルトの名無しさん:2010/12/17(金) 15:31:16
>>932
だからちょっとは自分で考えてみたら?
Javaにできなくて、RubyやC#でできる決定的なことはあったのか
それに比べてScalaはどうなのか
935デフォルトの名無しさん:2010/12/17(金) 18:16:24
シングルコアでの性能向上がほぼ限界を迎えて
マルチコア、マルチプロセッサが一般的になるだろうというのが大方の見方。
だから並列処理プログラムを書きやすそうな言語に注目が集まっている。
JavaからClojure、Scalaもその流れだし、MSがF#出したのもそう。
JavaだとGemFireやTerracottaとか使う手ももあるけどね。
936デフォルトの名無しさん:2010/12/17(金) 18:17:39
sageになってなかった・・・
937デフォルトの名無しさん:2010/12/17(金) 18:35:56
>935
C# 4.0の、Parallel.Forがよく出来てるんだよね。
普通のループをちょこっと書き換えるだけで、スレッドプーリングを使った
並列処理出来る。
Scalaで同じこと出来たらいいのに。

2.9で入るという、並列コレクションがそれなのかな?
それとも、Javaの並列コレクションをScala風に味付けしただけ?
938デフォルトの名無しさん:2010/12/17(金) 20:22:17
並列コレクションもIterable継承してるから並列じゃないコレクションと全く同じように使えるよ
それと並列化可能なコレクション(Parallelizableトレイトを継承してるやつ)には
並列化した自身を返すparメソッドが定義されてて、
for (i <- (0 until 100).par) yield { /* ごにょごにょ */ }
こんな感じで使えるようになってる
939 ◆CgacaMDhSQ :2010/12/18(土) 03:30:31
>>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の型推論がやっかいな
理由はまた別のところにあるんだが、ちょっと長くなりそうなので、その内気が向いたら書いてみる。
940デフォルトの名無しさん:2010/12/19(日) 20:51:28
Lift使うなら、play! fw + scala pluginの方がいいよ
Liftいろいろ面倒くさすぎる
941デフォルトの名無しさん:2010/12/20(月) 22:01:41
Scalaの自習にLiftは最適。
Liftで組めるようになった時、Scalaを大体理解出来たと言える。
942デフォルトの名無しさん:2010/12/20(月) 23:45:23
Liftの日本語の本ってありますか?
943デフォルトの名無しさん:2010/12/21(火) 08:01:03
ない
944デフォルトの名無しさん:2010/12/22(水) 01:28:32
ウェブ板に行っても相手にされないだろうから、いつもお世話になってるここで怒りをぶちまけてもいいですか。

なんかみなさんピーチクパーチクやってるとこのリニューアル動画を見て唖然としたんですが、
ttp://twitter.com/newtwitter
最近のGoogle的な改悪がどんどん進んでいて止まる気配がないように思います。
視覚的な情報認識速度、無駄なマウス操作、そしてページのロード速度、
どれもこれも重くなる一方で、ハードウェアの性能が上がっても体感の不満は一向に解消されません。
このままいくと、(過去幾度も繰り返された如く)進化論的に間違った方向にいくような気がしてなりません。
心理学もわかってないようなデザイナーが大きな顔をするな!と言いたいのですが、
そういう言説はもはや息絶えたかのようにみえます。

まともな開発者に反旗をひるがえしてほしい。そして世界を快適なものにしてほしい。
・・・という業界外の人間の怒りでした。
いっそのこと業界に入って本気のテキストブラウザとか投下してやろうか・・・。
945デフォルトの名無しさん:2010/12/22(水) 01:54:57
スレ違い
っつーか
板違い
946デフォルトの名無しさん:2010/12/22(水) 01:59:06
947デフォルトの名無しさん:2010/12/24(金) 20:58:38
JVMの恩恵を授かっているがJVMに足を引っ張られている自己矛盾言語
948デフォルトの名無しさん:2010/12/24(金) 21:31:55
Scalaと95%ぐらい互換があってJVM由来のイケてないところを取り除いた言語を.netで作ったら
結局.netの制限でここがイケてないねみたいな感じの場所が出てくるのかな
949デフォルトの名無しさん:2010/12/24(金) 22:12:45
未だにx86アーキテクチャを捨てられないようなもんだな
950デフォルトの名無しさん:2010/12/24(金) 22:29:51
というか、Scalaの.NET用の実装ってどうなったん?
951デフォルトの名無しさん:2010/12/24(金) 22:35:38
Windowsでしか動かないスクリプトチック言語とかメリットまるでなしじゃね
952デフォルトの名無しさん:2010/12/25(土) 00:22:33
実装寄りの話は、どこかのだれかがカリカリとコードを書くとして、

Martin Odersky先生には、Scala言語仕様を洗練することに力を注いで欲しいなあ。。


Scalaの言語仕様は、まだまだ発展途上な感じがする。
953デフォルトの名無しさん:2010/12/25(土) 00:23:54
for〜yield式の型はどういう規則で推論されてるんだろう?
954 ◆CgacaMDhSQ :2010/12/25(土) 06:20:14
>>953
推論していない
for〜yield式は構文レベルでforeach,map,flatMap,filterの組み合わせに変換される
(2.8だとwithFilterってのが加わってちょっと変化したが基本的には同じ)
型推論はその後に行われるので、for〜yield式自体に何か特別な型推論規則がある
わけではない
955デフォルトの名無しさん:2010/12/25(土) 08:02:58
ありがとう。
だから、最初のジェネレータの型によって、
結果がListになったりSetになったりするのか。

そしてyieldといいつつ、いわゆる(コルーチン的な)ジェネレータとは違うんだね。
Set上のループだと全部回らないと結果を1つも返せないから。
956デフォルトの名無しさん:2010/12/26(日) 11:44:51
>>950
2.7.7まではそこそこ正常に動作するぽい
2.8.0以降だとコンパイル時にエラーになる
957デフォルトの名無しさん:2010/12/28(火) 05:58:03
プロファイラはどうしてる?
やはりJavaのを使うしかないのかなあ
958デフォルトの名無しさん:2010/12/30(木) 09:08:48
個人作成のWebページだけど、
Scalaの文法とか記号とかをうまくまとめているページがあり、
お世話になったので、紹介。

http://www.ne.jp/asahi/hishidama/home/tech/scala/index.html


こういうのは助かる〜。
959デフォルトの名無しさん:2010/12/30(木) 12:12:16
>958
今までで一番良い出来。
960デフォルトの名無しさん:2011/01/01(土) 18:46:05
Javaのほうだけどこの人のリフレクションのところはすごいお世話になった気がする
961sage:2011/01/02(日) 17:32:34
>>950
.NETはF#が標準で入ったから、それ使うだろjk
962デフォルトの名無しさん:2011/01/03(月) 15:23:35
おれも >>958 の人のページには色々お世話になった。
963デフォルトの名無しさん:2011/01/04(火) 10:53:09
ほどほどな規模のScalaのコード見てみたいんですが、
どこかにお手軽アプリ作ったりして見せあってるコミュニティとかありますかね?
964デフォルトの名無しさん:2011/01/04(火) 17:57:11
http://sites.google.com/site/scalatohoku/min-na-no-kodo
こういうやつでいいのか

https://github.com/languages/Scala
githubだと探す方法が限られてるかな

ついでに質問なんだが、ScalaにはClojarsみたいな公開mavenリポジトリってあるのかな
965963:2011/01/05(水) 11:41:15
>>964
おお!まさにこんな感じのやつです!ありがとうございます。
一つ一つ見ていきたいと思います

とくにscala.swing関連のやつはとても助かります
966デフォルトの名無しさん:2011/01/06(木) 01:35:23
>>964
scala-tools.orgとか?
967デフォルトの名無しさん:2011/01/06(木) 21:38:05
xmlでid属性がhogeの要素のテキスト抜き出したいんだけどこんな感じでいいの?
もっと簡単な書き方あるかな?
val result = (html \\ "_").find(_.attribute("id").exists(_.text == "hoge")).get.text
968デフォルトの名無しさん:2011/01/06(木) 22:31:54
>>966
おーあんがとう。最近さわってないので、ど忘れしてた。
969デフォルトの名無しさん:2011/01/07(金) 18:20:24
浅海さん、英語できないにもほどがある。
UntiPatternじゃアンチパターンじゃなくてウンチパターンにしか読めない。
腹抱えて笑ったぞ。
970デフォルトの名無しさん:2011/01/07(金) 18:23:50
どこの話題か知らないけど、UnkoPatternなら良かったのにね。
971デフォルトの名無しさん:2011/01/07(金) 19:34:17
>970 ボクらのScala p.335より

object MailExtractor {
def unapply(string: String): Option[(String, String)] = {
val Pattern1 = 省略
val Pattern2 = 省略
val UntiPattern = """(.*[.][.][^.]*)""".r
以下省略
972デフォルトの名無しさん:2011/01/07(金) 19:39:08
そっとしておいてやれw
973デフォルトの名無しさん:2011/01/07(金) 19:47:34
>971
たぶん、その [.] 1つがコーン1粒を表現してるんだと思うよ。
974デフォルトの名無しさん:2011/01/07(金) 22:13:45
ウンチパターンw
975デフォルトの名無しさん:2011/01/07(金) 22:24:59
つか、この正規表現、ちょっと不自然じゃない?
別にいいけどさ。
976デフォルトの名無しさん:2011/01/07(金) 22:30:28
オライリーからScala本出るな、Effective Scala的な本とかとかScala cookbook的な本マダー?
977デフォルトの名無しさん:2011/01/07(金) 23:29:29
http://hibari.2ch.net/test/read.cgi/tech/1290367109/588
これ見て思ったけどMartin先生が突然死んじゃったらScalaってどうなるん?
978デフォルトの名無しさん:2011/01/08(土) 07:25:59
なかみもはれ

【Perl,PHP】LLバトルロワイヤル14【Ruby,Python】
http://hibari.2ch.net/test/read.cgi/tech/1290367109/588

588 名前:デフォルトの名無しさん[sage] 投稿日:2011/01/07(金) 04:32:56
pythonはguidoが突然の事故で死んでも大丈夫だみたいな話があったけど
rubyはmatzが死んだら共倒れぽいな

979デフォルトの名無しさん:2011/01/08(土) 09:18:17
m●tzが死んだほうがたぶんいい方向に
発展すると思うよ。きちんと自分の意見言えるようになるはずだし

共産主義、宗教的な指導者はコミュニティは邪魔だし
980デフォルトの名無しさん:2011/01/08(土) 09:44:38
宗教はアヘンだ、というテーゼは確か共産主義者のものだったな。

ソ連が崩壊して20年も経つとこういう馬鹿も出てくるわけだ。
981デフォルトの名無しさん:2011/01/08(土) 11:10:23
>>971
てゆうか、これわざとじゃね?
982デフォルトの名無しさん:2011/01/08(土) 13:29:39
matzが死んだ後にこそ宗教としてのRubyがはじまる
983デフォルトの名無しさん:2011/01/08(土) 13:42:55
まぁ書名からしてネタ臭さは感じる
Rubyでアニメ好きが書いた本あったろ
そういう類のあれ?
984デフォルトの名無しさん:2011/01/08(土) 13:45:33
そうか冬休みか
985デフォルトの名無しさん:2011/01/08(土) 13:50:25
>>971
unit のスペルミスじゃねーの
986デフォルトの名無しさん:2011/01/08(土) 20:46:58
987デフォルトの名無しさん:2011/01/09(日) 00:48:32
>>977
> http://hibari.2ch.net/test/read.cgi/tech/1290367109/588
> これ見て思ったけどMartin先生が突然死んじゃったらScalaってどうなるん?

同感。

Martin先生には、生きている間に、Scalaの言語仕様を完成させてほしい。
今のままだと、まだ発展途上って感じだよね、、、。

988デフォルトの名無しさん:2011/01/09(日) 01:14:38
Martin先生の脳だけでも今から取り出して保存したほうがいいよなぁ
989デフォルトの名無しさん:2011/01/09(日) 02:29:51
でも、あと追加するべき大きなフィーチャーって何だ?
990デフォルトの名無しさん:2011/01/09(日) 04:25:46
論理型言語機能じゃない?
991デフォルトの名無しさん:2011/01/09(日) 04:32:55
おっぱい
おっぱい
おっぱい
992デフォルトの名無しさん:2011/01/09(日) 09:12:44
マクロ機能だな
993デフォルトの名無しさん:2011/01/09(日) 11:39:29
依存型も
994デフォルトの名無しさん:2011/01/09(日) 14:03:39
うめ
995デフォルトの名無しさん:2011/01/09(日) 14:18:11
996デフォルトの名無しさん:2011/01/09(日) 15:11:55
997デフォルトの名無しさん:2011/01/09(日) 17:32:00
>>979-980
神が死んだら本当の宗教になるし死んでもらったら困る
998デフォルトの名無しさん:2011/01/09(日) 19:29:16
>>996
なんか迷子になった
999デフォルトの名無しさん:2011/01/09(日) 19:43:18
>>996
過疎ってんな
1000デフォルトの名無しさん:2011/01/09(日) 19:49:24
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。