プログラミング言語 Scala 4冊目
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2010/06/07(月) 15:26:14http://www.scala-lang.org/
リンク集
http://sites.google.com/site/scalatohoku/%E5%8B%89%E5%BC%B7%E4%BC%9A%E8%B3%87%E6%96%99
前スレ
プログラミング言語 Scala 3冊目
http://pc12.2ch.net/test/read.cgi/tech/1261779856/
0002デフォルトの名無しさん
2010/06/07(月) 15:28:02Scalaは簡潔かつ優雅で型安全な方法でよくあるプログラミングパターンを表現できるように
設計された汎用プログラミング言語です。
Scalaはオブジェクト指向と関数型言語の特徴をスムーズに統合しておりJavaやその他の言語を扱う
プログラマをより生産的にすることができます。(以下略)
ttp://www.scala-lang.org/node/25
・Scalaに関する書籍(英語)
ttp://www.scala-lang.org/node/959
リファレンスマニュアルや草稿のPDFなども充実しているのでそちらも参照してください。
日本語の資料には、チュートリアルの訳やIBM dW、IT Proの連載記事、各々で開かれた勉強会の資料などがあります。
0003デフォルトの名無しさん
2010/06/08(火) 21:43:02乙
0004デフォルトの名無しさん
2010/06/10(木) 19:40:270005デフォルトの名無しさん
2010/06/11(金) 13:35:110006デフォルトの名無しさん
2010/06/11(金) 15:37:49CodeZineの記事の著者です。
> e.getProperty("user")では空文字列が返り、
> e.getProperty("members")ではNullが返ってきてしまう理由がよくわからないのですが、
> これはなぜなのでしょうか?
> [User]と[JList[User]]の違いなのか、それとももしかするとapp engine sdkの仕様なのでしょうか。
その通りで、"members"プロパティはListPropertyと呼ばれるもので、
keyに対してのvalueが一件もない場合はnullが返るのがLowLeveAPIの仕様です。
本来はList[User]()が返ってきて欲しいし、
そのようにimplcit conversionできればいいんですが、
ジェネリックスの仕様的に無理なんでnullチェックするしかないです。
記事のコードでそのへんのチェックが抜けていたのは
完全なバグですのであとで直します。
0007sage
2010/06/11(金) 15:39:17LiftConsoleってのがあってそいつが便利です。
mvn scala:console
でmavenからREPLを起動した後に、
(new bootstrap.liftweb.Boot).boot
とREPLに入力することでLiftのBootStrapが読み込まれて、
Modelなんかにアクセスできるようになります。
GAE環境ではSDKがサポートするローカル環境をエミュレートする必要があるため、
LowLevelAPIを利用したModelはさわれませんが。
このへんは、Slim3とかことーじゃを参考にすればなんとかなるかな、
とは思ってますが手をつけてません。
最近はあまりLift追ってない。。。
0008デフォルトの名無しさん
2010/06/11(金) 15:40:390009デフォルトの名無しさん
2010/06/12(土) 00:30:430010デフォルトの名無しさん
2010/06/12(土) 01:15:34http://tryruby.org/
http://www.tryerlang.org/
Scala はこういうの無いん?
0011デフォルトの名無しさん
2010/06/12(土) 08:44:550012デフォルトの名無しさん
2010/06/12(土) 21:53:38って、どうだろう?
別にお金出して買うのに抵抗はないけど、
部屋の本棚がオーバーフローしているので、本買うのは躊躇してしまう。。
0013デフォルトの名無しさん
2010/06/12(土) 21:56:160014デフォルトの名無しさん
2010/06/12(土) 21:59:27さんきゅ
0015デフォルトの名無しさん
2010/06/12(土) 22:33:38タイトルが釣りすぎる
0016デフォルトの名無しさん
2010/06/12(土) 22:41:42著者は悪くないね
0017前スレの943
2010/06/12(土) 23:29:00twitterでフォローさせてもらってますw
>>keyに対してのvalueが一件もない場合はnullが返るのがLowLeveAPIの仕様です。
やはりそうなんですね。
自分はまず前編を拝見させて頂いて、そのアプリでブラウザから操作をしてみて、
そのあと後編のソースコードを上書きしたんです。
前編でmembersプロパティがないeventエンティティをデータストアしてしまったので、
後編のソースコードに上書きしたらnullエラーが出るようになってしまっていたのでした。
途中ででそれに気づいてDBからデータを全部消したら後編のプロジェクトもうまく動くようになって、
それで今いろいろ勉強させて頂いているところです。
ちょうどScalaでGAEアプリを作ってみたいと思っていたところでyuroyoroさんの記事に出会い、
とてもラッキーでした。
とてもためになる記事を書いていただきまして、本当にありがとうございます。
0018デフォルトの名無しさん
2010/06/12(土) 23:33:12次世代Java系スクリプト徹底入門
じゃないかと思うぜ
0019デフォルトの名無しさん
2010/06/13(日) 01:27:34「次世代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もスクリプト言語ではありません。
0020デフォルトの名無しさん
2010/06/13(日) 01:38:490021デフォルトの名無しさん
2010/06/13(日) 01:40:37インタプリタ的(ソースそのまま)に動かせるかどうかって所だと思うわスクリプトか否かって
0022デフォルトの名無しさん
2010/06/13(日) 02:10:550023デフォルトの名無しさん
2010/06/13(日) 12:47:53の代わりに
←
が使えるけどみんな使ってる?
0024デフォルトの名無しさん
2010/06/13(日) 13:27:29使ってないな。そうでなくてもたくさん矢印あるんだから、意味が一緒ならこれ以上増やすなと言いたい。
いわゆる全角ってのも受け付けない。
0025デフォルトの名無しさん
2010/06/13(日) 19:27:46の
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 したあとにクラスのメソッドをオーバーライドできる?
のでしょうか?
0026デフォルトの名無しさん
2010/06/13(日) 19:59:05Javaの無名クラスと同じ。継承とインスタンス作成を同時におこなってる。
その場でHashMapのdefaultメソッドをoverrideしたクラスを定義してる。
(なおかつ、それをSessionVarのコンストラクタに渡し、さらにそれを継承したCountHolderというobjectを定義してる)
0027デフォルトの名無しさん
2010/06/14(月) 07:03:01そのうち、Scala自体が、Java好きな人達に叩かれるようになるんじゃないだろか。
0028デフォルトの名無しさん
2010/06/14(月) 13:41:27でも、Scalaの周辺環境やツール類の問題(ビルドが遅いとか、IDEがJavaに比べて未成熟だとか)は
ともかくとして、言語としてのJavaがScalaに勝ってる箇所って無いに等しいから叩くにしても
言語仕様が複雑過ぎる〜とかそういうのになりそうな気がする
0029デフォルトの名無しさん
2010/06/14(月) 14:09:030030デフォルトの名無しさん
2010/06/14(月) 14:46:360031デフォルトの名無しさん
2010/06/14(月) 18:34:270032デフォルトの名無しさん
2010/06/14(月) 18:51:100033デフォルトの名無しさん
2010/06/14(月) 21:52:4664bit クワッドコア 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
0034デフォルトの名無しさん
2010/06/14(月) 21:56:48http://osl.cs.uiuc.edu/docs/pppj09/paper.pdf
一年前なのにもう古くなってるんだよな。
0035デフォルトの名無しさん
2010/06/14(月) 22:14:160036デフォルトの名無しさん
2010/06/14(月) 22:17:46http://shootout.alioth.debian.org/u64q/scala.php
コード量は若干少なくなるけど、実行速度は若干遅くなるって所か
0037デフォルトの名無しさん
2010/06/14(月) 22:20:31計算アルゴリズム書くだけのベンチ?
0038デフォルトの名無しさん
2010/06/14(月) 22:21:060039デフォルトの名無しさん
2010/06/14(月) 22:23:04実際は書き方が変わるだけで、一つ一つのロジックレベルでは、
決定的にコード量が減るってもんでも無いと思う。
小さな積み重ねをすると、総合的に目に見えて分量が減るのは確かだけど。
0040デフォルトの名無しさん
2010/06/15(火) 03:12:29コード量の差が出にくい。つーのは、よく知られたアルゴリズムが
既存の手続き型言語用のものだったりするので、それをベタ移植しても
あまりコード量が変わらないという…。あと、あまり数値計算系で
扱うデータ構造ってあまり複雑じゃないんで、高階関数とかの出番が
少ないんだよな…。一方、コンパイラとか言語処理系みたいな、複雑な
データ構造をいじりいまわすプログラムだと滅茶苦茶差が出る。
あと、shootoutのプログラムコード見るとわかるんだけど、全然Scala
っぽくなくて、ほとんどJavaみたいなコードが結構ある。Javaっぽい
書き方した場合、型宣言+αくらいしかコード量が減らない代わりに
実行速度もほとんど変わらないから、まあ納得の結果だなあと。
0041デフォルトの名無しさん
2010/06/15(火) 20:09:27Eclipseでデバッグ実行すると異様に重く感じる。
0042デフォルトの名無しさん
2010/06/15(火) 21:24:25単に素のJavaの方が速いってだけの話で
0043デフォルトの名無しさん
2010/06/15(火) 22:36:31単にEclipseのScalaプラグインが重いとかその辺りだろう
>>42
なんでそうなる?
scalacがコンパイルしたコードを逆アセンブル or 逆コンパイル
してみりゃわかるが、原理的にほぼjavaと同等の速度が出るようになってるよ
Javaの方が速いってのは単なる先入観だ
違いが出るのは、暗黙型変換使いまくったり、高階関数使い
まくったりした場合だな。特に2.7だとspecializationが無いせいで
プリミティブ型のboxingでアロケーションが多発するので遅くなる。
0044デフォルトの名無しさん
2010/06/15(火) 22:40:130045デフォルトの名無しさん
2010/06/15(火) 22:50:07書き方に依存するって言ってる。
基本的にはJVMの上で動く以上、Javaと同じように書けば、同じような速度が出るし、実際そのようなコード
は書ける。Scalaっぽいコードっつうか、関数型プログラミングスタイルで書いた場合は、JVMの上だとどうしても
パフォーマンスが劣る傾向があるので、性能と簡潔さをトレードする感じになる。でまあ、もちろん0か1かの二択
じゃなくて、基本的には関数型で書きつつ、チューンしたい部分をJavaっぽく書くとかそういうこともできるわけ
0046デフォルトの名無しさん
2010/06/15(火) 23:55:010047デフォルトの名無しさん
2010/06/16(水) 01:12:11一般の関数型言語ではやれる最適化手法の一部は使えなかったりするだろうし
0048デフォルトの名無しさん
2010/06/16(水) 01:24:17要するに素のJavaの実行速度は超えることが出来ないんだからJavaよりは遅いで間違ってないだろ
0049デフォルトの名無しさん
2010/06/16(水) 03:04:07え?
Javaと同じかそれより遅い、なら真だけど
Javaよりは遅い、は偽でしょ
Javaの速度≧Scalaの速度(実はこれも語弊があるけど。
JavaでScalaみたいに関数型プログラミングをやると同様に遅くなるはず
なので) ⇒ Javaの速度>Scalaの速度
って意味不明だろ
0050デフォルトの名無しさん
2010/06/16(水) 03:08:210051デフォルトの名無しさん
2010/06/16(水) 03:13:23等価ってのが何を意味するかにもよるが
Javaっぽく、というか副作用を駆使すればJavaと同じ(これは
*誇張ではなく*ほぼ同じ)速度が出るって点には納得してもらえてる?
もしそうなら、Javaより遅いってのは論理的に明らかにおかしいのが
わかると思うのだけど…。
0052デフォルトの名無しさん
2010/06/16(水) 03:13:48ではないんじゃね?
0053デフォルトの名無しさん
2010/06/16(水) 03:17:40現実を見ると、どんだけ厳密に最適化したところで、最高はJavaと等価が限界で、
Javaの実行速度を越えることはできなんだし、
Javaと同じ速度が出る場面なんて殆ど無いんだから、
Javaと同じ速度が出るって公言していい訳じゃないと思う。
0054デフォルトの名無しさん
2010/06/16(水) 07:19:35Javaより生産性が高くて、Javaに近い実行速度ができて、
生産性の高さのメリットがその実行速度の差のデメリットを埋めることができればいい、くらいで
ま、そんなの用途や既存や手持ちのライブラリにもよるんだけど、
Ruby(Rails)が一部で使われているのはそういうのが理由でしょ。
でないと、あんな動作速度でいえば最悪級(失礼)な言語誰もつかわないでしょ。
どうでもいいが、JRubyなんてさ実行速度はRuby並だわ、
起動の遅さはJava並、動かないRubyのライブラリあるわ散々でまさに誰得言語だと思わんかね・・・
その点、Scalaはいい線だと思う
0055デフォルトの名無しさん
2010/06/16(水) 08:31:32「ほぼ同じ」ってのが、「ちょっと負けてるけど、比較できるくらい速い」
というニュアンスで受け取られたんだったら、それは俺の書き方が悪かった
「ほぼ同じ」っていったのは、Javaっぽく書いた場合でも、scalacが完全に
javacと同じバイトコード出すわけじゃない(命令列の配置が少し違う)から、
厳密な書き方しただけで、実用上は「同じ速度」と言ってもいい。
>>53
いやいや、まだ理解されてないのかもだけど、わざわざ頑張って
しなくても、Javaっぽいスタイルで書くだけでJavaと同じ速度出るんだってば
で、現実にJavaと同じ実行速度が出る場面なんてほとんど無いとか、測定
したことも無い(だろうと思われる)のになんで語れる?
実測値示してみせりゃ納得するのだろうか?
好意的に見たいとかそういう問題じゃなくて、単純に事実の話だよ
005655
2010/06/16(水) 08:55:40Javaに近いくらいの速度が出るくらいの受け取り方する人って意外に多い
ことに驚いた。
たとえば、今Java 7に入る入らないでもめてるクロージャあるよね。
あれ多用したコードの性能は、ほとんど間違いなくScalaで高階関数を
多用したときと同じように落ちると思われるんだが、そうなったとき、
Java 7以前の速度は、Java 7よりも速いと言うのは正しいの?
自分が言っているのはそういうレベルの話。
ふつーにループ構文(whileとか)とJavaのAPI使って書けば性能はJavaと
同じだし、Scalaっぽく書けばより遅くなるというだけの話なんだけどなあ。
もちろん、Scalaがややこしい作業を色々肩代わりしてくれるおかげで、
つい、Javaよりも気楽に遅いコードを書いちゃうというのはあるんだけど、
それって言語処理系の速度評価とは独立な問題だよね
0057デフォルトの名無しさん
2010/06/16(水) 10:51:06そんな簡単に最適化できるわけでもなかろうに
0058デフォルトの名無しさん
2010/06/16(水) 10:53:170059デフォルトの名無しさん
2010/06/16(水) 10:57:42それは等速とは言わないよね。
Javaっぽく書いて最適化すれば等速出るって言われても、
もはやそれはJavaじゃん。
006055
2010/06/16(水) 13:51: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の方が速くなるケースもあるかも。
006155
2010/06/16(水) 13:57:07事実関係についてはおおむね同意してもらえたとして、そこまで来ると
もはや見解の相違としか。一応言っておくと、ScalaでJavaっぽく書くことは
特に努力が必要な作業でもないよ。ふつーにScalaの基本構文を使って書く
だけ。暗黙型変換使うなとか使う機能に関して縛りは出るけど、特にScalaを
熟知していないとできない作業でもない。
ただまあ、
・Javaっぽく書くこと自体は特に難しくないこと
・そのようにして書かれたコードはJavaと同等の速度が出ること
に納得してもらえたなら、それ以上、特に等速という言葉を使うことに
こだわりは無い。単に、「性能の上限はJavaと同じくらいだけど、それを
達成するためには頑張ってチューンしなければならない」みたいな認識が
広まるのが嫌なだけなので。
0062デフォルトの名無しさん
2010/06/16(水) 15:12:580063デフォルトの名無しさん
2010/06/16(水) 15:49:30いやだからそれってもはやJavaじゃん
006455
2010/06/16(水) 16:08:14そうとも言えない。
・型推論があるおかげで型を書く必要がある箇所がJavaに比べてかなり減る
・型の別名付けがあるおかげで、ジェネリクスを使ったコードがJavaに
比べて楽に書ける
・case classなどのおかげで、クラスの作成がJavaに比べて楽
・どこでもimport
・末尾再帰の最適化
・メソッド内メソッド
・パターンマッチ
などなど。これらの性能にあまり影響しない特徴を使うだけでも、
コードを書くのはJavaに比べて楽だよ。
0065デフォルトの名無しさん
2010/06/16(水) 16:21:180066デフォルトの名無しさん
2010/06/16(水) 16:35:16ただのループに変換するにはクラスを合成する必要があるから
クラス単位でコンパイルするScalaコンパイラでは難しいでしょうね。
Javaにクロージャが追加されたらJVMがクロージャを
ただのループに最適化するようになるかもしれません。
そうなればScalaの高階関数も同様に最適化されるだろうから
Scalaっぽく書いたScalaコードもJavaっぽく書いた場合と
同等の速度がでるようになると考えられます。
Javaにクロージャが追加されるのを期待しましょう。
>>65
>>55が何を実際に確かめたのかは>>60に書いてあるのでは?
006755
2010/06/16(水) 16:38:57あらゆるコードで、とは言わないけど、典型的なコードパターン
では結構試したかな。つか、さっきも書いたけど、Java的なコードは
Java的にコンパイルされるので、全部確かめる必要も無い。
あとは、>>36のリンク先の、regex-dna,n-body,binary-trees,fannkuch-redux
辺りのコードが参考になるかな。 Javaと同じような書き方してる
ベンチマークはほとんど同じ結果になってる。ちなみに、大きく差が出てる
k-nucleotideなんかはJava版とScala版でやり方が大きく異なってる点に注意ね。
0068デフォルトの名無しさん
2010/06/16(水) 16:42:11殆ど同じ、じゃなくて完全に同じかどうか聞かれてるんでしょ?
0069デフォルトの名無しさん
2010/06/16(水) 16:49:050070デフォルトの名無しさん
2010/06/16(水) 16:51:27007155
2010/06/16(水) 16:56:16んな自明なこと聞かれてたの?
完全に同じなんてことは、scalacがjavacのforkでも無い限り(
というかforkであっても「完全に同じ」なんてことはまず無いが)
ありえないってことは議論するまでも無く明らかだと思うのだけど。
俺は実際のコードでほぼ同じであることを説明すれば十分だと考えた
ので、scalaのコードがどういうバイトコードにコンパイルされるか、
や、shootoutのコードを示したわけなんだが、あとは何があればいいの?
0072デフォルトの名無しさん
2010/06/16(水) 17:03:47ちょっとでも遅いのなら、Javaと等速っていうのは過剰評価じゃね?ってことだよ
細かな速度は重要じゃないって言ってる人が、何故か一番Javaと
等速であることに拘ってるよね
0073デフォルトの名無しさん
2010/06/16(水) 17:12:25実行速度に関する情報提供ありがとうございました。
大変参考になりました。
0074デフォルトの名無しさん
2010/06/16(水) 17:15:450075デフォルトの名無しさん
2010/06/16(水) 17:17:33Rubyの人を除く
0076デフォルトの名無しさん
2010/06/16(水) 17:35:30007755
2010/06/16(水) 18:36:36いや、だからその三択がおかしいんだってば。
「全く同じ」なんて言い方するなら、Javaと全く同じ速度が
出るのはJavaそれ自身しか現実的にありえないんだから、無意味
だよ(どんな入力に対してもjavacと「全く同じ」出力を出す
コンパイラなんて現実的に無理だし)
それと細かな速度が重要なんて一言も言ってないんだが…
単に、「Javaと全く同じ」なんて言明は無意味だからそんな
言い方はしないだけのこと。
もう一度言うけど、「Javaと等速」ってのは過剰評価でもなんでもない。
shootoutでも、Javaぽく書かれたコードは、Javaとの性能差はほとんど
誤差みたいなもので、Scalaが勝ってるベンチマークすらある。
つーか、実際にScalaでJavaっぽく書かれたコードで、Javaより有意に
遅くなるケース示してくれんと、もはや悪魔の証明を要求されてるような
もんでどうしようもないんだが…。Javaっぽくってのは、高階関数の
代わりにwhileループやvarを多用したコード程度の意味ね。
>>74
実務に関しては、答えは簡単で、典型的なScalaっぽく書かれたコードは、
典型的なJavaコードより遅い(どの程度遅いかは問題によるが)。ただ、
Scalaは静的型付け言語だけあって、それでも動的型付け系のスクリプト
言語よりは速い。あと、Scalaっぽさを捨てていいならJavaと同じ速度が
出るようにするのは難しくない。
007855
2010/06/16(水) 18:40:48遅い、じゃないからね。Javaっぽく書いたScalaのコードとJavaのコードの
速度差はほとんど誤差のレベルだから優劣を比較するのが難しいってこと。
0079デフォルトの名無しさん
2010/06/16(水) 19:04:500080デフォルトの名無しさん
2010/06/16(水) 22:44:10ある程度近いなら同じって言い切って構わないよ
0081デフォルトの名無しさん
2010/06/16(水) 22:46:36・C++は遅いから禁止。 Cで書け!
・ハードェアを叩きたかったら、既存のドライバ使うな!ドライバは自分で書け!
・OSなんか使うなよ。そんなのを介すると当然遅くなる。
・可能だったらアセンブラで書け!Cだと遅いからな。
という話と同じだな。
組み込みの分野では、未だにそういうプログラミングやるよ。
で、数年前、C++はCより速度が劣るからダメ!と拒否しまくっていた人が居た。
まさにデジャブだね。
最近は組み込みでもC++で書くことも多くなってきている。
当然、C++っぽい書き方をしまくるとCより遅くなるのだが、
速度よりも分かりやすさ優先な場合は、そういう書き方しても全然問題でない。
要するに頭を使って適材適所でプログラミングすれば、
組み込みの現場でも CとC++の速度は同等だし、かつ、C++は便利といえるんだよ。
0082デフォルトの名無しさん
2010/06/16(水) 22:47:000083デフォルトの名無しさん
2010/06/16(水) 22:54:52毎度毎度お前は。
twitterでつぶやいてろ。
0084デフォルトの名無しさん
2010/06/16(水) 23:34:28駄目、使うな、って言ってるんじゃなくて
速度はJavaと全く同じは言い過ぎじゃね?ってだけの議論だろ
0085デフォルトの名無しさん
2010/06/16(水) 23:38:510086デフォルトの名無しさん
2010/06/16(水) 23:40:20008755
2010/06/17(木) 01:47:25そりゃ二つの異なる言語処理系の性能が「全く同じ」なんて、
いかなる場合でも言えるわけが無いと何度言ったら…
とりあえず、同じような書き方した場合にベンチマークで有意な差が
出ないってのはshootoutのコードだけ見ても十分わかるし、原理的にも
「ほぼ」同じ速度が出る。で、無限にあるJavaプログラムと
Scalaプログラムの速度を比較するにあたって、同じような書き方すれば
速度が「ほぼ」同じだろう、以上の事はどうやっても言えないんだけど、
一体どうしろと言うんだ?そこまでして、Scalaの実行性能がJavaと同程度
であるってこと認めたくないわけ?Javaより少し遅いといえば満足なの?
008855
2010/06/17(木) 01:59:35主張をまとめてもらえないか。自分の主張はシンプルで、原理的にも
実用的にも、Javaと同じような書き方(whileループやvarの利用)をした
コードはJavaとほぼ同じ速度が出る。以上、これだけ。
反論してくる人は、「全く同じ」という無意味な言葉を使わないで
主張の要点を説明してくれ。二つの異なる言語処理系の速度が「全く同じ」
なんてことはそもそもありえないし、こちらはそんな事言ってないんだから。
0089デフォルトの名無しさん
2010/06/17(木) 02:06:29> 駄目、使うな、って言ってるんじゃなくて
> 速度はJavaと全く同じは言い過ぎじゃね?ってだけの議論だろ
そもそも、そんな議論はしていない。
誰が、「速度が全く同じかどうか」にこだわっているんだ?お前くらいだろ。
さっきからのその問題点のすり替えで、どうどうめぐりなので、辞めてくれるかな?
ていうか、お前、55氏の書いている内容を理解してないだろ?
これ以上愚問を繰り返すならば、せめて >60 の意味が分かってからにしようよ。
0090デフォルトの名無しさん
2010/06/17(木) 02:07:340091デフォルトの名無しさん
2010/06/17(木) 02:10:33結局の所、>>33-36の結果を覆さないと堂々巡りになるんじゃないかね。
散々俺たちだってベンチマークの結果出して、RubyやPythonおせえwwwって言ってきたわけだし
009255
2010/06/17(木) 02:27:49OK。>>33-36のベンチマークで、トータルでScalaの方が遅い理由については
説明つけられるので、ちょっと書いてみる。とりあえず、以下では、
>>36のベンチマークを基準にして話を進めるね。
まず、regex-dna,reverse-complement,n-body,fannkuch-redux,
binary-treesはほとんど有意な差が出てない(Scalaが勝ってる
ベンチすらある始末)のでまず除外。
残りは、spectral-norm,mandelbrot,fasta,k-nucleotideの4つなので
順番に検討していく。
0093デフォルトの名無しさん
2010/06/17(木) 02:33:29> 速度はJavaと全く同じは言い過ぎってのは間違いじゃないだろうに。
君の主張は詭弁だらけだな。
とりあえず、
「全く同じ」 「言い過ぎ」 「間違いじゃない」
って言葉を使うのは辞めておけ。
で、もう一度、スレを読み直してごらん?君は、いったい何を言いたいの?
0094デフォルトの名無しさん
2010/06/17(木) 02:52:33誰もそんなこと言ってねーって。
JavaとかScalaの前に日本語勉強した方がいいよ。
009555
2010/06/17(木) 02:56:57遅い。いくつか原因はあると思うけど、たぶん、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版で差が出てる
ベンチはコードの書き方がそれなりに違ってるという事は確か。
0096デフォルトの名無しさん
2010/06/17(木) 03:31:2055がいない時間には入らないのに。
0097デフォルトの名無しさん
2010/06/17(木) 03:35:49もういい加減落ち着いて辞めた方が双方のためだと思う。
0098デフォルトの名無しさん
2010/06/17(木) 09:11:36言語ではない。
0099デフォルトの名無しさん
2010/06/17(木) 09:20:030100デフォルトの名無しさん
2010/06/17(木) 09:23:230101デフォルトの名無しさん
2010/06/17(木) 10:45:12どこが、とんでもなんだ?
0102デフォルトの名無しさん
2010/06/17(木) 10:46:28お前はtwitter かはてぶしてろ
0103デフォルトの名無しさん
2010/06/17(木) 10:56:27あーあ、言っちゃったw
010466
2010/06/17(木) 14:35:51話の筋を理解しないレスに突っ込みたい人は何人もいるでしょう。
私も突っ込みましたが私は>>55なんですか?
>>55
同じ内容を繰り返しているレスはスルーしてくれませんか?
不毛なやりとりでScalaスレが埋まるのはうれしくありません。
0106デフォルトの名無しさん
2010/06/17(木) 17:26:480107デフォルトの名無しさん
2010/06/17(木) 22:00:51> 話の筋を理解しないレスに突っ込みたい人は何人もいるでしょう。
> 私も突っ込みましたが私は>>55なんですか?
俺も、問題点をすり替えて、何度も同じ主張をするやつに文句言ったが、
別に、66でも、55でもないぞ。
他にも、コイツにツッコミ入れたやつは、あと4人くらい居るみたいだ。
0108デフォルトの名無しさん
2010/06/17(木) 22:49:450109デフォルトの名無しさん
2010/06/17(木) 23:45:000110デフォルトの名無しさん
2010/06/18(金) 00:54:560111デフォルトの名無しさん
2010/06/18(金) 01:25:00ようやく気付いたみたいだから、彼も進歩したようだ。
でも、複数の人からアホ認定されているのは認めたくないようで、
現実から逃げて自作自演とかって騒いでいるから、まだまだアホのままだな。
>79, >90 のその後の発言は、>106, >108 ,>109 , >103, >96 , >99 なのだが、
アホの発言ってアホ丸出しだから本当分かりやすいよなあ。
0112デフォルトの名無しさん
2010/06/18(金) 08:57:27こうなる前に早めに教えてあげるべきだったろうか。
0113デフォルトの名無しさん
2010/06/18(金) 09:10:53話の区切りに行間を開ける奴はいるだろ。
てか、同一人物認定したところで、アホがアホである事実は変わらない。
0114デフォルトの名無しさん
2010/06/18(金) 09:23:420115デフォルトの名無しさん
2010/06/18(金) 09:34:010116デフォルトの名無しさん
2010/06/18(金) 09:35:250117デフォルトの名無しさん
2010/06/18(金) 11:39:39・自分を批判するレスを全て妄想のイコールで結び始める。
0118デフォルトの名無しさん
2010/06/18(金) 11:42:01マジレスすると、むしろもうちょっと早い段階で皆スルーすべきだった
>>77 あたりで
0119デフォルトの名無しさん
2010/06/18(金) 11:43:390120デフォルトの名無しさん
2010/06/18(金) 11:59:320121デフォルトの名無しさん
2010/06/18(金) 12:59:18いることに思いがよらなかったよ。
スクリプト言語よりは遙かに速いんだし
Scalaで物足りないときはCでカリカリ書くものだと思ったよ
012255
2010/06/18(金) 13:08:11とりあえず、55以降のレスは全て名前欄に55つけてるので、(なんだか
疑いをもたれてる書き込みについて)同一人物ではないとだけ言っておく。
信じてもらえるかはわからんけど。
0123デフォルトの名無しさん
2010/06/18(金) 13:08:47JavaがScalaに勝ってる箇所って無いに等しい
って話が出て来て、速度は多少劣っているのではって話になって
そんなことは絶対にないって荒れ始めたのでは。
0124デフォルトの名無しさん
2010/06/18(金) 13:36:42一番の弱点はjavaライブラリを使うときに色々気を使う必要があることじゃね
0125デフォルトの名無しさん
2010/06/18(金) 14:05:030126デフォルトの名無しさん
2010/06/18(金) 14:51:35Tupleが帰ってこないから、参照渡ししないといけないとか
0127デフォルトの名無しさん
2010/06/18(金) 15:25:43これってこのスレに関係ある話?
0128デフォルトの名無しさん
2010/06/18(金) 15:44:070129デフォルトの名無しさん
2010/06/18(金) 18:05:44このスレには関係ないと思います。
そこのblog主は言語処理系の速度とアプリケーションの速度は関係ないと主張しています。
スクリプト言語処理系が遅いからと言ってアプリも遅くなるとは言えないと言いたいのでしょう。
このスレはScala言語処理系はJavaと比べて遅くないという話で盛り上がりました。
どちらも実行速度の話ですが論点が違います。
0130デフォルトの名無しさん
2010/06/18(金) 19:10:27このグダグダの中でも、>>60 のような非常に参考になる資料が書き込みされて良かったです。
しかし、これってどうやって調べられたのだろうか?
javapで 逆アセンブルだろうか?
気になるルーチンは逆アセンブルすることで、scalacがどのようにコードを変換したか分かって面白そうですね。
013155
2010/06/18(金) 19:31:51はい。javapで片っ端から逆アセンブルです。逆コンパイルもありなのですけど、対応する命令や
クラスファイルの構造を正確に調べたい場合には不向きなんですよね…。ただ、逆コンパイルでも、
おおまかにどのようにscalacがコードをコンパイルしているかはわかるので、バイトコードは
よくわからないって人は逆コンパイラ使ってみると良いかもです。
0132デフォルトの名無しさん
2010/06/18(金) 20:20:21>>132
素で>>55 = みずしまである事がばれたのにちょっと驚き。いや、別にあえて隠してたわけじゃないんだけど、
以前使ってたトリップのキー忘れてしまったので、コテをやめてただけなんですが。まあ、文体とか見れば
わかるのかなあ…。見抜いた>>132氏はよくわかったなあ。
0134デフォルトの名無しさん
2010/06/18(金) 21:30:32なんとなくそんな感じはしてた。
0135デフォルトの名無しさん
2010/06/18(金) 21:34:17http://lampsvn.epfl.ch/trac/scala/browser/scala/tags/R_2_8_0_RC6
0136デフォルトの名無しさん
2010/06/18(金) 21:43:01命令が丸見えなんだから書き直せ!
0137デフォルトの名無しさん
2010/06/18(金) 22:46:27もうやめようよ
0138デフォルトの名無しさん
2010/06/18(金) 23:01:10finalマダー?チンチン
0139デフォルトの名無しさん
2010/06/18(金) 23:30:520140デフォルトの名無しさん
2010/06/18(金) 23:36:54blog以外も集めてるよな?
そして、手動じゃ無いよな?
0141140
2010/06/19(土) 01:59:28> PlanetScala's crontab has apparently
> broken orbit and departed for deep
> space.
twitterから
やっぱり止まってたみたい、自分の早とちりじゃなければ…
0142140
2010/06/19(土) 02:31:540143デフォルトの名無しさん
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)
みたいにも書けますよね
どっちがいいと思いますかね?
0144デフォルトの名無しさん
2010/06/19(土) 14:22:00互換性を考えるならオーバーロード。
互換性を考えないなら、s を取るか取らないかによって、
実装が大きく変わる => オーバーロード
あまり変わらない => デフォルト引数
じゃあなかろうか。
二つ目のfuncの意味がどうなるかが問題じゃないかな
二つ目のfuncで、実際には単にデフォルト値を与えて(たとえば"")、一つ目のfuncを
呼び出しているだけなら、
def fun(i: Int, s: String = "")
みたいにした方がいいと思う。
一方、意味的に両者が大きく異なるなら、オーバーロードを使うべきだと思う。
0146デフォルトの名無しさん
2010/06/19(土) 16:37:24http://www.scala-lang.org/node/6743
0147デフォルトの名無しさん
2010/06/19(土) 16:51:190148143
2010/06/19(土) 16:53:35思い付かないからしょうもない例だけどたとえば
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)
みたいな感じで
0149デフォルトの名無しさん
2010/06/19(土) 17:51:15def func(i: Int)(s: Option[String] = None)
0150デフォルトの名無しさん
2010/06/19(土) 17:51:25どうやら、
> オプショナルな引数はカリー化して定義するのが2.8のAPIの流儀に見える。
> def func( i:Int )( s:Option[String] = None)
て、○○家の祖母がいってた。
0151150
2010/06/19(土) 17:54:060152デフォルトの名無しさん
2010/06/19(土) 17:54:32しかし、これ、なんか違和感があるなあ
どういう意図があるんだろ
0153143
2010/06/19(土) 18:27:02func(10)()
みたいにする必要があるみたいだ
implicitが抜けてる気がする
def func(i: Int)(implicit s: Option[String] = None)
でも俺の脳じゃどういう利点があるのかはよく分からないな
0154デフォルトの名無しさん
2010/06/19(土) 18:32:53利点は、シグネチャがどんどん複雑になって、Java厨にはったりをかませるとこ。
0155デフォルトの名無しさん
2010/06/19(土) 18:43:080156デフォルトの名無しさん
2010/06/19(土) 18:49:19ループを再帰に書き換えるのもそう思う。
0157デフォルトの名無しさん
2010/06/19(土) 20:04:36カリー化しておいて部分適用で使うわけじゃないんだから
Scala流ってことなんだろうなあ
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とか。
0159デフォルトの名無しさん
2010/06/20(日) 10:08:51正直それダサいと思うんだけど
関数リテラルの型推論ってよくわかんない
んだよね
怒られたら型を書くようにしてるけど、
なんで失敗するのかわからないと気持ち悪い
まず、前提として、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の部分の推論は「同時に」(という表現が適切かどうかは微妙なところだけど)行われる
ために、関数リテラルの型推論をする時点で、関数リテラルの引数の型が確定してないので、エラーになる。
ちなみに、「前から順番に」ってのは、言語仕様書でそのように明示されてるわけじゃないんだけど、引数リスト単位で
型推論が行われてるってのはほぼ確実だと思う。
0161デフォルトの名無しさん
2010/06/20(日) 19:06:00ダサいという印象は拭えないが、
でも、テクニックとして、型パラメータを使って関数を引数にとる場合は、
カリー化させて関数の引数を後ろに回したほうがいいということはわかった
実際、foldLeftなんかもそうなっていると
しかし、結局これは関数の引数を常に分けるようになるよな
またRubyっぽい雰囲気になるな
ダサいというのは自分も同意。たぶん、もうちょっと頑張って推論すれば>>160の前者のような場合でもうまく
推論できそうだし。ただ、そうすると、推論できない場合とできる場合の境界がよりわかりにくくなるって
デメリットもあるといえばある。
現在の関数リテラルの型推論規則は割と簡単なので仕組みさえわかってしまえばそこそこ理解しやすいんだけど、
頑張って推論した場合の規則はかなり複雑怪奇なものになりそうな気がする
完全な型推論ができればいいんだけど、Scalaの型システムだと原理的に無理があるし…
0163デフォルトの名無しさん
2010/06/21(月) 23:24:53ttp://codezine.jp/article/detail/5193
Hello worldがコンパイルエラーになる解説記事を見たのは久しぶりだ。
0164デフォルトの名無しさん
2010/06/21(月) 23:41:550165デフォルトの名無しさん
2010/06/21(月) 23:44:360166デフォルトの名無しさん
2010/06/22(火) 01:04:280167デフォルトの名無しさん
2010/06/22(火) 01:21:26←も使えるぐらいだから、全角スペースも認識する。とかはなかったか。
ソースファイルのほうは日付古いままだったけど、試したら問題なく動いたよ。
0168ゆろよろ
2010/06/22(火) 13:02:11恥ずかしくて体中の穴という穴から汁があふれそうになりました。
昨日は規制中で書き込めなかったので。
0169デフォルトの名無しさん
2010/06/22(火) 14:37:34編集部が「今はScalaが売れる!」って感じで企画立ててるの?
0170デフォルトの名無しさん
2010/06/22(火) 18:34:19http://www.infoq.com/jp/articles/scala_and_spring
0171デフォルトの名無しさん
2010/06/23(水) 13:49:050172デフォルトの名無しさん
2010/06/23(水) 20:25:38言語レベルでというのは無い
でも、C#のeventのほとんどの機能はライブラリレベルで十分エミュレートできそうな気がするけど
どうなんだろう
0173デフォルトの名無しさん
2010/06/23(水) 23:55:43http://www.kohgakusha.co.jp/books/detail/978-4-7775-1510-3
前半は、「はじめての〜」という内容で、飽き飽きした内容かもしれないけど、
後半2/3くらいが、「Rails風データベース・アプリケーション」 で、
XMLファイルの読み書きなど。
著者は、主婦らしい。
だれか、買った人いる?
0174デフォルトの名無しさん
2010/06/24(木) 00:12:09本屋で売っていたのでパラパラ見てみた。
まったくの初心者向けとしては悪い本では無いと思うが
それ以外の人はコップ本を読んだほうがいいと思った
0175デフォルトの名無しさん
2010/06/24(木) 00:18:34>>174のはコップやScalaプログラミング入門の劣化版でしかなくてかなりどうでもいい感じだと思う
0176デフォルトの名無しさん
2010/06/24(木) 00:21:010177デフォルトの名無しさん
2010/06/24(木) 00:22:340178デフォルトの名無しさん
2010/06/24(木) 00:41:08工学社のシリーズが地味すぎてマイナーだけども
0179デフォルトの名無しさん
2010/06/24(木) 01:03:37仕事で使ってるやつはどんだけいるんだよ
0180デフォルトの名無しさん
2010/06/24(木) 01:07:060181デフォルトの名無しさん
2010/06/24(木) 04:52:59そんなに需要あるのか?
0182デフォルトの名無しさん
2010/06/24(木) 06:55:02ほとんど無いから実際は入門書はいらない。いきなりコップ本を読めばいい
コップ本の内容が難しくて理解できないならばscalaを学ぶための
周辺知識が欠けていると思われるのでscalaの入門書でなく
javaや関数型プログラミングの本を読んで基礎を固めたほうがいい
0183デフォルトの名無しさん
2010/06/24(木) 08:20:25でも前提知識を要求するコップ本は教科書には向いていません。
ボクらのScalaはScala教科書の定番になると予想します。
0184デフォルトの名無しさん
2010/06/24(木) 09:20:15それが解らない奴はバカ
こういうアドバイスはいらない
0185デフォルトの名無しさん
2010/06/24(木) 10:56:18翻訳自体は、その本の価値をがんばっても保つくらいにしかできず、普通は減ずるというのに
0186デフォルトの名無しさん
2010/06/24(木) 11:21:490187デフォルトの名無しさん
2010/06/24(木) 11:46:14日本語で
0188デフォルトの名無しさん
2010/06/24(木) 12:24:110189デフォルトの名無しさん
2010/06/24(木) 12:59:230190デフォルトの名無しさん
2010/06/24(木) 13:24:480191デフォルトの名無しさん
2010/06/24(木) 13:33:14「スカラっていうのが簡単でVBよりもいいらしいよ!」とか
しれっと書いてくる!
0192デフォルトの名無しさん
2010/06/24(木) 13:39:54ワッフルワッフル
0193デフォルトの名無しさん
2010/06/24(木) 22:53:580194デフォルトの名無しさん
2010/06/24(木) 23:06:500195デフォルトの名無しさん
2010/06/24(木) 23:21:400196デフォルトの名無しさん
2010/06/24(木) 23:29:340197デフォルトの名無しさん
2010/06/24(木) 23:46:33PHPやPostgreSQLなんかも日本語のはずっと出なかった
0198デフォルトの名無しさん
2010/06/25(金) 00:44:560199デフォルトの名無しさん
2010/06/26(土) 04:29:250200デフォルトの名無しさん
2010/06/26(土) 18:55:13http://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]
のようなエラーが出てしまってコンパイルできませんでした。
色々いじってみたのですが解決せず・・もし分かる方いらっしゃったら
ご教示いただけないでしょうか。
お願いします><
0201デフォルトの名無しさん
2010/06/26(土) 20:45:190202pomu0325
2010/06/26(土) 21:04:05201のurlにも書かれてますが、implicit defで戻り値の型明示するか、implicit defを宣言しているobjectのimportを後で書けばよいようです。
0203pomu0325
2010/06/26(土) 21:14:52すみません… dispatch.Request -> Stringにするimplicit defを他で書いていたのですが、それも必要でした。blog直しておきます…。
/**
* convert dispatch.Request -> String
*/
implicit def r2s(r: Request) = {
r.host.get + r.req.getRequestLine.getUri
}
0204デフォルトの名無しさん
2010/06/27(日) 22:42:42するimplicitも要りそう。
0205デフォルトの名無しさん
2010/06/27(日) 23:08:350206デフォルトの名無しさん
2010/06/28(月) 09:49:41保守性を考えないのが、関数型プログラミングだ
0207デフォルトの名無しさん
2010/06/28(月) 13:28:00俺もScala勉強し始めてから気がついたわ
Perl並だってのに
まぁ昔ちょっとSchemeやってたんだけどそんな長いの書いたこと無かったし
0208デフォルトの名無しさん
2010/06/28(月) 14:15:280209デフォルトの名無しさん
2010/06/28(月) 14:17:07関数型言語の保守性が悪いってだけの話で
0210デフォルトの名無しさん
2010/06/28(月) 18:11:39>>209
なんで関数型だと保守性悪い(悪くなる)の?
最初205でimplicitと使うやつは保守性考えているのか?って言う話だったのに。
議論が全く見えてこないんだが・・・。implicitと関数型の関係は?
1.implicit conversionを多用したコードは保守性が悪い
2.implicit parameterを多用したコードは保守性が悪い
3.関数型で書いたコードは保守性が悪い
これらはそれぞれ独立してる問題で、1または2が真だったとしても、3が真だということにはならない
ってのを踏まえた上で根拠を省いて私見を述べるなら、1.については、implicit conversionを、特にメソッドの追加目的で使う場合は、
その事をわかりやすい形でドキュメントに書かないと保守性が下がる傾向はある。Twitterのコーディング規約で基本的に
implicit conversion禁止なのはそういう事を考慮してだと思う。2.については、implicit parameter
はimplicit conversionよりは害は少ないけど、2.8のコレクションライブラリみたいにトリッキーな事やる場合は、
implicit parameterの型とそれに対応する実際の型の対応関係など、やはり十分なドキュメントが必要。3.については
関数型で書いた方が保守性は高い傾向があると思う。特に、mutableなオブジェクトが共有される事について悩まなくて
済むのは大きい。
0212デフォルトの名無しさん
2010/06/28(月) 18:25:33Perlよかマシだけど。
0213デフォルトの名無しさん
2010/06/28(月) 18:27:142.8のコレクションライブラリみたいにトリッキーな事
あれは一体どうなっているんだ?
ある程度ソースコード追ってみたけど理解出来ない・・・org
別に使う分には全部理解する必要もないのか?
0214デフォルトの名無しさん
2010/06/28(月) 18:27:23そのライブラリ自体のコードの保守性はさがるけど
そのライブラリを使用して書かれたコードは読みやすかったりして保守性が上がったりするんでそ?
0215デフォルトの名無しさん
2010/06/28(月) 18:47:23規約がなければどの言語でもほぼ同じ
その辺の議論をすると話が長くなりそうだけど、関数型で書くことで、手続き型(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
言語というよりプログラミングパラダイムの話をしているつもりだったんだけど、違うのかな?言語の話を
しているのだったら、関数型言語だから保守性がいいってのは確かに妄想だと思う。でも、どの言語でも
同じってのは極論に過ぎるだろう。
0217デフォルトの名無しさん
2010/06/28(月) 21:13:31名前が不足してるせいだと思ってる
0218デフォルトの名無しさん
2010/06/28(月) 21:49:42規約があろうとなかろうと、
Prologの方がCOBOLよりは保守性はいいよ。
0219デフォルトの名無しさん
2010/06/28(月) 21:54:26Liftの事ですな。
0220デフォルトの名無しさん
2010/06/28(月) 22:26:200221デフォルトの名無しさん
2010/06/28(月) 23:30:15関数言語の特徴である、構文拡張みたいな事を頻繁にされると、読みにくいのではと、
軽い気持ちでかいてしまいました。
すいませんでした。
関数型言語で(具象)構文拡張の機能を標準で持ってるのなんてごく一部だよ
そこそこ名前が知られてる言語の中だと
OCaml(Camlp4),Common Lisp(リーダーマクロ等)くらい?
Template Haskellは標準で持ってるかというと微妙か。あと、Common Lispを関数型言語扱いしていいのかはわからん。
いずれにしても関数型言語の特徴とは言えないのは確か。
で、関数型プログラミングの特徴はというと、色々意見はあるだろうけど、最大公約数的には
不変データ構造と高階関数を多用したプログラミングスタイル、というところだと思う。で、どちらもよほど
変な使い方しなければ可読性は下がらないというかむしろ上がると思うんだけどなあ。
0223デフォルトの名無しさん
2010/06/29(火) 00:49:50flip (.) h . ((.) . (f . g))
0224デフォルトの名無しさん
2010/06/29(火) 01:24:090225デフォルトの名無しさん
2010/06/29(火) 01:31:37例えばSICPでは銀行口座が取り上げられているが、
状態を明示的に操作するパラダイムのほうが、
自然なモデル化を実現できる場合もある
関数型で自然に書けるのであれば、関数型で書くことが勧められるとは思う
というより、効率とかの要求がない限り、わざわざ環境をいじる必然性がない
環境の破壊がないコードは挙動を推論しやすい
関数型かどうかと保守性はあんまり関係ないと思う……
むしろモジュールシステムとか、名前をうまく分ける機能が重要だったりするから
0226デフォルトの名無しさん
2010/06/29(火) 12:00:050227デフォルトの名無しさん
2010/06/29(火) 13:01:07他人のソースを読む時には名前、識別子が手がかりなのに、
一見しただけでは名前が出てこないimplicit conversionは超最悪ですよね。
0228デフォルトの名無しさん
2010/06/29(火) 13:12:17Scalaに文句を言いたいのかはっきりしてほしい
>>225は関数型の話でしょ
あと、暗黙の型変換はObjectをimportしなきゃいけないから、そんな驚くようなことにはならないよ
0229デフォルトの名無しさん
2010/06/30(水) 11:17:32って話でしょ? gotoとか、演算子オーバーロードみたいなレベルで。
twitterさんもコーディング規約で禁止してるの?
0230デフォルトの名無しさん
2010/06/30(水) 17:27:400231デフォルトの名無しさん
2010/06/30(水) 21:23:41どうやったらいいですか?
0232デフォルトの名無しさん
2010/07/01(木) 02:45:36net.liftweb.http.SessionVar でいいんじゃないの?
javax.servlet.http.HttpSession を直に呼び出す事も出来たはずだけど。
0233デフォルトの名無しさん
2010/07/01(木) 02:50:17http://www.scala-lang.org/node/6881
0235デフォルトの名無しさん
2010/07/01(木) 11:48:230236デフォルトの名無しさん
2010/07/01(木) 13:08:420237デフォルトの名無しさん
2010/07/01(木) 14:10:040238デフォルトの名無しさん
2010/07/01(木) 14:27:29Remainder of Cloverでしょ。
そんくらい、中卒の俺でも知ってるw
0239デフォルトの名無しさん
2010/07/01(木) 18:05:02当然わかってるだろうけど
ユーザ数が増えてきて今までのプロジェクトの運営方法ではうまく回らなくなってるんだろう(たぶん)
RCの番号が増え続けてるのも、RC出た後に大きなバグが見つかる→フィックスの繰り返しが起きてるからだし
あとは最初のRCがScala Daysにあわせたものであって品質があまり良くなかったのが響いてるというのもあるかも
0240デフォルトの名無しさん
2010/07/01(木) 18:28:230241デフォルトの名無しさん
2010/07/01(木) 19:48:32(とりあえずバグあるけど) ReleaseCitemimasita の略
0242デフォルトの名無しさん
2010/07/01(木) 20:11:140243デフォルトの名無しさん
2010/07/01(木) 20:18:35どうなんだろうねぇ
社内でのJavaで作ったシステムに、ちょっとscalaを混ぜて使ってるけど。
0244デフォルトの名無しさん
2010/07/01(木) 20:44:310245231
2010/07/01(木) 22:24:43特許を検索するやつ?以外にどこかあります?
0246デフォルトの名無しさん
2010/07/01(木) 23:07:08結構仕様変わってるし。
自分用の小規模コード用なら好きなんだが。
コンパイラのバグについては、特定のコード書くとコンパイラがクラッシュする系の
バグはたまに見つけることがあるけど、計算結果が間違ってるとかそういう系のバグは、安定版(2.7.7)では
まず遭遇しないと思う。0ではないけど、実験的な機能(-Yオプション系の奴)やよほど変態的なコード書かない限りは
それほど恐れることも無いかと。2.8も正式リリースが出たら、安心して使って大丈夫じゃないかな。現状のRC7
でもまず大丈夫だとは思うけど。
事例もあるし、EDF Tradingみたいな、ちょっとミスが多大な損失につながるクリティカルな現場での採用事例も
あるので、その辺もまあ安心材料になるかな。どちらかというと問題は採用したとしてScala技術者をどんだけ確保
(育成)できるかってところじゃないかねえ。パテントビューロ(上の特許を検索するシステム作ったとこ)の人の
http://qcontokyo.com/pdf/qcon_TakashiMiki.pdf
発表スライドは、実際にScala導入してみようかと考えている人にとっては結構参考になると思う。単なる宣伝だけじゃなくて
実際に採用してみてリプレース前の既存システムでコード量にどれくらい違いが出たかとかの比較もあって結構面白い。
0249デフォルトの名無しさん
2010/07/02(金) 00:19:36実際にはライブラリのバグの方が日常茶飯事だから気にならない
LL系言語は実行環境も自前で持ってるから、足回りはJVMという安定した実行環境が使える
Scalaなどの言語に比べるとどうしても劣る部分はあるだろうねえ。Twitterがバックエンドを
RubyからScalaに切り替えたのもGCの性能が悪いのが問題の一つだったらしいし。
0251デフォルトの名無しさん
2010/07/02(金) 04:28:210252デフォルトの名無しさん
2010/07/02(金) 08:37:25gcもそうだけど
llだとcと連動するところでトラブルが起きがちなんだよね
文字列をうまく処理できない場合があったり、リソースロックしていたり
それがjvm内で完結しているとトラブルが少ないしデバッグもしやすい
0253デフォルトの名無しさん
2010/07/02(金) 09:00:46200秒ごと?
あれは、大きなサイトでも大丈夫なのかなとちょっと心配な仕様だったんだけど。
0254デフォルトの名無しさん
2010/07/02(金) 14:06:51LiftScreenとWizardは面白そう。
タグレベルで細かくいじろうとすると、めんどくさいのかもしれないけど。
http://liftweb.assembla.com/wiki/show/liftweb/Lift's_Screen
0255デフォルトの名無しさん
2010/07/04(日) 10:09:130256デフォルトの名無しさん
2010/07/04(日) 17:01:480257200
2010/07/05(月) 10:13:55ブログの記事の方までレスくださったようで・・ありがとうございましたm(_ _)m
>>org.apache.http.Header -> com.google.appengine.api.urlfetch.HTTPHeader
>>するimplicitも要りそう。
これがやっぱり必要なようですが・・まあ分かってません。
自分でも調べていますが、分かる方いらっしゃったら教えてくださると幸いです。
ありがとうごじましたm(_ _)m
0258デフォルトの名無しさん
2010/07/05(月) 13:50:40implicit def h2h(h: Header) = new HTTPHeader(h.getName, h.getValue)
試してないけどこれを追加したら動くかも。
間違ってたらごめん。
0259デフォルトの名無しさん
2010/07/06(火) 12:15:53覚えて損したわ
0260デフォルトの名無しさん
2010/07/06(火) 12:25:560261デフォルトの名無しさん
2010/07/06(火) 18:11:000262デフォルトの名無しさん
2010/07/06(火) 20:43:05D言語はバイブルが出てこれから大攻勢に
出るといいな
0263デフォルトの名無しさん
2010/07/06(火) 23:14:33D言語みたい、ねえ…どのへんが?
0264デフォルトの名無しさん
2010/07/06(火) 23:23:50Twitter,foursquare,LinkedIn,などそれなりに知名度があるサービスのScala乗り換え事例
も増えてきてるしそんなに悪い状態とも思わないけどな
0265デフォルトの名無しさん
2010/07/06(火) 23:44:410266デフォルトの名無しさん
2010/07/07(水) 05:08:190267デフォルトの名無しさん
2010/07/07(水) 06:31:56仕様変えてRC出し続けてるところが
0268デフォルトの名無しさん
2010/07/07(水) 16:12:582.8の仕様はもうfixされてるはず。RC上がり続けてるのは主としてバグ修正目的
RC1→RC2で継続プラグインが入ったりspecializationが入ったりしてるがこれは元々
2.8で入る予定のものでRC1でまだ入ってなかったというだけの話だし
そんなんでRC出しちゃったのがまずかったというならその通りではあるんだが
0269デフォルトの名無しさん
2010/07/07(水) 18:30:43Scalaの普及が始まってからまだ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の普及は続いており、短命だったは事実に反します。
一気にブレークできなかった言語も普及が続き、衰退していません。
プログラミング言語の普及には何年もかかるのです。
0270デフォルトの名無しさん
2010/07/07(水) 18:33:59本当に必要とされてる言語はJavaやPHPみたいにグイっと来るんだよ
0271デフォルトの名無しさん
2010/07/07(水) 18:56:53本格的な普及がANSI C以降とするなら20年前後ってとこか
0272デフォルトの名無しさん
2010/07/07(水) 20:12:07http://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が大手の支持を受けて一気に普及する目もあるでしょうね。
0273デフォルトの名無しさん
2010/07/07(水) 20:17:540274デフォルトの名無しさん
2010/07/07(水) 20:36:51煽るわけじゃないけどどの部分が?
0275デフォルトの名無しさん
2010/07/07(水) 20:40:02UnixでC、WindowsでVBが普及したのと同じ
Linuxが普及したのは十分な性能を持ち安価な1Uラックマウントサーバが登場した事による
同じ土俵で生産性や保守性を理由に後発の言語が普及した例はほとんどないのではないか
DelphiはVBより評価されていたようだがVB以上に普及することはなかった
0276デフォルトの名無しさん
2010/07/07(水) 20:44:19Scalaもそうなればいいけど
0277デフォルトの名無しさん
2010/07/07(水) 20:48:29Rubyがここ数年で普及したのは、Perlと比べたときの生産性や保守性が理由
(もちろん、Railsというフレームワークがあったのが大きいけど)だと思うけど、どうなんだろう…
0278デフォルトの名無しさん
2010/07/07(水) 20:53:01あんま変わらんな
フルビルドだとインストール失敗するし
gemとか糞だし
0279デフォルトの名無しさん
2010/07/07(水) 20:54:45そういう問題があるならバグレポートしてくれよ
0280デフォルトの名無しさん
2010/07/07(水) 21:10:47Cの普及時期から見るとC++の登場は後発と言うほど遅れていない
ANSI C制定(89年)と同時期にARM(The Annotated C++ Reference Manual, 90年)が出された
特にWindowsでは普及期(3.1〜95)にVisualC++の影響でCをやらずにいきなりC++の方が普通だった
>>277
非エンタープライズという意味でのWeb2.0というプラットフォーム(というより顧客/マーケットか)の
登場(拡大)が影響したのではないか
0281デフォルトの名無しさん
2010/07/07(水) 21:30:11もしiPhoneアプリがScalaでしか作れなかったら・・・
クラウド特にGAEはまだチャンスがあると思う
GAEに特化した有力なフレームワークがあればScalaは普及するのではないか
0282デフォルトの名無しさん
2010/07/07(水) 21:45:18言う通り、GAEは狙い目かもね
Scalaの表現力を生かして、BigTableへのアクセスとかが簡単にできる良い
Webアプリフレームワークがあれば…
0283デフォルトの名無しさん
2010/07/07(水) 21:50:380284デフォルトの名無しさん
2010/07/07(水) 21:51:410285デフォルトの名無しさん
2010/07/07(水) 22:01:140286デフォルトの名無しさん
2010/07/07(水) 22:08:350287デフォルトの名無しさん
2010/07/07(水) 22:25:45「有るから使う」程度の理由でimplicit使う奴が大量に居るから。
0288デフォルトの名無しさん
2010/07/07(水) 22:35:34上のほうでgotoに例えられてるけど、よく知らないやつの怯えっぷりは似てるかもしれない
暗黙の型変換はgotoほど必須ではないと思うが
0289デフォルトの名無しさん
2010/07/07(水) 22:49:44確かに。なんでこんなに(implicitに)怯えてるのか不思議でならない。
まあ使い方間違えれば可読性に負の影響を及ぼすことはあるけど、別にんなのはimplicitに
限った話じゃないしなあ…
0290デフォルトの名無しさん
2010/07/07(水) 22:56:45濫用気味でしょと言ってるだけ。
0291デフォルトの名無しさん
2010/07/07(水) 23:00:02どちらにせよ規約で縛ればおkな話だな
0292デフォルトの名無しさん
2010/07/07(水) 23:19:47implicitなんか明快すぎて楽勝だろ
変だなと思えば、簡単に調べられるし
0293デフォルトの名無しさん
2010/07/07(水) 23:24:51PerlとかRuby使っているやつがこんなんでうだうだ文句言うとは思えない
0294デフォルトの名無しさん
2010/07/07(水) 23:58:28そこでできるだけexplicitにしてみたらキーパンチが多すぎて収拾が付かなくなったってのが
ここ10年の歴史だとは思うんだけどね。
0295デフォルトの名無しさん
2010/07/08(木) 00:07:22今の流行じゃないのか?
0296デフォルトの名無しさん
2010/07/08(木) 00:11:120297デフォルトの名無しさん
2010/07/08(木) 01:12:40Rubyでもevalやリフレクションの濫用が問題になってた(なっている)
強力な機能は使い方を誤るとエライことになる
そこで最近は「ここぞという所にだけ使え」って原則が普及してきたように感じる
まあScalaについては、まずは濫用が問題視されるぐらい
普及してからの話じゃなかろうか
0298デフォルトの名無しさん
2010/07/08(木) 01:27:350299デフォルトの名無しさん
2010/07/08(木) 01:30:52evalとかそういう次元じゃないから
0300デフォルトの名無しさん
2010/07/08(木) 09:21:54Rubyメインで使っているけど、言語の良し悪しを置いておくなら、
ライブラリが数そろっててメンテされてて、
優秀な技術者がやとえる(というかもうそういう人しか残ってない予感がする)であろうPerlは
まだまだいけるように見える
RubyはRailsである壁を超えて広まりはしたけど、
ぶっちゃけると他にいいフレームワークがあったら移るような人たちばかりだろ、今使っているのはw
Perlの優秀な技術者どこで見つけてくるんだよって?Rubyも似てるだろ?w
保守性?依存性ごっちゃなgemやらバージョンあげるとすぐに動かなくなるgem郡、
下位互換性もすぐに切り捨てられ常に変わり続けるRailsや周辺プラグイン
「Railsの生産性が高い」と行った場合、結局はwebアプリの開発にどのくらいなれているかで決まってくるし。
(公平に既存の資産がない、という前提)
少なくとも、ふだんRuby書いている奴が、Rails使ったからって簡単にwebアプリ作れない。
だからといって他の言語から乗り換えたい奴は、よっぽど不満なやつだけ。
そういう奴らも、すぐに目移りする。
ようするに仕事だとphp最強!!
0301デフォルトの名無しさん
2010/07/08(木) 09:25:480302デフォルトの名無しさん
2010/07/08(木) 10:17:05週末にrailsで遊んでみたが
毎週gemは動かないし、アップデートするのに半日つぶれる
かといってバージョン固定したらバグやセキュリティーホールは直らないし
で、使うの諦めた
かと言ってC++でwebやる気は起きない
なのでscala+liftに逃げてきた
0303デフォルトの名無しさん
2010/07/08(木) 10:26:23ここで長文書くことないでしょ
0304デフォルトの名無しさん
2010/07/08(木) 10:28:27scala-internalsを読んだ限り、これ以上クリティカルなバグが報告されなければ
正式リリースされそうな感じ。
0306デフォルトの名無しさん
2010/07/08(木) 23:42:12Heliosに対応する予定はあるのか?
もしくはHelios飛ばしてM4のほうが先とか?
0307306
2010/07/08(木) 23:48:03なぜかscala1とかいうわけわからないタイプミスしたが気にしないでくれ
0308デフォルトの名無しさん
2010/07/09(金) 01:00:190309306
2010/07/09(金) 02:12:57そうなのか。ありがとう
0310デフォルトの名無しさん
2010/07/09(金) 09:19:44自分はIntelliJのCEを使ってるんだけど。
0311デフォルトの名無しさん
2010/07/09(金) 10:32:570312デフォルトの名無しさん
2010/07/09(金) 18:56:50・補完
・定義ジャンプ
・カーソル位置の変数の型推論
・flymakeっぽい自動コンパイルチェック
くらいはできるよ
Emacs派にはおすすめ
0313デフォルトの名無しさん
2010/07/09(金) 19:35:35EMSIME、割と評判いいねえ。EclipseのScalaプラグインの出来が
イマイチだから、いっそのこと乗り換えようかな…
0314デフォルトの名無しさん
2010/07/09(金) 19:36:020315名無しさん@そうだ選挙に行こう
2010/07/10(土) 14:55:312年ぐらい前に記事で読んだことがあったような気がして本家を探してみたんですが、見つからなかったです。
もしよろしければ、やりかたかリンクを教えてもらえないでしょうか。
よろしくお願いします。
0316名無しさん@そうだ選挙に行こう
2010/07/10(土) 16:22:08Xshare: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用みたい。
0317名無しさん@そうだ選挙に行こう
2010/07/10(土) 16:27:12これだった。
0318名無しさん@そうだ選挙に行こう
2010/07/10(土) 16:36:220319名無し~3.EXE
2010/07/10(土) 17:46:17C+−、C−+、C−−
0320名無しさん@そうだ選挙に行こう
2010/07/10(土) 18:00:04ありがとうございます。
nailgunはちょっと面倒で、-savecompiledは初回が遅いこととjarファイルが作られてしまって邪魔なのが欠点ですね。
ちょいnailgunについて調査してみます。
0321名無しさん@そうだ選挙に行こう
2010/07/10(土) 18:42:19clojure書いてる人が用意した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 メインクラス名
0322名無しさん@そうだ選挙に行こう
2010/07/10(土) 19:06:380323名無しさん@そうだ選挙に行こう
2010/07/11(日) 16:41:26そんな歴史は無いだろ。
吠えてたのはLL信者だけじゃん。
0324デフォルトの名無しさん
2010/07/12(月) 12:01:400325デフォルトの名無しさん
2010/07/12(月) 21:11:52val xy = (1,2)
def f(i:Int,j:Int): Int = i+j
f(xy) //ここ!
その場合、残念ながら直接渡せないので、
f(xy._1, xy._2)
のようにするしかない。タプルを直接渡せるメソッド(関数ではなく)を定義するには、
def f(ij: (Int, Int)): Int = ij match { case (i, j) => i + j }
みたいに書くしかないけど、これはこれでめんどいし。
タプルを引数に取るメソッドと複数引数を取るメソッドが同じじゃないのはJavaの
calling conventionにあわせた結果なんだろうけど、うっとおしいよねえ。
0327デフォルトの名無しさん
2010/07/12(月) 21:21:39val (x,y) = (1,2)
ならいいのに、
private val (X,Y) = (1,2)
は
not found: value X
って怒られるのはなぜですか?
0328デフォルトの名無しさん
2010/07/12(月) 21:32:17大文字と小文字で違うのかっ!
0329デフォルトの名無しさん
2010/07/12(月) 21:33:00パターンマッチングの仕様。
パターンの名前が大文字で始まる場合、未束縛の変数ではなく、その名前の値が
既に存在しているとみなされて、その値に対するパターンマッチが行われる。
つまり、
val (X, Y) = (1, 2)
の場合は、Xと1、Yと2が同じかどうか比較されるってこと。
0331デフォルトの名無しさん
2010/07/12(月) 22:07:10何故にこんな仕様?
0332デフォルトの名無しさん
2010/07/12(月) 22:10:20val tuples = ...
tuples.map { t => f(t: _*) }
みたいなことできればいいのに。
何故かという事に関しては直接は知らないのだけど(MLを検索すると出てくるかもしれないが)、
この仕様のメリットとしては
1.構文解析が簡単にできる
2.パターン名のtypoが検出できる
という二点があると思う。たとえば、仮に存在しない変数名がパターン部に記述されたら変数パターンだ
という仕様だったとする。すると、match式などの構文解析をするために構文解析時にいちいち変数表などを
もって回るか、構文解析の処理の一部を意味解析に回すことになる。一方、大文字小文字かで区別する
なら、そのような面倒な処理なしに変数パターンが値パターンかを簡単に区別できる。これが一点目。
二点目としては、たとえば、
x match { case R => ... }
のつもりが、誤って
x match { case T => ... }
としてしまった場合、大文字小文字で判定している場合、Tという値は存在しないというエラーを
出すことができるが、存在しない名前が現れたら変数パターンとみなすという仕様だと、Tという
変数が新しく定義されて正しくコンパイルされてしまい、エラーに気づかない可能性がある。
0334デフォルトの名無しさん
2010/07/12(月) 23:38:45Function.tupled(f _)(xy)
でどうでしょうか
0335デフォルトの名無しさん
2010/07/13(火) 20:17:35その名前の文字列から取得するにはどうしたらよいでしょうか?
こんな感じ?
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") }
}
0337335
2010/07/14(水) 00:52:23ありがとうございます。完璧です。
予想以上に難しくてびびりました。
REPL で
> object A
> Class.forName("A$")
てやって、できないなー、とかやってたレベルなので。
0338デフォルトの名無しさん
2010/07/14(水) 02:18:04技術的にできるのはわかるけど、
objectの実際のclassファイル名が、"名前+$"になっているとか、
"MODULE$"と名前のフィールドが存在しているのって、
言語仕様で規定されてたりするんだっけ?(そもそもそういった厳格な言語仕様ってあるの?)
scalaのソース上での表記と、classファイルにしたときの実装がどうなっているかってのは別の話だよね?
(いわゆるCRubyとJRubyみたいに標準の実装以外に別の実装があってもいい?)
もちろん、実用で使うには普通やるべきではないよね?ていうかやる必要ないよね?
まぁこういうふうにリフレクションつかってみるのは勉強にもなるし、楽しいけど。
あと、
object ++{}
みたいに記号名のobject定義できるけど、その場合って
$plus$plus.class
ってファイル名になるよね?それの変換まで実装したら大変だな・・・
おっしゃる通り、objectの名前と実際のclassファイル名の対応関係とかは、言語仕様では
規定されてなくて、あくまでも現在のScala実装に依存した話なので、それを承知でやるならアリかと
思うけど、普通はやるべきじゃないとは思う。
記号名は、各文字ごとに単純に表引きで変換できるから、そんなに大変ではないと思うけど、多少手間は
増えるね。
0340デフォルトの名無しさん
2010/07/14(水) 13:11:33scala.MatchError: null
で落ちて困っているのですが、どうしたらいいのでしょうか。
ちなみに型パラメータをやめて[Double]とべた書きすれば大丈夫なのですが。
class Matrix[T](n) {
var mat = Array[Array[T]](n)
def init(v: T) {
mat=mat.map(_=>Array.fromFunction(_=>v)(n))
}
}
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)
}
}
0342デフォルトの名無しさん
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)
0343デフォルトの名無しさん
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
ひょっとしてC++ or D系の言語から来た人かな?
JavaやScalaなどの言語では、型パラメータが持っている演算を
制約として明示しないといけない事になっている。この例だと、型パラメータTが+メソッド
を持っていることを、コンパイラは知らないので、怒っちゃうわけだ。required: Stringって
出るのは、T + Stringという文字列連結だと解釈しようとしてそれに失敗しちゃうからだね。
で、解決策だけど、大きく分けて二つあって
1.implicit conversionを使う
2.implicit parameterを使う
のどちらかになる。
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以外にも余計なオブジェクトが生成されるので、
メモリにあまり優しくない。
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)
}
}
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本を買うなりしてください。
0348デフォルトの名無しさん
2010/07/14(水) 17:37:07はい、その通りでございます。
Swing使いたいけど、Javaはヤダっていうわがまま。
def +(that:Point[U]): Point[T] = Point[T](x+that.x,y+that.y)
と書いてみて「Uなど存在しない」と怒られたり・・・(トホホ)。
やっぱJava系の型計算をよく分かってないせいでしょうかね。
標準で使えるオブジェクトの種類が多すぎて的を絞れていないです。
> で、解決策だけど
手元にコップ本はあるので、そこら辺をよく読んでみます。
毎度大変助かります。
0349デフォルトの名無しさん
2010/07/14(水) 17:41:18親切すぎる!
0350デフォルトの名無しさん
2010/07/14(水) 17:57:11implicit def 名前テキトー(x:Double) = x.toInt
を勝手に探しにいったりするわけですか。
・・・うかつな使いかたをするとエラーの所在を当てるのが難しくなりそうですね。
0351デフォルトの名無しさん
2010/07/14(水) 19:27:27>パーサー生成でLALR(1)のような効率のよい解析アルゴリズムが使える。・・・(途中略)
>誰かがそのようなジェネレーターを作れば、それは標準Scalaライブラリーに簡単に統合できるだろう。
とか書いてあるけど、誰か作ってる人いるの?(もしくは実はもう出来てるとか?)
これは著者は作る気ないけど"誰か作ってくれないかなぁ〜"ってことなのかな?
0352デフォルトの名無しさん
2010/07/14(水) 22:18:17コップ本の内容って役に立つよね?
買おうかどうか悩んでる。
0353デフォルトの名無しさん
2010/07/14(水) 22:23:389割以上はそのままじゃなかろうか。
0354デフォルトの名無しさん
2010/07/14(水) 23:28:57ほかにいい本ないしね。買ったほうがいいよ。
0355デフォルトの名無しさん
2010/07/15(木) 01:51:05Scala 2.8.0.final
http://www.scala-lang.org/node/7009
0356デフォルトの名無しさん
2010/07/15(木) 01:53:080357デフォルトの名無しさん
2010/07/15(木) 05:24:450358デフォルトの名無しさん
2010/07/15(木) 05:47:490359デフォルトの名無しさん
2010/07/15(木) 06:07:490360デフォルトの名無しさん
2010/07/15(木) 08:56:080361デフォルトの名無しさん
2010/07/15(木) 10:23:080362デフォルトの名無しさん
2010/07/15(木) 12:10:240363デフォルトの名無しさん
2010/07/15(木) 14:26:190364デフォルトの名無しさん
2010/07/15(木) 18:22:020365デフォルトの名無しさん
2010/07/15(木) 19:50:05> ほかにいい本ないしね。買ったほうがいいよ。
「ボクらのScala ~ 次世代Java徹底入門 」
を買ったけど、思ったより良かった。
・日本人が書いているから、変な和訳はないので、読みやすい。
・洋書にありがちな、分かりやすいようで分かりにくい例え話は、ない。
・日本の出版社の本は、図とかレイアウトが丁寧で分かりやすい。
・だけど、本の題名で損している。
「ボクらの〜」という題名で敬遠している人は多いかと思うけど
「たのしいRuby」とかと同じ系統の本で、なかなか良い。
「次世代Java入門」っていう副題は、意味不明。内容的にほとんど意味なし。
0366デフォルトの名無しさん
2010/07/15(木) 22:43:140367デフォルトの名無しさん
2010/07/15(木) 22:47:560368デフォルトの名無しさん
2010/07/15(木) 22:51:250369デフォルトの名無しさん
2010/07/16(金) 00:50:09なんでmutableなのにListBufferはvalで宣言して、
しかも+=ができるの?
意味わかんなくて理解できなくて睡魔に襲われたんですけど
0370デフォルトの名無しさん
2010/07/16(金) 01:02:580371354
2010/07/16(金) 01:13:37ん〜〜〜・・・初心者にはいいのかもしれないが、ある程度Javaとか知ってるなら、コップ本以外ありえないと思うんだけどなぁ。
自分的は、コップ本で理解できるから、他の本は内容薄くて、まったく買う価値が見いだせないっていう感じ。
>変な和訳、分かりやすいようで分かりにくい例え話、
この辺はどんな洋書の和訳でもそういうものだし、別にコップ本はそういうのあまりないと思うけど。
っていうか、そういう翻訳されたものとか結構読んでるから、洋書独特の例え話とか慣れてしまって、意識すらしてなかったな。
オブジェクトがmutableということと変数がmutableということを混同している
valは、あくまでその変数に再代入不可ということを保証するだけで、その変数が指す先の
オブジェクトがmutableであるかどうかは関知しない。+=に関しては、>>370の言う通り、そういう
名前のメソッドがListBufferに定義されているからだね。
0373デフォルトの名無しさん
2010/07/16(金) 02:05:33インチキの実態は、コップ本に詳しく書いてある。
外向きには関数型言語っぽいけど、ライブラリ内部は全然そうじゃない、ってとこが
Scalaの特徴のひとつだろう。これには幻滅する人も何割か居そう。
0374デフォルトの名無しさん
2010/07/16(金) 02:23:38記法上は組み込みで特別な構文があるけど、Rubyとかと違って、
実態は単なる普通のクラスと何ら変わりないわけだし、
パフォーマンス考えたら、JVMの仕様上、Stringで代用したほうが、速そうな気がするんだけど。
(比較するのは速いかもしれないけど、生成するのにコストがかかる?
JVMはStringは特別扱いするけど、JVMから見ればSymbolは単なる普通のクラスでしかないよね?)
コップ本にも1ページ分くらいしか載ってないし・・・
0375デフォルトの名無しさん
2010/07/16(金) 02:30:29>外向きには関数型言語っぽいけど、ライブラリ内部は全然そうじゃない
パフォーマンスのこと考えてるんだろうから、それは正しい選択だと思うが・・・
幻滅する人はHaskellでもやればいいよ
0376デフォルトの名無しさん
2010/07/16(金) 10:56:07Dみたいにconst(final)とimmutableを区別できるのはメリットがあると思うけどな
0377デフォルトの名無しさん
2010/07/16(金) 22:41:59なるほど…!理解した
0378デフォルトの名無しさん
2010/07/17(土) 10:24:55val x = numbers.head
val y = numbers.last
val r = numbers.tail
ボクらのScalaでListの変数名を r にしてるんだけど、
これってどういう意味合いかわかりますか?
range の意?
(挫折した) Haskellだと複数形の s つけて xs ってしてたような
0379デフォルトの名無しさん
2010/07/17(土) 11:10:17いやさっぱりわかりませんが
0380デフォルトの名無しさん
2010/07/17(土) 11:51:44一時変数で適当につけてるみたいだし意味ないんじゃないの?
そもそも、rのいみわからなくて、そのxとyの意味あいはわかった?
ループ変数のi,jに意味求めるようなものだろう。元の意味や語源はあるけど意識してはつかってない
真意は著者に聞いたほうが早いと思う
0381デフォルトの名無しさん
2010/07/17(土) 12:55:35意味合いも理解できるし、なによりいろんなプログラミング言語でも使われてる
0382デフォルトの名無しさん
2010/07/17(土) 13:37:01付けられなかったためいまだにその名残がある。
それよりscalaはすごく遅いのだがそういうものなんだろうか?
0383デフォルトの名無しさん
2010/07/17(土) 14:40:09宣言しなかった場合だけだろ
0384デフォルトの名無しさん
2010/07/17(土) 15:04:180385デフォルトの名無しさん
2010/07/17(土) 16:18:35head/tail = first/rest = car/cdr
0386デフォルトの名無しさん
2010/07/17(土) 16:23:190387デフォルトの名無しさん
2010/07/17(土) 17:37:51追加
head/tail = first/rest = car/cdr = x/xs
本当はX|Xsと書きたい
0388デフォルトの名無しさん
2010/07/17(土) 19:07:09> 本当はX|Xsと書きたい
しかし、こういう命名をすると次にXsをheadとtailにわけるとき、名前に困るという罠が
0389デフォルトの名無しさん
2010/07/17(土) 19:09:110390デフォルトの名無しさん
2010/07/17(土) 19:18:07なんで違う名前が必要なんだ?
0391378
2010/07/18(日) 01:15:32書いたときは remainder のつもりだったんじゃないかなと思います。 とのこと
0392デフォルトの名無しさん
2010/07/18(日) 01:20:320393デフォルトの名無しさん
2010/07/18(日) 12:18:02static class X {
static { ... }
}
(staticオブジェクトが初めて起動されたときだけ実行される)
と同じことをScalaでやろうとすると、
object X {
{
println(new java.util.Date())
}
def exec() = println("world!")
}
X.exec()
X.exec()
これで良さそうですが、
def init() { ... }
みたいなマジックワードがあったりするのでしょうか?
(初期化し直したかったりする場合のため)
初期化コードが長い場合に他のメソッドが埋もれないように、
とりあえず上のように中括弧いれてみましたが、それ以外で。
def init() { ... } みたいな初期化時に呼ばれる専用メソッドは特に無いので、
object X { ... } の中に初期化コードを直接入れるのでOK.ちなみに、{}をいれずに
直接初期化をobject直下に書いた場合、初期化コード中でしか使わないローカル変数を宣言しようと思っても、
フィールド扱いになってしまうので、そういうのを避ける意味でも初期化コードが長くなるなら、初期化
コードを{}で囲むのは良いと思う。
0395デフォルトの名無しさん
2010/07/18(日) 21:25:110396デフォルトの名無しさん
2010/07/18(日) 21:33:250397デフォルトの名無しさん
2010/07/19(月) 02:36:26乙乙
疑問が解けた
特に習慣的に決まっていて書いていたわけでもないのねw
0398デフォルトの名無しさん
2010/07/19(月) 09:57:49>これ以上複雑にされると、もうついていけない。
scala の cheat sheet でも。
http://www.bing.com/search?q=Scala+cheat+sheet
0399デフォルトの名無しさん
2010/07/19(月) 12:39:46なにがサポートされようが便利なら使えば良い便利でないとか判定できないなら
無視すれば良い。それで困ることがあるはずない。
0400デフォルトの名無しさん
2010/07/19(月) 12:42:260401デフォルトの名無しさん
2010/07/19(月) 14:29:56みたいに、リスト限定でevalをしたいのですが、
正規表現、パーサー作る、以外の簡単な方法はありますか?
0402デフォルトの名無しさん
2010/07/19(月) 15:38:47val xs = (new Interpreter).evalExpr[List[Int]]("List(1,2,3)")
一応こういうのはあるけど、こう使うものなのかよくわからない
0403401
2010/07/19(月) 16:08:34Cだとsscanfで簡単に3と2を切り出せるのですが、
こういう修飾された文字列からTokenizerを使って読めるのでしょうか?
(検索するとCSVのサンプルはたくさんあるけど、あれは余計なゴミがついてないから・・・)
0404401
2010/07/19(月) 20:24:54findInLineを使おうとするとmatchが使えないという・・・
ttp://webcache.googleusercontent.com/search?q=cache:YmIStkq4fN8J:ja.doukaku.org/170/nested/
0405デフォルトの名無しさん
2010/07/19(月) 20:41:38まあ、なにをやりたいのかわからないけど、
特にこだわりがないなら内部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
0406401
2010/07/19(月) 21:34:08ただ、パターンの部分は勉強しないと読めませんね・・・。
0407デフォルトの名無しさん
2010/07/19(月) 22:35:38あれって、Javaソースコード(.java) => javascriptソースコード(.js)
へコンパイルしているんだろうけど、
Scalaソースコード(.scala) => Javaソースコード(.java) へのコンパイラがあれば、
Scalaソースコード(.scala) => Javaソースコード(.java) => javascriptソースコード(.js)
ていう感じでできるかな?(コンパイルすごく時間かかりそうだけどw)
0408デフォルトの名無しさん
2010/07/19(月) 22:39:08Javaソースコード(.java) => javascriptソースコード(.js)
にとって意味のあるコードは
Scalaソースコード(.scala)
としてはまったく無意味なコードになるであろう
0409デフォルトの名無しさん
2010/07/19(月) 22:44:13Javaバイトコードに落ちる前だった。
原理的にはできるし、現状でもexperimentalなjava-srcバックエンド使えば一応できないことも無いけど
現状では十分に実用的とは言い難いってのが正直なところだと思う。一応こんなプロジェクトも
あるけど、どこまで使えるのかはちょっとわからない。
http://scalagwt.gogoego.com/
0412デフォルトの名無しさん
2010/07/22(木) 23:32:27なんでこんな仕様になってるの?
使うときなくない?
対応してなかったら紛らわしいだけだと思うんだが。
0413デフォルトの名無しさん
2010/07/24(土) 03:36:58下記を実行しても、コンソールには「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>
0414デフォルトの名無しさん
2010/07/24(土) 18:24:22trait Hoge {type A}
class Fuga extends Hoge //コンパイルできる
抽象型はそれだけでも、「何だかわからない不明な型」みたいに型チェッカに扱われるので、コンパイル通る。
0416デフォルトの名無しさん
2010/07/25(日) 15:05:50eclipseとかnetbeansにそういう機能がついてんの?
0417デフォルトの名無しさん
2010/07/25(日) 15:45:14少し見直した。
0418デフォルトの名無しさん
2010/07/26(月) 10:10:110419デフォルトの名無しさん
2010/07/26(月) 23:34:38package scala.collection
package immutable
とした場合と、
package scala.collection.immutable
とした場合にスコープが違くなるとかそういう話?
0420デフォルトの名無しさん
2010/07/27(火) 06:51:27単純なプログラムでも起動してから最初の結果を得るまでに1秒くらいかかるけど
インストールでへまやったんだろうか? みんなもこんなに遅い?
0421デフォルトの名無しさん
2010/07/27(火) 08:58:09eclipseとかつかってる?
コンパイル(と起動)が遅いだけで、実行スピードは、Javaと対して変わらないよ。
System.currentTimeMillisとかで、起動したときと、終了する前の時間調べればわかるけど
0422デフォルトの名無しさん
2010/07/27(火) 09:14:410423デフォルトの名無しさん
2010/07/27(火) 09:27:52コンパイルが遅いのは、もうちょっと頑張ってほしい
0424デフォルトの名無しさん
2010/07/27(火) 12:38:59>>421
eclipseは使ってない。起動に1秒くらいかかるだけで処理が始まってからの時間は
lispと大きく変わらないようだ。
>>422,>>423
両方早いにこしたことは無いが実行時間が早くなってほしい。jruby,jython,clojureも
同じ状況なんだろうな。
0425デフォルトの名無しさん
2010/07/27(火) 18:19:07scala2.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だと正しく動作します。これってなんで。
0426425
2010/07/27(火) 18:26:01だと上手くいきました。
なんか2.8で変わったのかな。
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引数バージョンのものだと解釈させる
ようにする。個人的には、->演算子使う方が好みかな。
0428デフォルトの名無しさん
2010/07/27(火) 18:45:33理由まで説明してくださり勉強になりました。
有難うございます。
0429デフォルトの名無しさん
2010/07/27(火) 18:51:12意外とひっかかるポイントなのかも
タプルは->を使うというのがScalaの豆知識だね
0430デフォルトの名無しさん
2010/07/27(火) 21:54:29mapper and recordとJPAどっちつかってる?
jpaの方がejbにそっててなじみがあるので良いような気がするんだけどどうなんだろ。
0431デフォルトの名無しさん
2010/07/28(水) 00:58:51要素が3つ以上の時は -> だと駄目だよね
0432デフォルトの名無しさん
2010/07/28(水) 07:02:23Scala気になってるんですが、
こういうのってハックみたいなもので解決する方法ってあるんでしょうか?
Rubyなんかだと、素のRubyは速いけれどライブラリたくさんよむとやたら重くなって
テスト実行時にDRbだかRubyのサーバー?みたいなのを裏で立てておいてライブラリの読み込みを高速化する方法とかあったけど
webアプリは開発モードだと必要なものだけリロードできるし
0433デフォルトの名無しさん
2010/07/28(水) 07:33:350434デフォルトの名無しさん
2010/07/28(水) 14:56:47Scalaを挙げることができる。なぜなら、伝統的な言語である
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
0435デフォルトの名無しさん
2010/07/28(水) 18:08:25fscはそういうアプローチなのでは。
実行はOSGiバンドルでやるとJVMの起動分は早くならないかな?
0436デフォルトの名無しさん
2010/07/31(土) 09:28:440437デフォルトの名無しさん
2010/07/31(土) 09:33:150438デフォルトの名無しさん
2010/07/31(土) 09:43:180439デフォルトの名無しさん
2010/07/31(土) 16:51:07import 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 が発生しているようです。
0440デフォルトの名無しさん
2010/07/31(土) 21:27:52実際にキャストしてるというわけじゃないんだろうね
Manifestを使ってクラスを取ってきて無理矢理キャストしてみるとか?
まあ、そんな関数作らないほうがいいよねw
0441デフォルトの名無しさん
2010/07/31(土) 22:18:13JVMつかってることによるscalaの型システムの限界かな
0442441
2010/07/31(土) 22:42:32def 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
0443439
2010/08/01(日) 00:43:05ありがとうございます。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)
}
}
というのはどうかなと思ったところうまくいかなくて、先ほどの質問をしました。
静的型の言語に慣れてないのでうまいやり方がわからないのですが、
皆さんだったらどのようなインターフェースにしますか?
0444デフォルトの名無しさん
2010/08/01(日) 01:04:37まあ、自力でテーブル作ればいいけど
0445デフォルトの名無しさん
2010/08/01(日) 01:15:40いや、それはキャストエラーをNoneで潰しちゃ駄目なんじゃない?
見つからないのか、型が違うのか、区別したほうがいいと思う
0446439
2010/08/01(日) 01:34:51def 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は別に必要ですね。
0447デフォルトの名無しさん
2010/08/01(日) 01:44:33むしろ、そうやって型を活かすように書くべきというか
だからキャストエラーなんてそのまま上に投げちゃって構わない
0448439
2010/08/01(日) 02:22:15catching の方は消すことにします。
アドバイスありがとうございます。
最初 Option[T] にせず T をそのまま返してたので気づかなかったんですが、
Option[T] にすると型推論も効かなくなるみたいなのでもうすこし考えてみます。
0449デフォルトの名無しさん
2010/08/03(火) 18:26:36(´・ω・)つ
ttp://download.scala-ide.org/
ttp://download.scala-ide.org/nightly-update-helios-2.8.0.final
0450デフォルトの名無しさん
2010/08/03(火) 20:09:260451デフォルトの名無しさん
2010/08/04(水) 17:24:580452デフォルトの名無しさん
2010/08/05(木) 14:51:42val b = new String("abc")
こうやるとa eq bはfalseになるんだけど
val a = "abc"
val b = "abc"
こうするとa eq bがtureになるのはなんで?
0453デフォルトの名無しさん
2010/08/05(木) 16:14:59リテラルの場合はaもbも同じインスタンスだからtrue
newした場合はそれぞれ別のインスタンスだからfalse
0454デフォルトの名無しさん
2010/08/05(木) 17:35:39安定性はどんな感じですか?
0455デフォルトの名無しさん
2010/08/06(金) 08:56:28サンクス
0456デフォルトの名無しさん
2010/08/16(月) 13:13:11Scalaプログラミング入門を読んでScala初心者始めたのですが
触り始める前の、関数型言語とオブジェクト指向の自然な融合をした実用言語の印象が
それプラス強力なパターンマッチと再帰の組み合わせが新たなパラダイムを開けそうな言語
に見えています。
アクターとパターンマッチングは自分の使ってきた他の言語に見られない特徴なのですが
この機能はどの言語からの輸入なのでしょうか?
(アクターはSmalltalkのメッセージからっぽいのですが・・・)
0457デフォルトの名無しさん
2010/08/16(月) 13:22:40まずErlangを連想するべき
0458デフォルトの名無しさん
2010/08/16(月) 14:45:04触りはじめなら、F#と比較してみたら?
0459デフォルトの名無しさん
2010/08/16(月) 16:37:20>>456 アクターは昔からあった考え方ですね
Scala開眼に詳しい概説あり
http://www.h7.dion.ne.jp/~samwyn/Scala/scalaindex.htm
0460デフォルトの名無しさん
2010/08/19(木) 03:37:380461デフォルトの名無しさん
2010/08/19(木) 12:58:52Scalaは、既に.net には対応しているんじゃないの??
JVMは、SwingとかGUIもそろっていて良い面がある一方で
OracleのAndroid訴訟とかあるし、JVMの将来が不安だ。
技術面でなくて、政治的な面で、JVMの将来が不安。。。
だからといって、.netも将来的に不安だし。。
0462デフォルトの名無しさん
2010/08/19(木) 16:52:58バージョンは1.4だけど
0463デフォルトの名無しさん
2010/08/19(木) 17:50:420464デフォルトの名無しさん
2010/08/20(金) 12:50:530465デフォルトの名無しさん
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 }
}
こんな感じのことがしたいです。
0466デフォルトの名無しさん
2010/08/20(金) 15:49:292.8.0.final-devel-docs 落としとくんだったお
0467デフォルトの名無しさん
2010/08/20(金) 17:47:53継承すると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()
0468デフォルトの名無しさん
2010/08/20(金) 17:58:01> この Class オブジェクトが表すクラスまたはインタフェースによって宣言された
> すべてのフィールドをリフレクトする Field オブジェクトの配列を返します。
> これには、public、protected、デフォルト (package) アクセス、および
> private フィールドは含まれますが、継承フィールドは含まれません。
0469デフォルトの名無しさん
2010/08/20(金) 18:05:16でも super[J].getClass.getDeclaredFields もダメなんです
はい、頭固いってよくいわれます
0470デフォルトの名無しさん
2010/08/20(金) 18:14:50this.getClass.getSuperclass.getDeclaredFields
0471デフォルトの名無しさん
2010/08/20(金) 18:40:35scala> 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
0472デフォルトの名無しさん
2010/08/20(金) 21:23:53ありがとうございます。ここまでやらないとダメなんですね。
protected val _a = getClass.getSuperclass.getDeclaredField("a").get(this).asInstanceOf[XXX]
こんなふうに持つようにしたらうまくいきました。
0473デフォルトの名無しさん
2010/08/20(金) 21:46:03素直にコンポジションにしろよってツッコミがくると思ってた…
斜め下の回答して、婉曲にあの人頭おかしいっていわれるのが得意です(キリッ
0474デフォルトの名無しさん
2010/08/23(月) 13:10:43テスト対象がprivateの場合はどうしたらいいの?
Inspectorで権限書き換えるしかないのかな?
0475デフォルトの名無しさん
2010/08/25(水) 02:55:213秒考えてみたけど、リテラルが多いことしか思い浮かばなかった
0476デフォルトの名無しさん
2010/08/25(水) 05:09:510477デフォルトの名無しさん
2010/08/25(水) 08:41:20・関数オブジェクト
・多重継承の代用となるミックスイン
・シングルトン代わりのObject
とか
関数リテラルとXMLリテラルと複数行文字列リテラルくらいじゃない?Javaに比べて追加されてるのって。
List(...)とかArray(...)は別にリテラルじゃないし。
個人的には、典型的なクラス定義が簡潔に書けるように考慮された文法(case classなど)、ファーストクラスの関数(高階関数)、
パターンマッチ、placeholder syntax、trait辺りがポイントかなあと思う。あと、packageの扱いが柔軟なのもなにげに嬉しい
0479デフォルトの名無しさん
2010/08/25(水) 12:03:18・遅延評価を用いたif,whileの独自拡張構文が書ける
・パーサーコンビネーターでらくらくDSL構築
・XMLリテラルでXMLパーサーいらず
0480デフォルトの名無しさん
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 スケーラブルプログラミングより]
0481デフォルトの名無しさん
2010/08/25(水) 12:52:48短く書くためのC#の自動実装プロパティとかよりさらに短く書ける上に自然だし
0482デフォルトの名無しさん
2010/08/25(水) 13:17:58・Option[T]でnullチェックいらず
・Javaのfor文の入れ子⇒ジェネレータ"<-"で一つのfor{}にまとめることができる
・複数の結果を返す関数などちょっとした入れ物が欲しいときには括弧でくくるだけでタプルになる
0483デフォルトの名無しさん
2010/08/25(水) 15:49:330484▲☆◎Perl忍者◎☆▼ ◆7IYqRceeLmsF
2010/08/26(木) 09:56:040485デフォルトの名無しさん
2010/08/26(木) 21:18:40コピペで記事にできそうだな
0486デフォルトの名無しさん
2010/08/27(金) 07:02:16http://www.infoq.com/jp/interviews/Scala_Lift
0487デフォルトの名無しさん
2010/08/27(金) 09:20:010488デフォルトの名無しさん
2010/08/27(金) 15:44:59dataout.writeInt(data.length)
dataout.write(data)
dataout.flush()
↑こういうのを↓なかんじに
with(dataout) {
_.writeInt(data.length)
_.write(data)
_.flush
}
できたらうれしく……ないか
とりあえずdef withでscala/srcをgrepしたら一杯出てきてどうしよう←いまここ
そういうことしたいなら、
{
import dataout._
writeInt(data.length)
write(data)
flush
}
で、どうかな?
0490デフォルトの名無しさん
2010/08/28(土) 02:58:340491デフォルトの名無しさん
2010/08/28(土) 03:03:29Scalaの開発では、1つのソースコードに1つのクラスを書くのが基本ですか?(内部クラスみたいのは除く)
もしそうなら、ソースコードのファイル名も、1文字目が大文字っていう慣例がありますか?
ITProのアクターの記事は1ファイルに数クラス書いてるけど、
これは閲覧者がコード内容を理解しやすいからって認識で良いのかな
書籍はインタプリタでScalaを解説してるから、なんかこういう細かいことで疑問が生じた
0492デフォルトの名無しさん
2010/08/28(土) 08:54:20設計管理じゃなくて"ハック"がしたいんだよ
ScalaはJavaで散見された紋切り型の記述が必要ないので、普通のclassも規
模が小さいし、その周りに粒度の小さいcase classとかtraitとかがわらわら
出てくるのでそんなのにいちいちファイル作ってたらきりがないってのがあ
る。
リファクタリングのコストが高くなって不要なクラスを故意に見逃すくらいな
らそんなファイル作らないぜよ
「ThoughtWorks アンソロジー」のオブジェクト指向エクササイズのように徹
底してやりたいならリリース直前の最終段階で小分けにすればいいやん。
多分みんなそこからブランチつくってプロジェクトが枝分かれするねw
とりあえず >>491 はScalaインストールして実際に手動かすべきだと思う
0493デフォルトの名無しさん
2010/08/28(土) 11:37:121ファイルにインタフェースと、それを継承した複数の実装を書いちゃう感じでいいの
0494デフォルトの名無しさん
2010/08/28(土) 13:31:12仕事で使うことは無いだろうなと思ってたら
scala使う案件担当することになったわw
0495デフォルトの名無しさん
2010/08/28(土) 13:47:530496デフォルトの名無しさん
2010/08/28(土) 21:01:36最近、技術力を求める案件が増えてる気がするなあ
0497デフォルトの名無しさん
2010/08/28(土) 21:44:540498デフォルトの名無しさん
2010/08/28(土) 22:03:30おお、こんな機能あったんすね(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.
0499デフォルトの名無しさん
2010/08/29(日) 01:15:500500デフォルトの名無しさん
2010/08/30(月) 11:50:21さっそくつかってみます
0501デフォルトの名無しさん
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)
0502デフォルトの名無しさん
2010/09/03(金) 18:59:29case class X(i: Int)
class Y[T](val companion: (Int) => T) {
val p = companion(0)
}
val z = new Y[X](X)
println(z.p)
0503デフォルトの名無しさん
2010/09/04(土) 10:21:080504デフォルトの名無しさん
2010/09/05(日) 08:08:230505デフォルトの名無しさん
2010/09/05(日) 09:18:46Java詳しくないのであれば、Javaの勉強もできて一石二鳥なんじゃね?
0506デフォルトの名無しさん
2010/09/05(日) 23:07:11俺は暗号化されたようなJAVAコード読みながらちまちまパフォーマンス
を詰めるのが苦痛で仕方ない。
関数型言語ってのは流儀にのっとって書けば効率良いバイナリを
吐いてくれるという幻想が見事に打ち砕かれたわ。
0507デフォルトの名無しさん
2010/09/06(月) 09:44:040508デフォルトの名無しさん
2010/09/06(月) 10:01:290509sage
2010/09/06(月) 11:15:16case class window(width:Int,height:Int=width)
これが通らないのはダメじゃないかと思うのだが・・・。
参考:
http://www.scala-lang.org/node/2075
0510デフォルトの名無しさん
2010/09/06(月) 12:29:090511sage
2010/09/06(月) 12:40:37case 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.
0512sage
2010/09/06(月) 13:00:44なぜだ・・・?
0513デフォルトの名無しさん
2010/09/06(月) 14:34:36def this(i: Int) = this(i, i)
}
object Window {
def apply(i: Int) = new Window(i)
}
0514デフォルトの名無しさん
2010/09/06(月) 14:49:400515sage
2010/09/06(月) 15:56:18ありがとうございました。
0516デフォルトの名無しさん
2010/09/12(日) 09:26:42return 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
なんかは大丈夫なので、ダメな理由が分かりません。
0517デフォルトの名無しさん
2010/09/12(日) 12:24:57f()の計算のどこかで名前渡しのパラメータを使う関数を介さないと
計算が止まらない。
def f(x:Int):Stream[Int] = {
return if (x<0) Stream(-1) else Stream(x) append f(x-1) append f(x-1)
}
0518デフォルトの名無しさん
2010/09/12(日) 20:42:27ありがとうございます!感謝しきれません。
自分のコードでも、一カ所変更するだけでうまくいきました。
どういう機構でそうなるのか理解したいですが、
あいにくコップ本には遅延Streamの記述が見当たらない・・・。
>どういう機構でそうなるのか理解したいですが、
>>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
が起きる。
自己レス
誤:1024
正:1026
アホなミスしてしまったorz
0521デフォルトの名無しさん
2010/09/13(月) 22:45:010522デフォルトの名無しさん
2010/09/13(月) 22:45:500523デフォルトの名無しさん
2010/09/13(月) 22:46:460524デフォルトの名無しさん
2010/09/13(月) 23:20:340525デフォルトの名無しさん
2010/09/13(月) 23:21:400526デフォルトの名無しさん
2010/09/13(月) 23:59:23いろいろ面白い機能が実装されてるほうが良い。
Scalaはちゃんと目的を果たしてるし、ゴミとか言われる筋合いはない
0527デフォルトの名無しさん
2010/09/14(火) 00:02:24教祖様が起業したのはお金のためでしょ?
0528デフォルトの名無しさん
2010/09/14(火) 00:15:06Odersky先生は前からはっきりとScalaは実用のために作った言語だって言ってるよ
実際、そうじゃなかったらJavaとの互換性にここまで気を使わんだろうと思う
このインタビュー読むといいと思う
http://www.artima.com/scalazine/articles/origins_of_scala.html
純粋にアカデミックな言語(だけど実用的でない)であったFunnel(Scalaの祖先)と、実用的だけど
制限が多いGJ(Generic Java)の中間のアプローチを取ったのだと。
>>527
お金のためっつうか、それだけ本気でScalaを普及させたいんじゃないかと。なんつーか、これは
MLとか各所でのOderskyセンセイの言動を読んでの、あくまで個人的な感想だけど、関数型プログラミングを
産業界に本格的に持ち込むことに強い意義を見出してるんじゃないかという気がする。Scala VS. Clojure
みたいな喧嘩があったときも、関数型プログラミングコミュニティで内輪もめしてる場合じゃねえ(意訳)
みたいな事書いてたし。
0530デフォルトの名無しさん
2010/09/14(火) 05:45:23関数型の眼見ればまあいろいろ筋の悪さはあるけど、
ぶつくさ言われつつもやはり広く使われると思うよ。
というかそういう筋悪なものでないと広く使われるようにはならないんじゃない。
そのうちC++に対するJavaのような、Scalaの後を襲う言語も出てくるだろう。
0531デフォルトの名無しさん
2010/09/14(火) 07:28:250532デフォルトの名無しさん
2010/09/14(火) 07:50:44流行って処理系含めて周辺環境が多様になるのかも
まだ分からんでしょ
0533デフォルトの名無しさん
2010/09/14(火) 08:03:430534デフォルトの名無しさん
2010/09/14(火) 17:18:280535scalaZa
2010/09/14(火) 23:01:230536デフォルトの名無しさん
2010/09/15(水) 02:58:37Javaだと、こんなのはあるよ。JIS TR X 0005
Scalaも安定して利用機関が増えたら、下記のパターンやる日が来るんじゃないかな。
http://www.ecma-international.org/publications/standards/Ecma-262.htm
http://msdn.microsoft.com/en-us/netframework/aa569283.aspx
0537デフォルトの名無しさん
2010/09/15(水) 18:11:48何かそういう用途にうってつけの機能とかライブラリとかないかな。
0538デフォルトの名無しさん
2010/09/15(水) 23:38:150539デフォルトの名無しさん
2010/09/16(木) 00:23:56importの補完って自動でやってくれないんでしょうか。
コードをEclipseでスラスラ書いて、
ビルド→テストはsbtって感じがよさそうだったんですが…
0540デフォルトの名無しさん
2010/09/16(木) 00:33:19Ruby勉強しなさい
0541539
2010/09/16(木) 00:40:020542デフォルトの名無しさん
2010/09/16(木) 00:52:09Noneにはエラーの原因とか入れられないよね。こういう場合はどうすれば?
0543デフォルトの名無しさん
2010/09/16(木) 01:17:570544デフォルトの名無しさん
2010/09/16(木) 01:58:340545デフォルトの名無しさん
2010/09/16(木) 07:29:37今後の互換性がない
0546デフォルトの名無しさん
2010/09/16(木) 08:05:12どんなメリットあるんです?
0547デフォルトの名無しさん
2010/09/16(木) 19:21:59a.right.flatMap(...) みたいなことになってしまったのだが、
もっとスマートな記法はないのだろうか。
0548デフォルトの名無しさん
2010/09/17(金) 23:42:470549デフォルトの名無しさん
2010/09/18(土) 00:14:22なぜなら小指とCtrlは決して切り離せない特別な存在だからです。
BoxはLift使う限りでは問題ないのでは?
0551デフォルトの名無しさん
2010/09/18(土) 15:14:54Box的なものをScala標準ライブラリに取り込む予定はないのだろうか。
0552デフォルトの名無しさん
2010/09/18(土) 18:15:170553デフォルトの名無しさん
2010/09/18(土) 21:14:04知らなかった。今はどこが管理してるの?
0554デフォルトの名無しさん
2010/09/18(土) 23:14:170555デフォルトの名無しさん
2010/09/18(土) 23:44:260556デフォルトの名無しさん
2010/09/19(日) 05:19:28Scalaどころか、未経験者募集すら大変だといいうのにw
0557デフォルトの名無しさん
2010/09/19(日) 10:42:14この記事の話ですよね?
http://www.atmarkit.co.jp/news/201009/13/spell.html
>「ScalaもClojureも非常に有望な言語だと思います。
>ただ、Scalaは機能が豊富すぎて、
>たくさんのゴミが詰まっているというのが個人的な印象ですね。
>Clojureは美しくてシンプルです。
>でも誰もWebアプリを書くのにClojureなんて使いませんよね?
>Railsがあるんだから、Railsでやればいいじゃんって話です。
>計算や重たい処理が必要な部分でClojureを使うなど、今後は、
>1つの言語が特定の1つのことを上手にやるという方向で進化していくのだと思います」
同じ事をやるのに元からあった方法と追加された方法があって
言語仕様が複雑というのはC++とScalaの共通の欠点ですね。
でもHaskellより実用に使われているからこの方針は正しいのでしょう。
0558デフォルトの名無しさん
2010/09/19(日) 13:53:140559デフォルトの名無しさん
2010/09/19(日) 14:09:50俺には取り除けるものが思いつかない
0560デフォルトの名無しさん
2010/09/19(日) 16:42:130561デフォルトの名無しさん
2010/09/19(日) 19:59:12>>557
ここでいってるScalaのゴミってのは、Javaとの互換性の話なの?
だとしたらそれはゴミじゃないと思うんだけど
0562デフォルトの名無しさん
2010/09/19(日) 20:00:00糞って書いてあるなw
0563デフォルトの名無しさん
2010/09/19(日) 21:58:58どうせOCamlとかHaskellのこともよく知らんのだろう
0564デフォルトの名無しさん
2010/09/20(月) 13:49:200565デフォルトの名無しさん
2010/09/20(月) 14:11:44respond_to?を大量に書かなくても済むようになったがそれでもメンドイ。
せめてif __FILE__ == $0 thenみたいなのが使えればテストが書きやすかっただろうに。
JVMの立ち上がりの遅さも手伝ってインタープリタの部分は使い物にならん印象。
betterJavaとして見ればとても良い言語だと思うけどね。
0566デフォルトの名無しさん
2010/09/20(月) 14:53:59> なぜ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
0567デフォルトの名無しさん
2010/09/20(月) 14:58:28テスト用のフレームワークくらいあるんじゃないのか?
Rubyでも今時、f __FILE__ == $0 ではテスト書かないでしょ?
SpecsやScalaTestみたいなテスティングフレームワークは使わなかった?
立ち上がりの遅さに関しては、sbtみたいなVM常駐型のビルドツールでカバーするのが良いかと思う
あと、インタープリタってREPLのことかな?あれは立ち上げっぱなしにしておいて必要な時にファイルをロード
する使い方が良いと思う
0569デフォルトの名無しさん
2010/09/20(月) 18:08:44例えばEmacsで編集中の関数の断片をちょっと動かしてみる・・・とかね。
REPL立ち上げっぱなしの使い方はunloadの仕方が分からずに敬遠してた。
Emacsからスムーズに渡せるとなおいいんだが・・・
今度調べてみる。サンクス。
0570デフォルトの名無しさん
2010/09/20(月) 18:49:360571デフォルトの名無しさん
2010/09/20(月) 19:40:43それともruby-modeにしかないと思っているのか
0572デフォルトの名無しさん
2010/09/21(火) 10:36:26(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)
0573デフォルトの名無しさん
2010/09/21(火) 16:57:05って誰か言っておいて
0574デフォルトの名無しさん
2010/09/21(火) 17:04:550575デフォルトの名無しさん
2010/09/21(火) 17:09:550576デフォルトの名無しさん
2010/09/21(火) 18:12:44これのことじゃね?
matzにとって困難とは思えん
scala叩きたいがためにアホなフリしてるように見える
0577デフォルトの名無しさん
2010/09/21(火) 20:04:300578デフォルトの名無しさん
2010/09/21(火) 20:16:28Scalaは素でわけがわからないときがある、と
Scalaスケーラブルプログラミングのサンプルコードを見て思た。
(一応通読はした)
var a, b = new Hoge が
var a = new Hoge
var b = new Hoge
と解釈されるのは何の冗談かと……。
0579デフォルトの名無しさん
2010/09/21(火) 20:36:240580デフォルトの名無しさん
2010/09/21(火) 20:49:46ぶっちゃけscala.Enumerationのためにあるような機能なので、正直不要と言えば不要な気がする。
実際Scalaプログラミングしてて、この機能使う必要があるのってscala.Enumerationのときくらいだし。
2.8の限定継続使い出すと、ときどきこれがあると便利な場面が無い事も無いが、そもそも限定継続自体
ごく一部のマニアプログラマ除いてまだほとんど活用されてないからな。標準ライブラリでambとかgenerator
みたいなのをサポートしてくれると嬉しいんだが…。
0582デフォルトの名無しさん
2010/09/21(火) 21:17:06val a, b = (1, 2)
と
val (a, b) = (1, 2)
で動作が違うわけね
これは確かにRubyから来た人は混乱するかもしれないな
つーか、val a, b = 1という記法があることに今気づいたけどw
0583デフォルトの名無しさん
2010/09/21(火) 22:51:25Rubyいいだろ?な?な?言えよほらいいだろ?
って喚いているのがひどくうざい
0584デフォルトの名無しさん
2010/09/21(火) 23:26:480585デフォルトの名無しさん
2010/09/21(火) 23:47:48メソッドの演算子表記+演算子の結合順序ルール
+プレースホルダ構文
+implicit conversion
+case class+パターンマッチ+抽出子
+traitのスタック
+for式のわけのわからない構文
と、これだけ並ぶと、もはや脳のパーザが限界を超えてハングアップする……。
0586デフォルトの名無しさん
2010/09/21(火) 23:54:15本人がRubyについて全く言及していない※にもかかわらず、
RubyがRubyがと騒ぐお前のようなやつの方がよほどうざい。
※今回の件限定で言えば、Rubyのことは知り過ぎてるから評価不能、
と最初に棚に上げてる。
0587デフォルトの名無しさん
2010/09/21(火) 23:55:55真面目に「全て把握」しようとすると辛いんだよなー。
普段、「逆引き本」の類は馬鹿にしているんだが、
Scalaに限ってはそういうものが必要なのかもしれない。
0588デフォルトの名無しさん
2010/09/22(水) 00:00:380589デフォルトの名無しさん
2010/09/22(水) 00:11:15そんな難しい抽象化をやめて、二項演算子があって、Auto boxingで、継承はインターフェースで
パターンマッチがなくて、for構文はC互換にした素敵な言語ができるといいのにね!
0590デフォルトの名無しさん
2010/09/22(水) 00:14:27C言語やVBみたいな言語は構造化プログラミングを当たり前の時代にしましたよね
JavaやC#(Rubyでもいいです)でいえばOOPを当たり前にしたように見えます。
Scalaは何を当たり前にする事ができる言語なものでしょうか?
もちろん流行ったら、という前提で・・・
0591デフォルトの名無しさん
2010/09/22(水) 00:23:19>>メソッドの演算子表記+演算子の結合順序ルール
言語仕様嫁
>>プレースホルダ構文
言語仕様嫁
>>implicit conversion
言語仕様とcategories typesの本1冊嫁
>>case class+パターンマッチ+抽出子
言語仕様嫁
>>traitのスタック
言語仕様嫁
>>for式のわけのわからない構文
言語仕様嫁
以上
0592デフォルトの名無しさん
2010/09/22(水) 00:32:31それぞれの機能や表記がわからんなんて言っとらんわい。
そいつらを組み合わせて出てきたソースコードがカオス過ぎて、
1センテンス毎にドキュメントをひっくり返さないと分からなかったり、
検索キーワードすら分からなくて途方に暮れたりするのが問題なんだ。
0593デフォルトの名無しさん
2010/09/22(水) 00:34:530594デフォルトの名無しさん
2010/09/22(水) 00:35:39> それぞれの機能や表記がわからんなんて言っとらんわい。
> そいつらを組み合わせて出てきたソースコードがカオス過ぎて、
> 1センテンス毎にドキュメントをひっくり返さないと分からなかったり、
> 検索キーワードすら分からなくて途方に暮れたりするのが問題なんだ。
具体的に何がわからないの?それぞれの機能や表記がわかれば
組み合わせても一緒でしょ。つまるところ、理解した気になっているだけで
簡単なコードすら書けないんだよね?
0595デフォルトの名無しさん
2010/09/22(水) 00:49:34一回Haskellやってカルチャーショック受けてくればいいのにと思うよ
そうすればScalaなんて、なるほどねーよくできてるねーって感じになるから
0596デフォルトの名無しさん
2010/09/22(水) 00:59:12初心者はぼくらのScalaから読み始めたほうが馴染み易いぞ
0597デフォルトの名無しさん
2010/09/22(水) 01:06:520598デフォルトの名無しさん
2010/09/22(水) 01:14:240599デフォルトの名無しさん
2010/09/22(水) 01:15:35頑張ってるのはよく分かるつもりだが、
よくできてるかどうかは……悪く言えば、型理論と泥臭い現実のギャップを埋めるために
あれこれ仕様を追加したキッチン言語がScalaだという印象
まあ言語設計は決して間違ってはいないのだろうけど、
SMLやHaskellにある、単一パラダイムがゆえの優美さは当然残ってないね
0600デフォルトの名無しさん
2010/09/22(水) 01:26:31全部の機能とか構文を等価値だと思って、全部覚えて使おうとしてるからよくなくて、
慣れている人は、ここはオブジェクト指向的に書きたいとか、
関数型的に書きたいとかの目的があって使う機能を選ぶわけで
先にそういう感覚を身につけるべきなんだよな
その点ではマルチパラダイム言語のScalaより先に機能が特化されている言語に触れたほうがいい
0601デフォルトの名無しさん
2010/09/22(水) 01:38:110602デフォルトの名無しさん
2010/09/22(水) 02:01:380603デフォルトの名無しさん
2010/09/22(水) 04:07:07解説サイト全然ないし不安だけど
0604デフォルトの名無しさん
2010/09/22(水) 04:56:22和書、洋書含めてもこれしか出てないんじゃないかな。
http://www.amazon.co.jp/dp/1430224215
0605デフォルトの名無しさん
2010/09/22(水) 08:09:28概要とか設計思想を知りたいなら、この質問にマジレスしてるDavid Pollak本人の投稿とか参考になると思う。
http://stackoverflow.com/questions/2683914/why-would-i-use-scala-lift-over-java-spring
リクエストにGUIDを振ることのセキュリティ的な利点とか色々書いてあって、結構面白い。
0606デフォルトの名無しさん
2010/09/22(水) 18:47:330607デフォルトの名無しさん
2010/09/22(水) 21:45:17なんてデジャヴュ
0608デフォルトの名無しさん
2010/09/23(木) 15:09:00特に_と<の組み合わせがヤバい
0609デフォルトの名無しさん
2010/09/23(木) 15:35:090610デフォルトの名無しさん
2010/09/23(木) 16:48:46逆さにすると顔っぽい
0611デフォルトの名無しさん
2010/09/23(木) 19:27:330612デフォルトの名無しさん
2010/09/23(木) 20:19:000613デフォルトの名無しさん
2010/09/23(木) 22:23:18それだと
本にない細かい部分に詰まったら即終了になりそうだね
使ってる企業はどうしてるんだろ
0614デフォルトの名無しさん
2010/09/23(木) 23:30:25LiftのMLで質問するとか?
0615デフォルトの名無しさん
2010/09/24(金) 01:30:45ソースを調べる。
0616デフォルトの名無しさん
2010/09/24(金) 02:49:51これで↓
>>585
言語仕様嫁
以上
0617デフォルトの名無しさん
2010/09/24(金) 09:07:360618デフォルトの名無しさん
2010/09/24(金) 22:08:01という制限をかけたいのですが、どうすればよいですか。
例えば、とあるDTOがあり、クラスの方でtoXml, validateを実装し、
オブジェクトの方でfromXml:Dtoを実装するというルールを作りたいのですが。
0619デフォルトの名無しさん
2010/09/24(金) 22:42:46もちっときちんと書きなさい
曖昧だ
0620デフォルトの名無しさん
2010/09/24(金) 22:50:42なぜimplicit conversion使わないの?
0621618
2010/09/24(金) 23:52:21trait 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はまだ私の理解不足のためか、この場合(どの場合もそうですが。。)使いどころがわかりません。
もう少し御教授いただけますか。
0622デフォルトの名無しさん
2010/09/25(土) 08:31:22abstract 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両方作らなきゃダメ
0623618
2010/09/25(土) 13:30:12そのやり方は私にはなかったので、勉強になります。
只、ちょっと実装側にとって複雑な感じがします。
とりあえず、コンパニオンオブジェクトを使用しないで、
trait Dto {
def apply(node:Node): Dto
def toXml: Node
def validate: Option[ValidationException]
}
にしようと思っています。
0624デフォルトの名無しさん
2010/09/25(土) 14:16:42scala2.7.7からdbcって無くなってます?
もし無くなってたら、DBアクセスの方法を教えて頂けませんか?
0625624
2010/09/28(火) 14:38:280626デフォルトの名無しさん
2010/09/28(火) 20:30:12trait 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
}
だと通るんだがよくわからない、理由を教えてくれ
0627デフォルトの名無しさん
2010/09/28(火) 20:37:43前者はプロパティのオーバーライド扱いだからNG
後者はメソッドのオーバーロードだからOK
0628デフォルトの名無しさん
2010/09/28(火) 20:52:04> 前者はプロパティのオーバーライド扱いだからNG
プロパティのオーバーライドだとimplicit conversion働かないの?
> 後者はメソッドのオーバーロードだからOK
オーバーライドされてないかな?abstract無くてもコンパイル通るけど…
上の例
val i: Int = s
だと働くっぽい。
型推論の問題の気がしてるんだが違うのかな?
0629デフォルトの名無しさん
2010/09/28(火) 21:08:25val i: String = s
でオーバーライドしちゃってる
0630デフォルトの名無しさん
2010/09/28(火) 21:27:42def i: Int = s2i(s)
にしてくれてますよね、その違いはなぜ起こるのでしょうか?
0631デフォルトの名無しさん
2010/09/28(火) 21:36:43s: String
戻り値が
i: Int
のメソッド扱いだからじゃないかな?
多分trait側だと
パラメータなしの
戻り値が
i: Int
のメソッド扱い
0632デフォルトの名無しさん
2010/09/28(火) 22:16:22traitの def i: Int が
> 多分trait側だと
> パラメータなしの
> 戻り値が
> i: Int
> のメソッド扱い
で
classの def i = s が
> パラメータが
> s: String
> 戻り値が
> i: Int
> のメソッド扱いだからじゃないかな?
と言っているの?(これがわからん)
0633デフォルトの名無しさん
2010/09/28(火) 22:47:490634デフォルトの名無しさん
2010/09/28(火) 23:03:36短縮型で書きすぎてて
class側でシグネチャ(引数と戻り値)の違う新たなメソッド定義してることになってる
だからオーバーロードになってる
0635デフォルトの名無しさん
2010/09/28(火) 23:10:50本のサンプルコードがコンパイルできない。オワタwwww
0636デフォルトの名無しさん
2010/09/28(火) 23:15:43> class側でシグネチャ(引数と戻り値)の違う新たなメソッド定義してることになってる
だとコンパイル通らないんじゃないですか?
うちの環境だと
val fuga = new Fuga
fuga.i
はStringの"1"じゃなくIntの1を返してるけど
0637デフォルトの名無しさん
2010/09/28(火) 23:56:150638デフォルトの名無しさん
2010/09/29(水) 00:02:24valとdefでどうして型推論に違いが出るんだぜ?って質問してたような気がするが
もう眠いからいいやおやすみ
0639デフォルトの名無しさん
2010/09/29(水) 00:50:11今度から仕様書熟読してから質問しろ。仕様書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
}
0640デフォルトの名無しさん
2010/09/30(木) 20:46:13Ruby の動的型付けは多くのエラーを引きおこすことに。
そして、安心してデプロイするためには 95% ものテストカバレッジを達成しなければいけないことに。
95% のテストカバレッジを得ることの代償として、私の書いたコードは(テストコードも含めて) Java で書いたものと同等のサイズにまでふくれあがってしまいました。
その上、Rails では動的なコードの変更が可能なため、開発・テスト・デプロイ中にトラブルが続出するようになりました。
高いテストカバレッジを確保しているにも関わらずです。
これらの問題にくわえて、MRI(Matz Ruby Implementation: まつもとゆきひろ氏による Rubyの実装)は速度が遅く、言語仕様も安定していません。
それなのに開発コミュニティはそのことに見向きもしません。
私は他の言語も見てみようと思うようになりました。
そんな時に Scala と出会いました。
Scala を使ってみて、これこそが私が求めていた言語だと思いました。
0641デフォルトの名無しさん
2010/09/30(木) 20:49:170642デフォルトの名無しさん
2010/09/30(木) 21:36:03なぜなら私の部下も大切ないやなんでもない
0643デフォルトの名無しさん
2010/09/30(木) 22:36:580644デフォルトの名無しさん
2010/10/01(金) 00:57:31http://www.infoq.com/jp/news/2008/03/liftweb
0645デフォルトの名無しさん
2010/10/01(金) 01:33:23http://www.infoq.com/jp/news/2010/09/functional-programming-and-gridg
0646デフォルトの名無しさん
2010/10/01(金) 13:19:27https://docs.google.com/fileview?id=0B5FoA4ICfkLjZTJhMDZhZGItODY0Mi00OTBhLTkxNzAtMzZiNjJiZmVmMjc2&hl=en
http://scala.sygneca.com/libs/dbc
APIにScala.dbcとかdbc2ってないんだけど、なんで?
http://www.scala-lang.org/api/current/index.html
0647デフォルトの名無しさん
2010/10/01(金) 13:30:33まだ検討中の段階で公表はしてないってことがちゃんと書いてた
dbc2も策定中だから今はJavaと同じやり方でやっときます
0648デフォルトの名無しさん
2010/10/01(金) 23:32:41かつオーバーロードしてるメソッドをscalaから呼ぶことってできるの?
なんか曖昧な参照でダメって怒られてしまう。
0649デフォルトの名無しさん
2010/10/02(土) 00:32:51どういうので駄目だった?
そういう場合もありえるかもしれんが、たとえば以下のようなコードはOKだった
public class Overload {
public void foo(Object a, Object... args) {
System.out.println("foo1");
}
public void foo(String a) {
System.out.println("foo2");
}
}
0650649
2010/10/02(土) 00:33:41scala> val x = new Overload
x: Overload = Overload@15e6691
scala> x.foo("foo")
foo2
scala> x.foo("foo", "bar")
foo1
0651デフォルトの名無しさん
2010/10/02(土) 01:14:410652デフォルトの名無しさん
2010/10/02(土) 01:19:57java側
public void foo(final Object obj)
public void foo(final Object obj, final String... strs)
scala側
foo(obj)
ってやると「ambiguous reference to overloaded definition」と怒られるのだ。
0653デフォルトの名無しさん
2010/10/02(土) 03:37:10http://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
0654デフォルトの名無しさん
2010/10/02(土) 11:35:370655デフォルトの名無しさん
2010/10/02(土) 12:49:26Java8までずれ込んだJavaラムダ式までの代替には有用だろうね。
Java7にクロージャが入らなくなった事で逆に市民権を得たかな。
0656デフォルトの名無しさん
2010/10/02(土) 16:31:40別にクロージャ云々は別の言語でもできるし
どうでもよい。型推論やもっと他のことを
見なさい
0657デフォルトの名無しさん
2010/10/02(土) 16:34:150658デフォルトの名無しさん
2010/10/02(土) 17:07:43次の方どうぞレベル
0659デフォルトの名無しさん
2010/10/02(土) 17:16:290660デフォルトの名無しさん
2010/10/02(土) 17:19:270661デフォルトの名無しさん
2010/10/02(土) 17:25:350662デフォルトの名無しさん
2010/10/02(土) 17:37:24F#がScalaに比べてそれほど注目を集めていないのもその辺に原因があるんだろうね
テキトーな印象としては、ScalaとJavaの力の差を10とすると、F#とC#の力の差は3くらいな感じ
パターンマッチングとかも便利なんだが、ファーストクラスの関数とかに比べて強力さを少し説明しづらい
んだよなあ。
0663デフォルトの名無しさん
2010/10/02(土) 17:42:260664デフォルトの名無しさん
2010/10/02(土) 18:32:28あるならちょっと勉強しようかな
0665デフォルトの名無しさん
2010/10/02(土) 19:32:24そこはincludeか何かだろう・・・
0666652
2010/10/02(土) 22:18:03ありがと。
http://stackoverflow.com/questions/2159248/spurious-ambiguous-reference-error-in-scala-2-7-7-compiler-interpreter
で対応してる方法でクリアできたよ。
0667デフォルトの名無しさん
2010/10/05(火) 18:24:34「for内包記法の悪用なんじゃないの(英語)」的な声を散見したんだけど、
実際のところどうなの?
教えて識者の人!
0668デフォルトの名無しさん
2010/10/05(火) 20:03:24モナドじゃないよねってのは、たぶん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内包
記法で書けるのは良くないってことなんじゃないかな。実際の批判読んで無いからこんな
ことくらいしか言えないけど。
0669デフォルトの名無しさん
2010/10/05(火) 20:31:56このへん。
http://twitter.com/okomok/status/24398921185
http://polyglot-window.blogspot.com/2009/03/arm-blocks-in-scala-revisited.html
モナド則を満たしてないと、具体的にはどういう弊害があるの?
0670デフォルトの名無しさん
2010/10/06(水) 00:00:25モナド則みたさないとかありえないだろ
この糞ライブラリ作った奴だれよ?
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式で使う上でどのような問題をはらんでいるかだけど、これは使ってみないとよくわからないなあ。
0673デフォルトの名無しさん
2010/10/06(水) 07:58:24『「モナドっぽく」使えるモナドじゃない何かだけど、他のmanaged resourcesと連結する
便利機能があるんだよ』という訳であってるかな?
モナドは最近少し勉強をしてるけど、モナド則に従ってないモナドっぽいもの、
みたいのがなぜ「ダメ」なのか、みたいなのがまだよく分からない。
他のモナドと特定の組み合わせ方ができない、とかそういう感じなのか。
ちなみに、上の指摘をしてた方もARMライブラリを作ってるぽい。
こっちはきちんとモナドになってるのかな。
http://github.com/okomok/mada
0674デフォルトの名無しさん
2010/10/06(水) 14:03:460675デフォルトの名無しさん
2010/10/06(水) 20:04:060676デフォルトの名無しさん
2010/10/06(水) 23:58:200677デフォルトの名無しさん
2010/10/07(木) 00:02:250678デフォルトの名無しさん
2010/10/07(木) 00:19:13∧_∧ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
( ´∀`)< モナドってなんか美味しそう
( ) \___________
| | |
(__)_)
0679デフォルトの名無しさん
2010/10/07(木) 23:31:120680デフォルトの名無しさん
2010/10/07(木) 23:42:010681デフォルトの名無しさん
2010/10/08(金) 01:19:57Box使って、既存ライブラリの例外をラップしつつ、Failureをチェーンしていけばいいのか、
と思ったんだけど、Failure[Int]を ?~! してFailure[String]で返す、みたいなことをやろうとすると
(当たり前だけど)型が合わないって怒られるし、そもそもJVMがやってる例外を投げる処理を
自分で書いてるのも同然なので本末転倒感が。
例外のいいところって、例外を投げたコード位置と説明をパッケージできるところだと
思うんだけど、Option/Boxを使って似たようなことを(スマートに)できないのかな?
0682デフォルトの名無しさん
2010/10/11(月) 19:31:39「異常系処理を正常系処理と明確に分けて記述できるのがいいね」って誰かが
言い始めたから取り入れられたんですよね?
関数型で処理を実行している場合、正常系の一形態としてエラーを無視すると
いうケースが有用な場合があるよという例が一人歩きして混乱を招いている感じがあるます
0683デフォルトの名無しさん
2010/10/11(月) 19:32:58>「異常系処理を正常系処理と明確に分けて記述できるのがいいね」って誰かが
>言い始めたから取り入れられたんですよね?
0684デフォルトの名無しさん
2010/10/12(火) 01:17:57その辺をもうちょい掘り下げて説明していただけるとありがたい。
0685デフォルトの名無しさん
2010/10/12(火) 06:56:42Doubleは当然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]みたいなのを定義するとしても、
どうするのが筋がいいのでしょうか?
0686685
2010/10/12(火) 11:59:10を参考に自分でつくってみましたが、無駄に長い・・・。
++++++++++++++++++++++++++++++
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))
}
0687685
2010/10/12(火) 12:00:25上の文脈でうまく使えない・・・orz
0688685
2010/10/12(火) 12:02:38scala> implicitly[Integral[Int]].quot(3,2)
res0: Int = 1
こんな感じでどう?
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))
}
0690685
2010/10/12(火) 17:12:19前回も助けていただいたのです。ありがとうございます。
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))
これが通らないのです・・・。
0691685
2010/10/12(火) 17:21:29http://lampsvn.epfl.ch/trac/scala/browser/scala/tags/R_2_8_0_final/src//library/scala/math/Numeric.scala
ややトリッキーだけど、
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))
}
という風にすれば一応できないことも無い。ただ、ここまでする手間に見合うかは疑問だが。
0693デフォルトの名無しさん
2010/10/13(水) 00:22:18とか、ダメダメなパターンマッチは思いついてましたけど、ここまでやるか・・・(笑)
この「できそう」と「できた」のギャップの著しさはC++のそれと似てて、初心者に厳しいですね。
は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))
}
0695デフォルトの名無しさん
2010/10/13(水) 00:54:29コンパイラが固まったんだけど、この現象って既出?
tracに関係ありそうなキーワードで検索かけた限りでは引っかからなかった。
現象再現するコード提示してくれれば、代わりにバグ報告しても良いよー
0697デフォルトの名無しさん
2010/10/13(水) 07:53:52ありがとう、ではお言葉に甘えてお願いします。
http://www.geocities.jp/dryad_saddle/shogi/AkaraLogParser.scala.txt
汚いコードでお目汚し恐縮ですが、@tailrec def parseAkaraLog()とこです。
orElseで分けてあるところをつなげて、全て一つのmatch文に収めてやると、
scalacでのコンパイルが途中で沈黙したり。再現しますかね?
どちらかというと何かの計算量が爆発してる感じがしますが。
0698697
2010/10/13(水) 08:03:00scala AkaraLogParser.scala < akara2010.log > akara2010_jp.log
みたいに実行したら、実行完了後も、何かのjavaプロセスが_jp.logの方をロックし続けて、
二回目以降に「プロセスが占有して」云々というエラーが出て実行できなくなる
現象がありました(タスクマネージャから強制終了してやるとなおる)。
なんかこっちは既出そう。。
現象再現できました(Scala 2.8.0.final on jdk1.6.0_20 on Windows 7)。少なくとも、数分以内にはコンパイル
が終わらない事を確認しました。どっかで無限ループしてるのか、あるいは、なんかの理由で指数関数的に
計算量が爆発して、終わらないように見えてるのか…。現象を再現できる最小のコードにしぼる必要があるので、
多少時間かかりそうですが、報告しときます。
0700685
2010/10/13(水) 15:49:55実際の目的に合わせて修正してみました。
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が欲しい訳ですが、なかなか難しくて・・・。
0701685
2010/10/13(水) 15:51:21『Scalaで型レベルプログラミング』の最後に
「本格的にScalaで型レベルプログラミング するのは現時点では時期尚早」
ってあるのに見事にはまってます・・・トホホ
0702デフォルトの名無しさん
2010/10/17(日) 04:09:460703デフォルトの名無しさん
2010/10/17(日) 11:57:24きちんとバグはバグで修正しろ
0704デフォルトの名無しさん
2010/10/18(月) 06:06:180705デフォルトの名無しさん
2010/10/19(火) 20:42:58要素ごとに自分で構築するしかないのでしょうか?
たとえば下は通りませんが、コレクションのどれかを経由すれいいとか。
val v:Vector[Double] = List(3.2,1.2).toIndexedSeq
0706デフォルトの名無しさん
2010/10/19(火) 22:06:30val v = Vector(List(3.2,1.2): _*)
0707デフォルトの名無しさん
2010/10/20(水) 00:45:19Lisperなら普通に理解できたりすんの?
0708デフォルトの名無しさん
2010/10/20(水) 00:55:04逆に読みづらいとも言われるだけ
0709デフォルトの名無しさん
2010/10/20(水) 01:33:06>>706のは、可変長引数を取るメソッドにコレクションを渡すために
:_*という専用の記法があるというだけの話だが、変態という程のことか?むしろ
簡単な話じゃないか
0710デフォルトの名無しさん
2010/10/20(水) 02:11:06ってのは歴史が証明しまくってるんだけどねぇ。
0711デフォルトの名無しさん
2010/10/20(水) 02:32:35まさかScala特有だとは思ってないよな
0712デフォルトの名無しさん
2010/10/20(水) 03:20:21C系の言語と比べて、構文もそうだし、概念にしても想像つかないやり方ばかりなんだ
コード数行読むだけで行き詰まる
構文逆引き辞典つくれ
おまえに毎日このスレに5個づつくらい貼る作業を与えてやる
0713デフォルトの名無しさん
2010/10/20(水) 03:41:370714デフォルトの名無しさん
2010/10/20(水) 04:23:49自分はこの記法知ってましたが(思いつかなかったけど)、
「要素ごとに自分で構築する」のシンタックスシュガー
って感じがします。
要素数が巨大な場合は不自然な感じがするので、きっと他のやり方があるに違いないと思っています。
他に思いついたらまたお願いします。
0715706
2010/10/20(水) 04:29:23val vec = Vector.empty[Int]++List(1,2,3).toIndexedSeq
です。
0716705
2010/10/20(水) 04:31:040717705
2010/10/20(水) 04:39:50Lispじゃないけど関数型のノリで入ると習得はすごく楽だと思いますよ。
使いこなすには経験積んで細かいテクを叩き込まないと難しそうですが。
(自分はまだこの段階)
0718デフォルトの名無しさん
2010/10/20(水) 06:15:41可変長引数は内部的にはコレクションにまとめて渡してるだけだし、
>>706のソースはList.apply()の結果をそのままVector.apply()に渡すように
コンパイルされるので、そんなに気にする必要はないと思うが。
0720デフォルトの名無しさん
2010/10/20(水) 15:11:550721デフォルトの名無しさん
2010/10/20(水) 22:48:58なので、誰かいい感じのチートシートを紹介しろ。
0722デフォルトの名無しさん
2010/10/20(水) 23:29:16一番上は初代スレ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
0723デフォルトの名無しさん
2010/10/21(木) 00:12:46: _* が載ってるのが一つもないじゃん。
0724705
2010/10/21(木) 00:44:38読んだとき分かりにくいというのには同意するし、確かに忘れます。
>>715
で出した代替案とかは公式のAPIを探索すれば原理的には探し出せるので、
そういう意味でいいんじゃないでしょうか?
0725デフォルトの名無しさん
2010/10/25(月) 00:25:20少し前使ってたときはFTP関係とIME関係で詰まって放棄してしまった。
Javaのプリプロセッサだと割り切ればいい言語なんだが・・・
0726デフォルトの名無しさん
2010/10/25(月) 00:36:28本当に役にたつ チートシートを作ったら、ヒットするんじゃない?
で、言語のお遊びみたいなのを卒業したら、
次は実践的なTIPS集だな。
Scala逆引き辞典
みたいなの。
0727デフォルトの名無しさん
2010/10/25(月) 01:02:51目的が限定された言語のような期がするが
0728デフォルトの名無しさん
2010/10/25(月) 06:58:110729デフォルトの名無しさん
2010/10/25(月) 10:59:25それは利用者が少なくてライブラリが少ないという話では
>>728
基本的なものというのが用途によるんでしょ
Javaがサーバーサイドで使われているのなら、その用途に関しては揃っているんじゃないの
0730デフォルトの名無しさん
2010/10/25(月) 23:16:03モンが登場して欲しいところだな
0731デフォルトの名無しさん
2010/10/26(火) 08:09:370732デフォルトの名無しさん
2010/10/26(火) 14:32:390733デフォルトの名無しさん
2010/10/26(火) 21:15:06『.NET Framework 1.0、1.1、2.0、3.0 または 3.5 用の更新プログラムをインストールしてください』
オンナスキー「…これは新手のDLLヘルってやつじゃないのか?」
0734デフォルトの名無しさん
2010/10/27(水) 08:16:17RC名乗っちゃいけない気がするんだ。
Bata名乗れ。
0735デフォルトの名無しさん
2010/10/27(水) 19:40:570736デフォルトの名無しさん
2010/10/27(水) 23:34:16ビルドツールのおすすめってなにかな?
sbtは2.8だと使えないみたいな話もあるけど・・・
0737デフォルトの名無しさん
2010/10/27(水) 23:38:06『David Pollakは言っている、Mavenを使えと!』
0738デフォルトの名無しさん
2010/10/27(水) 23:49:13普通に使えるから大丈夫
0739736
2010/10/28(木) 00:04:49Mavenはあの長大なpom.xmlを見るだけで敬遠しちゃうんだよなー
>>738
とすると使えない云々は昔の話なのか。
ところで、sbt使って開発したとして、完成したプログラムはどうやって実行するのが普通?
「sbt run」だとごちゃごちゃとメッセージが出力されてうっとうしいんだけど
代替手段がよく分からない。scalaコマンドも引数指定面倒だし。
0740デフォルトの名無しさん
2010/10/28(木) 01:38:16ってやると空のRangeが返って来るんだけどなんでなん?バグ?
0741デフォルトの名無しさん
2010/10/28(木) 13:56:07Range.scalaの74行目
>def length = fullLength.toInt
でオーバーフローしてるっぽい(scala2.8.1RC4)
0742デフォルトの名無しさん
2010/10/28(木) 22:45:24「val pf: String --> String = { case "": ... }」って書けるのは何で?
0743デフォルトの名無しさん
2010/10/29(金) 00:34:27は
A Type B
って書けるようになってる。
0744デフォルトの名無しさん
2010/10/29(金) 00:58:56なるほど。ほんと何でもアリだな・・・。
0745デフォルトの名無しさん
2010/11/02(火) 02:56:43sbtはデフォルトだと2.7.7がインストールされる
Scala2.8使うには、対話モードで 'set build.scala.versions 2.8.0' して
'reload' すると2.8がダウンロードされる。
build.propertiesも更新される。あとは '+compile' すれば完了
コンソール出力ごときでストレス感じるなら
いい感じにIDE対応するまで大人しくしてれば
0746デフォルトの名無しさん
2010/11/02(火) 09:20:57ゴスリングに見捨てられても僕らは死ぬまでイッイイイッイーマックス
大丈夫だ、問題ない。
0747デフォルトの名無しさん
2010/11/02(火) 22:46:450748デフォルトの名無しさん
2010/11/03(水) 00:47:260749デフォルトの名無しさん
2010/11/03(水) 08:41:370750デフォルトの名無しさん
2010/11/03(水) 14:49:39http://sourceforge.net/projects/erlybird/files/nb-scala/
ぜんぜんわからん
0751デフォルトの名無しさん
2010/11/04(木) 00:44:490752デフォルトの名無しさん
2010/11/06(土) 04:13:46補完の遅延とか同じ設定でJavaだとさくさく。なんでぞ
0753デフォルトの名無しさん
2010/11/06(土) 09:46:35IntelliJ IDEAがそうなの?
現時点でScalaに一番ちゃんと対応してるのがIntelliJ IDEA
Java-Scala言語間横断した名前変更とかもちゃんと機能するのは素直に凄い
ただ、ある程度PCの性能を要求するので低スペックPCには向いて無い。
0755デフォルトの名無しさん
2010/11/06(土) 22:03:01Scala 2.8で比較するとして。
0756デフォルトの名無しさん
2010/11/06(土) 22:14:180757デフォルトの名無しさん
2010/11/06(土) 23:11:15Emacsかなぁ
0758デフォルトの名無しさん
2010/11/06(土) 23:20:35Scala 2.7系時代の話。
2.8系になってからは、……知らん。
0759デフォルトの名無しさん
2010/11/07(日) 00:13:27面倒くさくないのならIDEAかなぁ
0760デフォルトの名無しさん
2010/11/07(日) 01:20:390761デフォルトの名無しさん
2010/11/07(日) 03:13:490762デフォルトの名無しさん
2010/11/07(日) 03:52:500763デフォルトの名無しさん
2010/11/07(日) 06:17:300764デフォルトの名無しさん
2010/11/07(日) 09:20:490765デフォルトの名無しさん
2010/11/07(日) 13:13:33何かの拍子に一度駄目になる(空白の補完ポップアップが出るようになる)と
再起不能っぽい。
あと、上にも同じ事書いてる人が居るが、かなり遅い。
0766デフォルトの名無しさん
2010/11/07(日) 13:23:553日頑張ってEclipseに戻した
0767デフォルトの名無しさん
2010/11/08(月) 00:49:000768デフォルトの名無しさん
2010/11/09(火) 01:11:22今日の構文
(1 to 10).foldLeft(1) { _ * _ }
この肛門みたいな構文の意味だれか教えろ
foldLeft関数から教えろ
0769デフォルトの名無しさん
2010/11/09(火) 01:30:2510!
0770デフォルトの名無しさん
2010/11/09(火) 01:34:51仕組みやねん
0771デフォルトの名無しさん
2010/11/09(火) 01:55:10最初に、引数の要素(単位元になることが多い)と、
レシーバーの一つ目の要素を使って計算して結果を出す
次はその結果とレシーバーの二つ目の要素を使って計算する
これを最後まで繰り返す
foldLeftというのは左から処理していくということだ
foldRightというのもあるが末尾再帰でないから、
できればfoldLeftを使ったほうがいい
関数型言語の基本的な関数の一つだな
0772デフォルトの名無しさん
2010/11/09(火) 02:20:03「肛門みたいな」が問題なら、
(1 to 10).foldLeft(1) {(ret, i) => ret * i }
の略記法が、
(1 to 10).foldLeft(1) { _ * _ }
ってわけ。
0773デフォルトの名無しさん
2010/11/09(火) 02:53:26def fact(n: Int): Int = {
return (1 to n).foldLeft(1) {_*_}
}
fact(0)としたとき、この式でなんでちゃんと1が返るのか読み取れない
最初にfoldLeft(1)の1とnの0を掛けて0になっちゃわない?
0774デフォルトの名無しさん
2010/11/09(火) 05:09:450775デフォルトの名無しさん
2010/11/09(火) 08:23:35関数型言語はライブラリのコードが簡単だから、
ソースコードを直接見て覚えたほうがいいんだけど、
Scalaはその点でコレクションのコードを見てもさっぱりわけわかめだから、
関数型の動作をScalaで覚えるのはあまりおすすめしない
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がそのまま返される、という言い方もできる。
0777デフォルトの名無しさん
2010/11/09(火) 11:16:08このレス見ると1 to 0がRange(0)みたいなのを返してると勘違いしてるんじゃないか?
0778デフォルトの名無しさん
2010/11/09(火) 11:58:57ソース見るなら、2.8より前のだな。
実装がやけに読みづらくなってるからなあ。ユーザ側としては間違いなく使い易くなってると
思うんだけど、いざ実装追いたくなったときにめんどいよね
0780デフォルトの名無しさん
2010/11/10(水) 06:51:470781デフォルトの名無しさん
2010/11/10(水) 08:54:09キタ━━━━(゚∀゚)━━━━ !!!!!
akka 1.0もすぐ?
0782デフォルトの名無しさん
2010/11/13(土) 02:11:18関数型で書かれたアルゴリズム本とか誰か知らない?
0783デフォルトの名無しさん
2010/11/13(土) 09:35:46ML自体の説明は、
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/チュートリアル
0784デフォルトの名無しさん
2010/11/13(土) 09:57:05ありがとうございます。
まずHaskellから勉強する必要がありそうですね。
0785デフォルトの名無しさん
2010/11/13(土) 12:23:040786デフォルトの名無しさん
2010/11/13(土) 12:45:570787デフォルトの名無しさん
2010/11/13(土) 13:13:54最初Mavenでアーキタイプ指定してプロジェクトをダウンロードして、そのあと SBT で
sbt update
sbt jetty-run
ってやったんだけど、これ全部SBTでできないの?
前にSBTだけで構築しようとして試行錯誤したときは
sbt jetty-run で jetty がねーよってエラーでてダメだったんだよね
0788デフォルトの名無しさん
2010/11/13(土) 13:28:000789デフォルトの名無しさん
2010/11/13(土) 13:52:050790デフォルトの名無しさん
2010/11/15(月) 00:13:03思うんだけど、デフォpublicなScalaはなんか思想か解釈が変わったの?
どう気持ちを切り替えたもの?
0791デフォルトの名無しさん
2010/11/15(月) 00:23:460792デフォルトの名無しさん
2010/11/15(月) 03:31:51Java の場合、フィールドを public にしたら、後で、値の取得・設定時に何らかの処理を挟みたくなっても呼び出し側の
コードを getter/setter 呼び出しに変更してもらう以外に行う術がない。
だから、フィールドに直接アクセスさせずにあらかじめ getter/setter 経由にしておく。
一方、Scala の場合、呼び出し側のコードを変更することなしに、フィールドをプロパティに変更するだけで可能になる。
だから、Scala の場合はデフォルト public で問題ない。
と解釈している。
>>791
Java の場合、デフォルト(公開識別子省略時)はパッケージ private だね。
ただ、>>790 の言う「メンバー変数はデフォルトprivate」の部分は、「フィールドを書くときには private を明示的に付けて
宣言するのが良い仕様のデフォルト(標準)」と言っているんだと思う。
0793デフォルトの名無しさん
2010/11/15(月) 03:54:41Scalaで外部に公開される変数(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がどうなるかは知らない。
0794デフォルトの名無しさん
2010/11/15(月) 04:08:52public int piyo { get; private set; }
も真似出来る?
自動実装のプロパティで、且つセット出来るのは内側からだけって奴。
0795デフォルトの名無しさん
2010/11/15(月) 08:11:070796デフォルトの名無しさん
2010/11/15(月) 16:09:14ttp://www.infoq.com/jp/articles/linkedin-scala-jruby-voldemort
0797デフォルトの名無しさん
2010/11/15(月) 23:11:330798デフォルトの名無しさん
2010/11/15(月) 23:22:47http://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
です。
0799デフォルトの名無しさん
2010/11/17(水) 00:17:56たいして面白くもない創作文章をあちこちのスレにマルチ投稿するなよ。
ところで、Cygwinって今時使っている人居るのかなあ。。
0800デフォルトの名無しさん
2010/11/17(水) 11:34:30使ってるよ
ただし今はもはや実質 ssh クライアントとしてしか使ってないけど
Cygwin なかったら Windows でどうやって ssh すればいいのかわからんw
0801デフォルトの名無しさん
2010/11/17(水) 12:12:21Tortoiseのようなエクスプローラ拡張系は再起動求められるからいややねん
0802デフォルトの名無しさん
2010/11/17(水) 13:05:590803デフォルトの名無しさん
2010/11/17(水) 14:22:14puttyおすすめ
0804デフォルトの名無しさん
2010/11/17(水) 15:07:32Scala + Play! Framework で、RailsライクなScailsを作るそうですよ。
0805デフォルトの名無しさん
2010/11/17(水) 23:00:49ジョークや言うてはるで
0806デフォルトの名無しさん
2010/11/19(金) 02:05:02その場で名前付きオブジェクトをつくっていく方法ってありましたっけ?
import scala.util.parsing.combinator.JavaTokenParsers
def dir:Map[String,Any] = "dat/" ~> decimalNumber ^^ ("x",_.toInt) <~ "/" ~> decimalNumber ^^ ("y",_.toInt)
イメージとしてはこんな感じだけど、
Mapじゃなくて
dir.x
dir.y
みたいなアクセスができるとなおよい。
質問が乱暴で申し訳ないが、ピンときたら教えてくださいませ。
0807806
2010/11/19(金) 20:47:56ですが、わざわざオブジェクトをつくるほどでもなさそうなので、
タプルにすればいいかと思うのですが、今度は別のとこでひっかかりました・・・
数字+拡張子の分解をしたい場合、ピリオドが小数点と解釈されてしまいます。
下のように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"))
0808デフォルトの名無しさん
2010/11/19(金) 21:29:41あとドキュメント読むと分かるけど、guardは入力を消費しない(it will not consume any input)ので、
guard(".html")にマッチした時点で".html"という入力がまだ余っている。
んでparseAllは入力の最後まできっちりパースしようとするから、".html"が余ってんぞコラってエラー出す。
parseAllをparseに置き換えたら通る。
別にguard使わんでも".html"にマッチさせて<~で読み捨てればいいと思うけど
0809806
2010/11/19(金) 22:08:31IDE使ってない(てかそもそもいいのはない?)ので、実行時エラーでは手も足も出ないなぁ。
思いがけないところで勉強になりました。
0810デフォルトの名無しさん
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) こんな感じで。
0811デフォルトの名無しさん
2010/11/19(金) 23:13:55get呼んだところではじめて例外が投げられるんでしたごめん
0812デフォルトの名無しさん
2010/11/20(土) 16:40:47参考になったのはこのページ↓
http://heikoseeberger.blogspot.com/2010/08/how-to-setup-scala-project-with-sbt-and.html
0813デフォルトの名無しさん
2010/11/22(月) 00:21:06NetBeansはどのへんがだめでしたか?
0814デフォルトの名無しさん
2010/11/23(火) 01:38:240815デフォルトの名無しさん
2010/11/23(火) 02:01:450816デフォルトの名無しさん
2010/11/23(火) 02:48:340817デフォルトの名無しさん
2010/11/23(火) 02:52:490818デフォルトの名無しさん
2010/11/23(火) 02:59:410819デフォルトの名無しさん
2010/11/23(火) 11:55:31>Scalaで学ぶ関数脳入門
>この本は現在お取り扱いできません。
なんで?
0820デフォルトの名無しさん
2010/11/23(火) 16:19:14-------------
オブジェクト指向プログラマが次に読む本 -Scalaで学ぶ関数脳入門 [単行本(ソフトカバー)]
株式会社テクノロジックアート (著), 長瀬 嘉秀 (監修), 町田 修一 (監修)
価格: ¥ 3,339 通常配送無料 詳細
-------------
ちなみに、、、
半年ほどボチボチScalaを学んできたが、いまいち、取得できない。
関数型言語習得して、何が良いのだろう。メリットは...?
C++,Java,Rubyに比べると、Scalaは格段に難しく感じる。
Scalaを取得するメリットが分からなくなってきた。。
スランプかなあ。
上述の本買ってみるか。内容不明だけど。
0821デフォルトの名無しさん
2010/11/23(火) 16:38:55Scalaで、普通に int型の変数を宣言することって出来なかったっけ?
C言語で言うところの
int i;
みたいなの。
scala> var i:Int = 0
と初期値を指定すれば良いのだが、
scala> var j:Int
とか
scala> var k = new Int
はエラーなんだよなあ。
0822デフォルトの名無しさん
2010/11/23(火) 17:01:08>>820
の本に関連したiPAD用アプリ。
----------
http://www.speakipad.com/ipad-apps/scala-ebook-books
Description:
iPad上でScalaのソースコードを動かしながら、関数脳を学習できるブックアプリです。
技術評論社刊『オブジェクト指向プログラマが次に読む本?Scalaで学ぶ関数脳入門』の一部を元にしています。
----------
ScalaってiPad上でも動いたんだっけ?
と思ったら、サーバ上で実行している、らしい。
0823デフォルトの名無しさん
2010/11/23(火) 17:12:49var x: Int = _
0824デフォルトの名無しさん
2010/11/23(火) 17:19:170825デフォルトの名無しさん
2010/11/23(火) 17:26:470826デフォルトの名無しさん
2010/11/23(火) 17:35:16関数型で書けば劣悪なコードが減るってこと?駄目なやつは関数型だろうがなんだろうが結局劣悪なコード書きそうな気がするんだが。
0827デフォルトの名無しさん
2010/11/23(火) 17:40:49> var x: Int = _
おおー!
ありがとうございました。 (_<_)
しかし、Scalaは、記号が分からん。どこかに一覧表はないものか。。。
>>825
なるほど。
大昔のC言語みたいに「関数の先頭以外では、変数宣言できない」ってことはないから、
「変数は使うときに宣言せよ」→「使うときには初期値分かっているから、宣言と同時に代入しろ」、ってことか?
0828デフォルトの名無しさん
2010/11/23(火) 18:13:20var i = 0
でも可。型推論で i はInt型になる
Javaできるならコップ本が分かりやすいと思うなー
0829デフォルトの名無しさん
2010/11/23(火) 18:50:55> var i = 0
> でも可。型推論で i はInt型になる
↑
初期値なしで変数宣言したかったので。。
次のように、クラスのメンバ変数を宣言するときに、
C++とかだったら初期値(初期化)なしで、とりあえず変数宣言することが多いが、
おなじようにScalaでも書きたかったので。
---------
class Test1 {
var m:Int= _ ; //<< ここ
def setM(s:String) = { m=s.toInt}
def view = {println( m ); }
}
---------
0830デフォルトの名無しさん
2010/11/23(火) 19:01:06それより新しいバージョン指定しても、2.7.7使うんで(キリッ とか言われる気がする
64bit Windowsなんだけど、IntelliJ IDEAでfsc使おうとするとコンパイルが終わらない
コンパイルのプロセスをタスクマネージャから強制終了すると実行結果が返ってくるからサーバーの連携に失敗してる?
海外のフォーラム見て回ってるんですが、似たような症状の人いませんか
0831デフォルトの名無しさん
2010/11/23(火) 19:09:39Scalaでは、初期化無し(デフォルト値で)でvarを宣言するのはあまりいいスタイルでは無い気がする
コンストラクタ中で必ず初期値が代入されるようにするのが定石というか…
>>830
sbtはScalaのバージョン指定で2.8.0とか入れれば、ビルド対象のプロジェクトは2.8使うようになるよ
デフォルトで2.7を勝手にダウンロードするのはたぶんsbtのブートに使ってるのであって、プロジェクトの
設定とは別物。
IDEA+fscの方は同じ状況になったことが無いのでよくわからない
0832デフォルトの名無しさん
2010/11/23(火) 19:19:520833デフォルトの名無しさん
2010/11/23(火) 19:36:11ってどうなの?
株式会社テクノロジックアートってやばい感じするんだけど?
0834デフォルトの名無しさん
2010/11/23(火) 19:40:37var x: Int = _
これは初期値なしって意味じゃないよ
デフォルト値(Intなら0、参照型ならnull)で初期化する
0835デフォルトの名無しさん
2010/11/23(火) 19:48:55その例だったらOption使うのがいいのでは
class Test1 {
var m: Option[Int] = None
def setM(s:String) { m = Some(s.toInt) }
def view { m foreach println }
}
0836デフォルトの名無しさん
2010/11/23(火) 20:31:380837デフォルトの名無しさん
2010/11/23(火) 20:40:34わざと初期化しないでおいて
分岐のどれかで初期化漏れない事を
コンパイラにチェックさせる手もあるが。
0838デフォルトの名無しさん
2010/11/23(火) 20:59:11それだけでチェックする気にもなれない
0839デフォルトの名無しさん
2010/11/23(火) 21:08:40> 64bit Windowsなんだけど、IntelliJ IDEAでfsc使おうとするとコンパイルが終わらない
たしかに、そういう時はある。
外部で別途fscを立ち上げて置いてから、
Compiler > Scala Compiler の "Use fsc"にチェックを入れて使うのが確実な気がする。
Process Explorerで監視推奨。
つーか、sbt用意したのなら、IDEAでコンパイルする必要があんまり無いような。
あと、俺は使ってないけど、IDEA用のsbtプラグインが有るので、使ってみれば?
0840デフォルトの名無しさん
2010/11/23(火) 23:48:44あと、"hoge = %d".format(hoge) とか、いつからあったんだ?
0841デフォルトの名無しさん
2010/11/24(水) 00:25:36記憶してる限り、2.7前後で入った関数だったはずなので、結構前からあると思うよ
0842デフォルトの名無しさん
2010/11/24(水) 01:34:59みたい?
除外指定の部分だけ、
override def ivyXML = ...
でXMLを書いたら、一応目的は達せられたけど、ちょっと不格好になった。
0843デフォルトの名無しさん
2010/11/24(水) 20:34:030844デフォルトの名無しさん
2010/11/25(木) 02:01:54evidenceの略
0845デフォルトの名無しさん
2010/11/25(木) 11:43:55�d
0846デフォルトの名無しさん
2010/11/27(土) 00:21:38読みやすくてわかりやすい
0847デフォルトの名無しさん
2010/11/27(土) 09:20:06社員乙
0848デフォルトの名無しさん
2010/11/27(土) 13:47:330849デフォルトの名無しさん
2010/11/27(土) 14:54:220850デフォルトの名無しさん
2010/11/27(土) 15:06:19中身は、意外に広い範囲を扱ってた。
0851デフォルトの名無しさん
2010/11/28(日) 00:10:02http://www.google.com/search?q=scala+cheat+sheet&lr=
上から順に
- https://github.com/joulieboolie/scala-cheatsheet/
- http://anyall.org/scalacheat/
- http://blog.tmorris.net/scalaoption-cheat-sheet/
- http://www.ayutaya.com/2010/11/14/scala-cheat-sheet-private/
0852デフォルトの名無しさん
2010/11/28(日) 00:12:02> 表紙絵とタイトルが最悪。
> 中身は、意外に広い範囲を扱ってた。
「ボクらのScala 次世代Java」もそんな感じ。
タイトルと本の中身が一致していない。
中身は非常に良いのに、タイトルで避けられていたら残念。
あと、プログラミングのための線形代数 とかいう本も、
中身とぜんぜんミスマッチした表紙絵だったなあ。
ああいうのって、作者の意向と関係なしに、出版社側が勝手にタイトルとか表紙絵
をつけるみたいだけど、企画した人は批評の数の分だけ減給にするべきだな。
0853デフォルトの名無しさん
2010/11/28(日) 02:24:23とてもそうは思えないけどw
0854デフォルトの名無しさん
2010/11/28(日) 02:40:10"Getting into Functional Programming World in Scala"って伝えてるらしい。
0855デフォルトの名無しさん
2010/11/28(日) 03:25:46Scala「で」関数型に入門という趣旨はありだと思うけどね。
タイトル見て多少ミスリードはあるが、Scala=関数型言語という売り方ではないし
いや中身は読んでないけどw
マルチパラダイム言語ってのはわかってて付けてるでしょう。
0856855
2010/11/28(日) 03:27:34> 本書はオブジェクト指向では飽き足らなくなったエンジニアに、話題の関数型言語であるScalaを使って、
> 今エンジニアに求められる必須プログラミングコンセプトを解説します。
> 関数型言語の基本が身につくほか、コレクションや再帰、並行プログラミング、DSLなどの勘所を、
> 実際のコードを見ながら理解することができます。
http://www.amazon.co.jp/dp/4774144363/
「関数型言語であるScala」
「関数型言語であるScala」
「関数型言語であるScala」
「関数型言語であるScala」
「関数型言語であるScala」
早速、撤回するわ orz
0857デフォルトの名無しさん
2010/11/28(日) 09:17:190858デフォルトの名無しさん
2010/11/28(日) 11:03:110859デフォルトの名無しさん
2010/11/28(日) 11:53:450860デフォルトの名無しさん
2010/11/28(日) 14:32:35という事じゃないか。
@itあたりに連載あるから、本みなくてもどういう感じか分かるはず。
0861デフォルトの名無しさん
2010/11/29(月) 09:22:44それくらい行間よめよってことだろうが、ちょっとまってほしい
まがりなりにも関数型言語をかたるなら命題くらいは丁寧に扱って欲しいものではないだろうか
0862デフォルトの名無しさん
2010/11/29(月) 18:25:430863デフォルトの名無しさん
2010/12/01(水) 02:47:42http://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のが顕著)ということらしいが、
まだインストールしてないので、どんな体感になるのかよくわからない。
0864デフォルトの名無しさん
2010/12/01(水) 05:59:39体感速度も変わらず。AOTコンパイラなんて無駄なもの作っちゃってる会社はかわいそうだわ。
努力が何のプラスにもなってない
0865デフォルトの名無しさん
2010/12/01(水) 11:54:09起動時 AOT>int>JIT
起動後 JIT>AOT>>int
なんだろうけど、HotSpot Client VMが、他のAOTより起動が速いという…
0866デフォルトの名無しさん
2010/12/02(木) 08:03:52という向きにはかなり良書の匂いがする。文章がしっかりしてるし説明が非常に丁寧。
単なるBetter JavaとしてScalaに興味がある人向けではないけど、入門書のバリエーションが
増えたという意味では良さそげ。
0867デフォルトの名無しさん
2010/12/02(木) 23:16:10デフォルトでは空白はスキップされると思っているのですが、スキップされない場合があって
悩んでいます。
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 ))
^
この挙動はどう理解すればよいのでしょうか?
0868デフォルトの名無しさん
2010/12/02(木) 23:18:25空白を変換し忘れました。
上の最後のパースエラー箇所指摘記号(^)はxの直後の空白をさしています。
'('と')'の部分を"("と")"(ダブルクォート)に置き換えてみて。次のような感じで。
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]が生成されてしまったんだな。
0870866
2010/12/03(金) 00:29:22関数型プログラミングの作法について一通り学べる感じなので、なかなか良いのではないでしょうか。
0871デフォルトの名無しさん
2010/12/03(金) 00:29:42うまくいきました。
ありがとうございます。
なるほど、式全体がParser[String]型でも部分式にはParser[Char]型が推論されうるんですね。
暗黙型変換は便利だけど、つまづいたときに原因究明がやっかいですね。
0872デフォルトの名無しさん
2010/12/03(金) 01:10:46新種の顔文字かと思た → '('と')'
ところで、指摘し忘れていたけど、ident ^^ { case s => s }は同じもの返してるだけだから無駄なので単にident
でいいし、"(" ~ term ~ ")" ^^ { case s1~s2~s3 => s2 }は、"("と")"の部分の値を利用しないので、
"(" ~> term <~ ")" とするのが良いと思うよ。まとめると、
def term : Parser[String] = ident | "(" ~> term <~ ")"
0874デフォルトの名無しさん
2010/12/03(金) 23:29:52ありがとうございます。
便利なコンビネータですね。
scalaはちょっと便利な小技が満載で楽しいです。
0875デフォルトの名無しさん
2010/12/04(土) 10:42:04scalaインタプリタを生で使っていると補完(tab)やヒストリ(C-p)がきくのに
emacsからだとどちらも無効になる。
なんとかならない?
0876デフォルトの名無しさん
2010/12/04(土) 13:01:36補完は無理っぽいね
ENSIMEのソースにも「TODO Fix completion...」って書いてあるし
ヒストリは M-p と M-n で動くのでは?
0877デフォルトの名無しさん
2010/12/04(土) 17:36:490878デフォルトの名無しさん
2010/12/05(日) 00:55:22日本の本の表紙が異質すぎる。
特に関数脳入門はなんとかしろ。
0879デフォルトの名無しさん
2010/12/05(日) 05:28:43コップ本と入門本はカッコいいじゃん
外国の表紙はいかにも教科書っぽくて
しかし日本の本、出過ぎだな
明らかに供給過多
それでいてLiftの本は出ないと
0880デフォルトの名無しさん
2010/12/05(日) 08:38:00ありがとう。
ヒストリは確かに動きました。
しかしロードは遅いしエラー時の行番号もでないしメモリリークはあるしで
結局scalaインタプリタはコンパイラのおまけと思った方がいいね。
0881デフォルトの名無しさん
2010/12/05(日) 18:21:06scala> 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が出力されるんだけど何故?
0882デフォルトの名無しさん
2010/12/05(日) 18:50:32object App extends Application {
val it = Iterator("a", "number", "of", "words")
val it2 = it dropWhile (_.length < 2)
println(it2)
println(it.next())
}
toStringに副作用があるのか、これはちょっとキモいなw
0883デフォルトの名無しさん
2010/12/05(日) 20:27:57> val it2 = it dropWhile (_.length < 2)
> println(it.next())
どういうこと?
it dropWhile (_.length < 2)
の評価によってitの参照しているIteratorオブジェクトは変化すると思ってたのだけど違う?
なぜaが出力されるかわからない。
0884881
2010/12/05(日) 20:49:20ttps://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()を呼び出してるのでこうなると。
0885881
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
0886デフォルトの名無しさん
2010/12/05(日) 23:41:52ありがとう。よくわかった。
やっぱりライブラリはソースを見て使わないと駄目だね。
0887デフォルトの名無しさん
2010/12/06(月) 08:38:50> 日本の本の表紙が異質すぎる。
> 特に関数脳入門はなんとかしろ。
関数脳入門は、本の内容は良いのに、表紙イラストで評価さげているな。
あのイラストは、本文では全く使われていなくて、表紙だけに使われているんだけど、
あれにいくらのお金が入っているんだろう?
オレが、この本の売り上げを分配するとすれば、
・執筆者 : 8割 (内容はすばらしい)
・校正者 : 3割 (誤植少なそうだ。)
・編集者 : 4割 (企画としてはまあまあ良い。)
・タイトル考えた人: なし。 ( もっと頭ひねろ)
・表紙イラストレータ: - 50%(イラスト使ってやったんだから金払え)
だね。
0888デフォルトの名無しさん
2010/12/06(月) 08:50:35> コップ本と入門本はカッコいいじゃん
コップ本のあの表紙は、日本語版のオリジナルなんだね。
アレは、なかなかセンスが良いし、カッコイイよね。
コップ本というように愛称で呼ばれるにはそれだけの理由がある。
>それでいてLiftの本は出ないと
Lift本みたいなは、電子書籍で出て欲しいね。
ササっと出版されて、ササっと読まれるような旬の話題を扱った本は、電子書籍が良い。
0889デフォルトの名無しさん
2010/12/06(月) 09:14:35o もっと頭ひねれ
0890デフォルトの名無しさん
2010/12/06(月) 09:17:10ここに頼め
http://tatsu-zine.com/
0891デフォルトの名無しさん
2010/12/06(月) 09:25:400892デフォルトの名無しさん
2010/12/06(月) 09:29:230893デフォルトの名無しさん
2010/12/06(月) 12:02:480894デフォルトの名無しさん
2010/12/06(月) 13:02:55> amazonで関数脳本の中古の方が高いのはなんでなんだぜ?
Amazonでマーケットプレース出品者による、定番の売り方だよ。
一時的に売り切れになる/なった本は、高い値段にして中古本を出品する。
それを見て勘違いして
「これは中古でプレミアムが付いた値段でしか買えないんだ→すぐ買おう」
と言う感じで買っちゃう人が、たまにいるから。
そういうわけで、新品を中古として出品することもある。
0895デフォルトの名無しさん
2010/12/11(土) 00:25:300896デフォルトの名無しさん
2010/12/13(月) 04:58:02とおもったが
アクターなんぞ使わんでも並列は十分充実してるわな
0897デフォルトの名無しさん
2010/12/14(火) 01:26:36http://parallelpatterns.codeplex.com/
http://blogs.msdn.com/b/maestroteam/
JVMなら、Java実装から、scala、AkkaのOTPっぼいのまで色々ある。(使われてる?)
0898デフォルトの名無しさん
2010/12/14(火) 01:57:360899デフォルトの名無しさん
2010/12/14(火) 13:57:06効率的に、簡単に、する仕組みは大歓迎
0900デフォルトの名無しさん
2010/12/14(火) 15:55:25これ読んで勉強になった
0901デフォルトの名無しさん
2010/12/14(火) 19:18:40上のURLで掲示してるTask Parallel Libraryなら標準ライブラリ入りしてるので
メンテ大丈夫かといったら大丈夫に決まってるわけで……。
RoboticsのConcurrency and CoordinationやMS Researchのプロジェクトなど
.NETにも野心的で面白いものはいっぱいある。
0902デフォルトの名無しさん
2010/12/15(水) 04:35:012010年も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として爆発的に普及する
0903デフォルトの名無しさん
2010/12/15(水) 07:12:150904デフォルトの名無しさん
2010/12/15(水) 08:13:25とりあえず今Javaがピンチなんで、Scalaの未来はそれに影響されるかと
0905デフォルトの名無しさん
2010/12/15(水) 08:17:390906デフォルトの名無しさん
2010/12/15(水) 09:57:090907881
2010/12/15(水) 12:29:13まああてにならんけど、StackOverFlowとかGithubとか使ってる層にはすでにそこそこ人気ってことか
0908デフォルトの名無しさん
2010/12/15(水) 16:36:27その記事を信じるなら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/
0909デフォルトの名無しさん
2010/12/15(水) 18:27:47あと、ApacheのJCP脱退で、Apache関連のJavaベースのソフトどうなるかだね。
まあ、C++的なポジションになるのかね。
0910デフォルトの名無しさん
2010/12/15(水) 20:58:25関数型言語を謳っているが型推論が弱いから、面倒で仕方ない。
せめて多相型推論を導入してくれ〜。
無名関数の引数にいちいち型注釈をつけさせないで欲しい。
0911デフォルトの名無しさん
2010/12/15(水) 22:45:59Javaで培った知識と技術はそのまま活かせるんだから伸びないわけがない
採用実績もあるんだしな
0912デフォルトの名無しさん
2010/12/15(水) 23:01:28そんなに悪いもんでもなかったよ
流行るかどうかはあやしいいよね
職場の反応見てると
Javaで事足りる層にとっては面倒な物にしか見えないらしいし
結局Scalaで書いてjadしたJavaコード見せると安心する人多いww
0913デフォルトの名無しさん
2010/12/15(水) 23:07:29流行る必要もないし
いまだにJava1.4使ってるSIerがScala採用とかありえんw
0914デフォルトの名無しさん
2010/12/16(木) 00:09:12Javaとともに没落することはあるが
0915デフォルトの名無しさん
2010/12/16(木) 00:11:22入ってくるんじゃないだろうか?
例えば、デスクトップアプリを作るのにも、結構使えるんじゃないだろうか。
あと、Androidとか、Processingとか、普通のアプリ製作に使えそう。
まあ、JVMとSwingが、最近のPCでようやくストレスなく動くようになったのが大きいけど。
次は、Scalalabという、Matlabとかと同じ用途の数値計算ソフトだけど、
こんなのまで開発されているんだな。
http://code.google.com/p/scalalab/
Web上には、スクリーンショットは見当たらないけど、
実際に起動してみると、なかなかおおがかりなアプリだと思う。
0916デフォルトの名無しさん
2010/12/16(木) 00:32:45jadで吐いたコード眺めてて
言語としてはあれだけど
Javaから使える便利なライブラリとしてならアリだと思った
0917デフォルトの名無しさん
2010/12/16(木) 01:38:52実際にScalaでしかできないことって何かある?
>>912じゃないけど初学者として
>Javaで事足りる層にとっては面倒な物にしか見えないらしい
というのが気になってる。
Rubyスレみたいに、Rubyを選ぶ利点はRubyで書けることだ、なんていわれたら
新進気鋭の会社がエンジニアを釣るのには良さそうな言語なんだなと思ってしまうよ。
逆に言うとまさに「Javaで事足りる層に」は無用なんじゃないかと
担保のなけりゃ言語を覚える気もないのかお前は!というのとそういうわけではなく雑談と思ってくれればいいけど。
0918デフォルトの名無しさん
2010/12/16(木) 02:23:41印象を受けて萎える。
そんな時に「Scalaがあるよ!」と言えば、受け入れやすいと思う。
0919デフォルトの名無しさん
2010/12/16(木) 02:24:37スクリプト言語ブームだって、本当はJavaで事足りてるやつには無用だっただろうな
0920デフォルトの名無しさん
2010/12/16(木) 02:59:46JavaプログラムにできなくてScalaプログラムにできる事は何か、
という意味ならそんなものはないに決まっています。
JavaやScalaも含めて多くのプログラミング言語はチューリング完全であり、
計算能力(計算速度ではなく何を計算できるか)は全く同じです。
JVM系言語は同じJVMの上で動かすのだから何を操作できるかは全く同じです。
広く使われるプログラミング言語が交代するのは、
ソフトウェア作成に必要な労力がプログラミング言語によって違うからです。
Scalaの意義はJavaより簡潔に何をしたいか記述できる事、ただそれだけです。
0921デフォルトの名無しさん
2010/12/16(木) 03:02:17> 広く使われるプログラミング言語が交代するのは、
> ソフトウェア作成に必要な労力がプログラミング言語によって違うからです。
かつてそんなことがあったか?
0922デフォルトの名無しさん
2010/12/16(木) 03:15:34Scalaもどこかデカいところが採用するのを待つしかないね
0923デフォルトの名無しさん
2010/12/16(木) 03:38:43アセンブリ言語で全て記述できるのに
高級言語、構造化プログラミング言語、オブジェクト指向言語が
使われるようになったのはソフトウェア作成の労力削減のためです。
0924デフォルトの名無しさん
2010/12/16(木) 04:10:25結局、新しい事やより良いものを学んで
成長しようという意思のない人たちに
何を言っても無駄なんだな、という
諦観が芽生えてきたよ。
やるせないけどね。
0925デフォルトの名無しさん
2010/12/16(木) 06:24:04RailsでないJavaアプリケーション開発でRuby使いがJRubyを使おうと言い出したら冷たい目で
見てしまいそう。
Scalaは設計段階からJavaとの親和性を考慮してあるとはいえ、知らない人から見たらJRubyと
同じことで、>>912のような反応が当然だろうな。
実務で使おうと思ったら、Railsに相当するそれ自体が目的となるようなものが無いと。
まぁ少なくとも、成長しようという意思(笑)だけでは実務に取り入れることはできないな。
0926デフォルトの名無しさん
2010/12/16(木) 06:50:03今のところコンパイル言語とスクリプトの悪いとこどり言語みたいになってる。
ML系言語が採用している型システムであるHindley-Milnerと違って
残念ながら、Scalaの型システム(Javaの型システムも)は型推論と色々相性が悪い。
特に、完全な型推論をやろうとすると理論的に決定不能。
ちなみに、無名関数の引数に関しては現時点でも型注釈を付けなければいけない箇所はそんなに多く無いと思うけど。
以前どっかでも書いたことがあるけど、型システムの表現力は一般には型推論の強さとトレードオフになっちゃう
0928デフォルトの名無しさん
2010/12/16(木) 13:38:27Scalaは敷居高そう
0929デフォルトの名無しさん
2010/12/16(木) 23:08:35うーん、ぴんとこない。
たとえば、
case class Nil[T]() extends List[T] {}
とあるとき
Nil()に対して∀T.List[T]を推論するとどこがまずくなるん?
0930デフォルトの名無しさん
2010/12/16(木) 23:10:02その中で妥当なのは高級言語だけだな。
あとは普及していた言語が構造化・オブジェクト指向化したか、
別の理由で普及した言語が構造化・オブジェクト指向化されてたか。
高級言語内じゃ「ソフトウェア作成の労力削減」が理由で
「広く使われるプログラミング言語が交代」したことはない。
0931デフォルトの名無しさん
2010/12/17(金) 09:49:290932917
2010/12/17(金) 10:04:03さすがにチューリング完全だから〜などと言われたら、訂正せざるを得ない。
> 実際にScalaでしかできないことって何かある?
実際にScalaでしか(楽に)できないことって何かある?
> JavaプログラムにできなくてScalaプログラムにできる事は何か、
JavaプログラムにできなくてScalaプログラムに(楽に)できる事は何か、
とはいえ、JVMで動くライブラリを書けばScala向けだろうが結局Javaでも使えるだろうし、意味がないか
0933デフォルトの名無しさん
2010/12/17(金) 10:08:53”成長しよう”というのはともかく、"新しい事やより良いものを学んで"というのがないと、
常にその時代に今流行ってる(今ならJavaかPHPか?)ものを使うわけだろ。
プログラマーがたくさんいて、常に安値で雇われ続けるわけだ。
アホじゃねーかw
0934デフォルトの名無しさん
2010/12/17(金) 15:31:16だからちょっとは自分で考えてみたら?
Javaにできなくて、RubyやC#でできる決定的なことはあったのか
それに比べてScalaはどうなのか
0935デフォルトの名無しさん
2010/12/17(金) 18:16:24マルチコア、マルチプロセッサが一般的になるだろうというのが大方の見方。
だから並列処理プログラムを書きやすそうな言語に注目が集まっている。
JavaからClojure、Scalaもその流れだし、MSがF#出したのもそう。
JavaだとGemFireやTerracottaとか使う手ももあるけどね。
0936デフォルトの名無しさん
2010/12/17(金) 18:17:390937デフォルトの名無しさん
2010/12/17(金) 18:35:56C# 4.0の、Parallel.Forがよく出来てるんだよね。
普通のループをちょこっと書き換えるだけで、スレッドプーリングを使った
並列処理出来る。
Scalaで同じこと出来たらいいのに。
2.9で入るという、並列コレクションがそれなのかな?
それとも、Javaの並列コレクションをScala風に味付けしただけ?
0938デフォルトの名無しさん
2010/12/17(金) 20:22:17それと並列化可能なコレクション(Parallelizableトレイトを継承してるやつ)には
並列化した自身を返すparメソッドが定義されてて、
for (i <- (0 until 100).par) yield { /* ごにょごにょ */ }
こんな感じで使えるようになってる
それだと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の型推論がやっかいな
理由はまた別のところにあるんだが、ちょっと長くなりそうなので、その内気が向いたら書いてみる。
0940デフォルトの名無しさん
2010/12/19(日) 20:51:28Liftいろいろ面倒くさすぎる
0941デフォルトの名無しさん
2010/12/20(月) 22:01:41Liftで組めるようになった時、Scalaを大体理解出来たと言える。
0942デフォルトの名無しさん
2010/12/20(月) 23:45:230943デフォルトの名無しさん
2010/12/21(火) 08:01:030944デフォルトの名無しさん
2010/12/22(水) 01:28:32なんかみなさんピーチクパーチクやってるとこのリニューアル動画を見て唖然としたんですが、
ttp://twitter.com/newtwitter
最近のGoogle的な改悪がどんどん進んでいて止まる気配がないように思います。
視覚的な情報認識速度、無駄なマウス操作、そしてページのロード速度、
どれもこれも重くなる一方で、ハードウェアの性能が上がっても体感の不満は一向に解消されません。
このままいくと、(過去幾度も繰り返された如く)進化論的に間違った方向にいくような気がしてなりません。
心理学もわかってないようなデザイナーが大きな顔をするな!と言いたいのですが、
そういう言説はもはや息絶えたかのようにみえます。
まともな開発者に反旗をひるがえしてほしい。そして世界を快適なものにしてほしい。
・・・という業界外の人間の怒りでした。
いっそのこと業界に入って本気のテキストブラウザとか投下してやろうか・・・。
0945デフォルトの名無しさん
2010/12/22(水) 01:54:57っつーか
板違い
0946デフォルトの名無しさん
2010/12/22(水) 01:59:060947デフォルトの名無しさん
2010/12/24(金) 20:58:380948デフォルトの名無しさん
2010/12/24(金) 21:31:55結局.netの制限でここがイケてないねみたいな感じの場所が出てくるのかな
0949デフォルトの名無しさん
2010/12/24(金) 22:12:450950デフォルトの名無しさん
2010/12/24(金) 22:29:510951デフォルトの名無しさん
2010/12/24(金) 22:35:380952デフォルトの名無しさん
2010/12/25(土) 00:22:33Martin Odersky先生には、Scala言語仕様を洗練することに力を注いで欲しいなあ。。
Scalaの言語仕様は、まだまだ発展途上な感じがする。
0953デフォルトの名無しさん
2010/12/25(土) 00:23:54推論していない
for〜yield式は構文レベルでforeach,map,flatMap,filterの組み合わせに変換される
(2.8だとwithFilterってのが加わってちょっと変化したが基本的には同じ)
型推論はその後に行われるので、for〜yield式自体に何か特別な型推論規則がある
わけではない
0955デフォルトの名無しさん
2010/12/25(土) 08:02:58だから、最初のジェネレータの型によって、
結果がListになったりSetになったりするのか。
そしてyieldといいつつ、いわゆる(コルーチン的な)ジェネレータとは違うんだね。
Set上のループだと全部回らないと結果を1つも返せないから。
0956デフォルトの名無しさん
2010/12/26(日) 11:44:512.7.7まではそこそこ正常に動作するぽい
2.8.0以降だとコンパイル時にエラーになる
0957デフォルトの名無しさん
2010/12/28(火) 05:58:03やはりJavaのを使うしかないのかなあ
0958デフォルトの名無しさん
2010/12/30(木) 09:08:48Scalaの文法とか記号とかをうまくまとめているページがあり、
お世話になったので、紹介。
http://www.ne.jp/asahi/hishidama/home/tech/scala/index.html
こういうのは助かる〜。
0959デフォルトの名無しさん
2010/12/30(木) 12:12:16今までで一番良い出来。
0960デフォルトの名無しさん
2011/01/01(土) 18:46:050961sage
2011/01/02(日) 17:32:34.NETはF#が標準で入ったから、それ使うだろjk
0962デフォルトの名無しさん
2011/01/03(月) 15:23:350963デフォルトの名無しさん
2011/01/04(火) 10:53:09どこかにお手軽アプリ作ったりして見せあってるコミュニティとかありますかね?
0964デフォルトの名無しさん
2011/01/04(火) 17:57:11こういうやつでいいのか
https://github.com/languages/Scala
githubだと探す方法が限られてるかな
ついでに質問なんだが、ScalaにはClojarsみたいな公開mavenリポジトリってあるのかな
0965963
2011/01/05(水) 11:41:15おお!まさにこんな感じのやつです!ありがとうございます。
一つ一つ見ていきたいと思います
とくにscala.swing関連のやつはとても助かります
0966デフォルトの名無しさん
2011/01/06(木) 01:35:23scala-tools.orgとか?
0967デフォルトの名無しさん
2011/01/06(木) 21:38:05もっと簡単な書き方あるかな?
val result = (html \\ "_").find(_.attribute("id").exists(_.text == "hoge")).get.text
0968デフォルトの名無しさん
2011/01/06(木) 22:31:54おーあんがとう。最近さわってないので、ど忘れしてた。
0969デフォルトの名無しさん
2011/01/07(金) 18:20:24UntiPatternじゃアンチパターンじゃなくてウンチパターンにしか読めない。
腹抱えて笑ったぞ。
0970デフォルトの名無しさん
2011/01/07(金) 18:23:500971デフォルトの名無しさん
2011/01/07(金) 19:34:17object MailExtractor {
def unapply(string: String): Option[(String, String)] = {
val Pattern1 = 省略
val Pattern2 = 省略
val UntiPattern = """(.*[.][.][^.]*)""".r
以下省略
0972デフォルトの名無しさん
2011/01/07(金) 19:39:080973デフォルトの名無しさん
2011/01/07(金) 19:47:34たぶん、その [.] 1つがコーン1粒を表現してるんだと思うよ。
0974デフォルトの名無しさん
2011/01/07(金) 22:13:450975デフォルトの名無しさん
2011/01/07(金) 22:24:59別にいいけどさ。
0976デフォルトの名無しさん
2011/01/07(金) 22:30:280977デフォルトの名無しさん
2011/01/07(金) 23:29:29これ見て思ったけどMartin先生が突然死んじゃったらScalaってどうなるん?
0978デフォルトの名無しさん
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が死んだら共倒れぽいな
0979デフォルトの名無しさん
2011/01/08(土) 09:18:17発展すると思うよ。きちんと自分の意見言えるようになるはずだし
共産主義、宗教的な指導者はコミュニティは邪魔だし
0980デフォルトの名無しさん
2011/01/08(土) 09:44:38ソ連が崩壊して20年も経つとこういう馬鹿も出てくるわけだ。
0981デフォルトの名無しさん
2011/01/08(土) 11:10:23てゆうか、これわざとじゃね?
0982デフォルトの名無しさん
2011/01/08(土) 13:29:390983デフォルトの名無しさん
2011/01/08(土) 13:42:55Rubyでアニメ好きが書いた本あったろ
そういう類のあれ?
0984デフォルトの名無しさん
2011/01/08(土) 13:45:330985デフォルトの名無しさん
2011/01/08(土) 13:50:25unit のスペルミスじゃねーの
0986デフォルトの名無しさん
2011/01/08(土) 20:46:58http://hibari.2ch.net/test/read.cgi/tech/1294487102/
0987デフォルトの名無しさん
2011/01/09(日) 00:48:32> http://hibari.2ch.net/test/read.cgi/tech/1290367109/588
> これ見て思ったけどMartin先生が突然死んじゃったらScalaってどうなるん?
同感。
Martin先生には、生きている間に、Scalaの言語仕様を完成させてほしい。
今のままだと、まだ発展途上って感じだよね、、、。
0988デフォルトの名無しさん
2011/01/09(日) 01:14:380989デフォルトの名無しさん
2011/01/09(日) 02:29:510990デフォルトの名無しさん
2011/01/09(日) 04:25:460991デフォルトの名無しさん
2011/01/09(日) 04:32:55おっぱい
おっぱい
お
0992デフォルトの名無しさん
2011/01/09(日) 09:12:440993デフォルトの名無しさん
2011/01/09(日) 11:39:290994デフォルトの名無しさん
2011/01/09(日) 14:03:390995デフォルトの名無しさん
2011/01/09(日) 14:18:110996デフォルトの名無しさん
2011/01/09(日) 15:11:55http://hibari.2ch.net/test/read.cgi/tech/1080052050/
0997デフォルトの名無しさん
2011/01/09(日) 17:32:00神が死んだら本当の宗教になるし死んでもらったら困る
0998デフォルトの名無しさん
2011/01/09(日) 19:29:16なんか迷子になった
0999デフォルトの名無しさん
2011/01/09(日) 19:43:18過疎ってんな
1000デフォルトの名無しさん
2011/01/09(日) 19:49:24http://hibari.2ch.net/test/read.cgi/tech/1294487102/
10011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。