プログラミング言語 Scala 7冊目
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
2011/09/04(日) 20:07:34.70ttp://www.scala-lang.org/
■リンク集
ttp://sites.google.com/site/scalatohoku/%E5%8B%89%E5%BC%B7%E4%BC%9A%E8%B3%87%E6%96%99
■前スレ
プログラミング言語 Scala 6冊目
ttp://hibari.2ch.net/test/read.cgi/tech/1307416864/
■Scalaの紹介文(さわり)
Scalaは簡潔かつ優雅で型安全な方法でよくあるプログラミングパターンを表現できるように
設計された汎用プログラミング言語です。
Scalaはオブジェクト指向と関数型言語の特徴をスムーズに統合しておりJavaやその他の言語を扱う
プログラマをより生産的にすることができます。(以下略)
ttp://www.scala-lang.org/node/25
■Scalaに関する書籍(英語)
ttp://www.scala-lang.org/node/959
リファレンスマニュアルや草稿のPDFなども充実しているのでそちらも参照してください。
日本語の資料には、チュートリアルの訳やIBM dW、IT Proの連載記事、各々で開かれた勉強会の資料などがあります。
0263デフォルトの名無しさん
2011/10/02(日) 01:09:08.63なるほどっすな。
Scala2.8の登場で、XMLをもっとうまく実装できる環境が整ったんでしょうね。
そして、これは有望なWebフレームワーク?
BlueEyes
https://github.com/jdegoes/blueeyes
A lightweight Web 3.0 framework for Scala, featuring a purely asynchronous architecture, extremely high-performance, massive scalability, high usability, and a functional, composable design.
Sinatraクローン(Scalatra)をネタに上を目指すとか。MVCならLift使えとか。
0264デフォルトの名無しさん
2011/10/02(日) 08:20:30.82scalaで高速なパーサを作る定番はあるのでしょうか?
パーサコンビネータライブラリしかないのかなあ。
Scalaのパーサコンビネータライブラリは、速度が重要になるパーザを書く用途には
本質的に向いていません(これはコップ本にも書かれていますが、Scalaのパーザコンビネータライブラリの
実装によるところが大きいです)。
速度的に、それよりもっと良いものとして、@djspiewak の GLL Combinators
https://github.com/djspiewak/gll-combinators
というのがあります。これもパーザコンビネータですが、Scala標準のものより速度が出るように
設計されています(特に、LL(k)文法に収まる場合)。
もっと速度を追求したい場合は、既存のJava用パーザジェネレータを使うという手もあります。いくつか
注意すべき点はありますが、基本的にScalaから問題なく使えます。ANTLR辺りが個人的にお勧めですが、
この辺は(必要に応じて)どれ選んでも良いと思います。性能がかなり重要とのことなので、実際にいくつかの
パーザジェネレータで簡単なベンチマーク取ってみるのが良いかと。
最後に手書きの場合ですが、Scalaで手書きパーザで速度出したい、となると、どうしてもある程度手続き的なコード
書く必要があって、その場合、本質的にJavaとあまり変わらないコードになります(型推論とかで多少楽はできますが)。
概念的にはjava.util.concurrent.FutureとAkkaのFutureは類似のものですが、
AkkaのFutureはモナドなので、他のFutureから簡単にFutureを合成できたりと、
機能がよりリッチなものになっています。で、Promiseですが、これは
java.util.concurrentには無いもので、データフロー変数と呼ばれるものを作成
して、後からそこにFuture型の値をくくりつけることができるようになっています。
0267デフォルトの名無しさん
2011/10/02(日) 10:27:30.17ありがとうございます。
やはり標準のパーサコンビネータは向いてないようですね。
GLL(GLRのLL版?)をまずは試してみます。
0268デフォルトの名無しさん
2011/10/03(月) 18:06:33.040269デフォルトの名無しさん
2011/10/03(月) 19:17:15.84尾崎のクオリティが低いばかりに…申し訳ありません…
0270デフォルトの名無しさん
2011/10/03(月) 20:51:21.890271デフォルトの名無しさん
2011/10/03(月) 21:07:28.17このコードってどう書くの?
リストにタプルを追加しようとするとtype mismatch になっちゃう。
0272デフォルトの名無しさん
2011/10/03(月) 21:17:56.37コンセンサスがとれているならともかく、まあ確かに、具体的にクオリティの低い箇所を
具体的に指摘すべきだよな。
0273デフォルトの名無しさん
2011/10/03(月) 21:24:36.060274デフォルトの名無しさん
2011/10/03(月) 21:44:06.13Scala歴二日のHaskellプログラマが書いてみました
意図どおりですかね?
たぶんエラーになったコードを貼ったほうが思い違いが少なくてよいと思います
var l : List[(Int,Int)] = List()
for (i <- List(1,2,3)) {
l ::= (i, i + 1)
}
println(l)
Scalaキモいなあが二日間いじった感想です
subtypeキモいです
これからこのスレでお世話になろうと思います
よろしくおねがいします
0275デフォルトの名無しさん
2011/10/03(月) 22:00:00.46タプルを囲むカッコを書いたつもりで、実は引数のカッコを書いていた、
というのがありがちだから、とりあえずタプルのカッコを更にカッコで包んでみるんだ。
0276デフォルトの名無しさん
2011/10/03(月) 23:19:34.11ありがとう!
どうやらListの宣言の時点で間違っていた(理解していなかった)みたい。
object GetOptions {
def main( args:Array[String] ){
var list:List[(String,String)] = List()
for ( i <- 1 to 10 ) {
//list =:: "a"+i -> i.toString()
list = list ::: List("a" + i -> i.toString())
}
println (list)
}
}
普段仕事でJavaとPHPしか触らなくて、まったくScalaの勉強が進まなかったから、とりあえずPerlのGetOptions
みたいなものでも作ってみようと思っていきなり躓いてた。
0277デフォルトの名無しさん
2011/10/03(月) 23:41:17.15ListBuffer使えばいいと思うよ
object GetOptions {
def main(args: Array[String]) {
val buf = new scala.collection.mutable.ListBuffer[(String, String)]
for (i <- 1 to 10) {
buf += "a" + i -> i.toString
}
println(buf.result)
}
}
0278デフォルトの名無しさん
2011/10/04(火) 15:29:50.69(1 to 10).map(i => "a" + i -> i.toString)
または
for(i <- 1 to 10) yield i => "a" + i -> i.toString
どうしてもリストが良ければ、最後で
toList
でどうでしょうか
0279デフォルトの名無しさん
2011/10/05(水) 09:32:38.59「Typesafe Stack 1.1」がリリースしてるよぉ
http://typesafe.com/stack/download
こっそり同僚のPCにインストールするのに便利!
0280デフォルトの名無しさん
2011/10/05(水) 09:53:37.980281デフォルトの名無しさん
2011/10/05(水) 20:35:54.05何を作る気なんだ?
0282デフォルトの名無しさん
2011/10/05(水) 23:31:18.43元々の質問読んだら?
0283デフォルトの名無しさん
2011/10/06(木) 08:22:43.960284デフォルトの名無しさん
2011/10/06(木) 18:19:49.240285デフォルトの名無しさん
2011/10/06(木) 18:34:14.330286デフォルトの名無しさん
2011/10/06(木) 18:53:13.750287デフォルトの名無しさん
2011/10/06(木) 19:48:54.71Scalaやったところでモヒカンになれる気しかしねぇぜ!
0288デフォルトの名無しさん
2011/10/07(金) 00:10:20.650289デフォルトの名無しさん
2011/10/07(金) 13:03:21.77文系馬鹿がScala使ったところで、ベタージャバにしかならないね
文系にはオブジェクト指向
0290デフォルトの名無しさん
2011/10/07(金) 13:19:39.520291デフォルトの名無しさん
2011/10/07(金) 13:31:23.340292デフォルトの名無しさん
2011/10/07(金) 20:20:05.30ベターなJavaでも、全然OKだと思う、、。
だが、問題は、Java自体が人気下降気味なこと。
Android関連で、また、盛り返してくれればうれしいけど。
Javaは、GUIとかがイマイチ垢抜けないよね。
SwingXとかでサクサク作れる開発環境があると良いのだが。
0293デフォルトの名無しさん
2011/10/07(金) 22:47:55.670294デフォルトの名無しさん
2011/10/07(金) 23:00:40.020295デフォルトの名無しさん
2011/10/08(土) 01:13:37.510296デフォルトの名無しさん
2011/10/08(土) 01:23:29.470297デフォルトの名無しさん
2011/10/08(土) 02:00:11.940298デフォルトの名無しさん
2011/10/08(土) 02:32:55.070299デフォルトの名無しさん
2011/10/09(日) 06:31:46.58のや
0300デフォルトの名無しさん
2011/10/09(日) 11:49:29.38つまんねえんだよクズ
これだから土人は…
0301デフォルトの名無しさん
2011/10/09(日) 21:37:20.95頭がすっからかんなのね。気の毒に。
0302デフォルトの名無しさん
2011/10/09(日) 21:47:38.710303デフォルトの名無しさん
2011/10/10(月) 20:18:15.70scalaはベターC++を目指したD言語と同じ末路確定
0304デフォルトの名無しさん
2011/10/10(月) 21:36:34.720305デフォルトの名無しさん
2011/10/10(月) 23:40:58.620306デフォルトの名無しさん
2011/10/10(月) 23:42:46.370307デフォルトの名無しさん
2011/10/11(火) 01:46:27.81言語仕様に優れ、C言語と連携もばっちりのD言語は
かつてベターC++と一部で騒がれたが、結局は普及率せず風前の灯し火
scalaの立場と似ているだろ
そして言語仕様の酷いPHPが普及率で君臨し続ける
0308デフォルトの名無しさん
2011/10/11(火) 02:36:23.39別に国内での普及率なんてどうでもいいなぁ
俺はScalaが気に入ってるから使うけど、JavaやPHPが好きな人はそれを使い続けてればいいと思うよ
0309デフォルトの名無しさん
2011/10/11(火) 03:22:06.62だから普及してくれないと困る
0310デフォルトの名無しさん
2011/10/11(火) 03:31:28.22同意。
とりあえず一度普及してくれれば、その後もメンテされ続けるからなあ。
0311デフォルトの名無しさん
2011/10/11(火) 06:45:00.66しかし何故に比較対象がPHP…??
C言語とかも出てくるし、どういう分野での話をしてるのだ?
著名じゃない所でもScalaを採用している会社が増えています。Typesafe社という形でサポートビジネス等を
立ち上げたからには、それらの会社が軒並みScalaを破棄するという事にならなければ、当分はメンテされるでしょう。
Typesafeがどれだけ儲かってるかはわかりませんが、主要メンバって結局はEPFLのScalaチームなので、Typesafe
が儲からなくてもメンテナンス自体は継続可能な状態ですし。
あと、互換性の問題を無視して言語仕様を拡張しようとしても、公式MLで文句言う「仕事でScala使ってるユーザ
(海外)」がそれなりに居ますし今後しばらくは「破壊的な」言語仕様の変更は起こらないと思います。
0313デフォルトの名無しさん
2011/10/11(火) 07:37:09.810314デフォルトの名無しさん
2011/10/12(水) 06:59:33.93小田好先生ってこんなイケメンだったんだな
Odersky先生に会った個人的な印象としては、ナイスミドル、という感じでしたね。なんか顔つきがあまり泥臭くない
というかw あと、結構情熱家だなあ、とも。
0316デフォルトの名無しさん
2011/10/12(水) 21:31:21.43使う人がいなくなる。
0317デフォルトの名無しさん
2011/10/12(水) 21:38:54.52でもあれIKVMだったっけ?
0318デフォルトの名無しさん
2011/10/13(木) 00:44:34.76環境が限られるというデメリットもあるよねえ。
、
まあ、OpenJDKとかもあるから、JVMがなくなることはないと思うのだけど、、。
あと、JavaならGWTで JavaScriptに変換できるけど、
Scalaではそういうのないの??
0319デフォルトの名無しさん
2011/10/13(木) 01:39:52.57http://lamp.epfl.ch/~magarcia/ScalaNET/
jdk2ikvm: A source-level conversion tool to migrate Scala programs from JDK to .NET
http://lamp.epfl.ch/~magarcia/jdk2ikvm/
ikvmを使ってconvertするみたいだけど、よくわからん
>あと、JavaならGWTで JavaScriptに変換できるけど、
>Scalaではそういうのないの??
あるよ。
http://scalagwt.github.com/
まだ正式リリースは無いが、GWTのJavaで書かれたデモ(に相当するScalaコード)ほとんどがコンパイル/動作できるくらいには進展してる
らしい。
0321デフォルトの名無しさん
2011/10/13(木) 02:58:37.260322デフォルトの名無しさん
2011/10/13(木) 09:03:52.31が圧倒的に多いようだからだよ。逆に言えば、Java使いから魅力が
あっても、それ以外からは魅力がない言語ということを暗に意味してる。
C#なんかも.NETじゃなかったら普及してないだろう?それと同じ。
0323デフォルトの名無しさん
2011/10/13(木) 13:50:46.170324デフォルトの名無しさん
2011/10/13(木) 21:24:51.51確かに全CPUを使いきってくれる。
手軽だね。
ただ、共有データを操作する際にロックは必要だと思うけど、見当たらない。
これはJavaのロック機能を使えということなのかな。
0325デフォルトの名無しさん
2011/10/14(金) 01:43:53.25これが広まらずに終わるのって正直やだなと思います。
scalaが信用され利用できる範囲が広がる事を祈ってます。
まず、並列コレクションでは、明示的なロック操作を行う事は基本的には想定されていません。
並列コレクションのモデルは、いわゆる「暗黙的な」並列化という奴で、不変コレクションを使って
いて、共有データを高階関数内で書き換えなければ、処理が並列化されている事は、プログラマ
から「見えない」というものです。ですから、そもそも並列コレクション専用のロックメカニズムは
用意されていません。Javaのsynchronizedを使うことはできますが、基本的にそれはやらない方
が賢明です。
ロックを使う必要がある場合には、ロックを使わないでいい形に、並列コレクションを使った処理にうまく
変換するか、Actorなどの「明示的な」並行処理を提供するライブラリを利用するべきです。
0327デフォルトの名無しさん
2011/10/14(金) 16:25:08.380328デフォルトの名無しさん
2011/10/14(金) 16:32:58.510329デフォルトの名無しさん
2011/10/14(金) 16:33:05.200330デフォルトの名無しさん
2011/10/14(金) 17:29:39.85特に日本語版
0331デフォルトの名無しさん
2011/10/14(金) 17:47:37.270332デフォルトの名無しさん
2011/10/14(金) 17:52:17.71そこの学生じゃなくても入館はできるよね?
0333デフォルトの名無しさん
2011/10/14(金) 19:21:44.980334デフォルトの名無しさん
2011/10/14(金) 22:06:01.77学ぶための手段としてSchemeを使う本で、コップ本はScalaを学ぶための本。
だいぶ毛色が違うんで目指してる方向が逆ならそれぞれ役に立たない。
それから、ほんとにまったくプログラムしたことない状態なら
コップ本一冊だけでやるのはかなりきつい
0335デフォルトの名無しさん
2011/10/14(金) 22:24:07.930336デフォルトの名無しさん
2011/10/14(金) 23:25:37.56任意の関数を受け取る時点で無理じゃない?
def wrap[T,R](f: Function1[T,R]) = (t: T) => {
println("wrapped")
f(t)
}
こんな感じでFunction0からFunction22用まで定義するとか
0337デフォルトの名無しさん
2011/10/14(金) 23:37:43.340338デフォルトの名無しさん
2011/10/15(土) 00:31:43.64一応やりたい事のサンプルみたいなのをpythonで書いておきます。
型のない言語だと可変長引数でなんとでもなるのですが、
タイプセーフにできないものかと思いまして。
...def wrap(func):
... def cls(*args, **kwargs):
... brfore()
... try:
... return func(*args, **kwsrgs)
... finally:
... after()
... return cls
こういう感じでラップ前と同じ引数で呼び出せば
実行前になんらかの処理を実行してくれて、
かつ呼び出す側はラップされてるかどうかを
意識する必要がないという状態にしたいです。
できなければいくつか引数の違う関数を作る方法で妥協するのが一番かなと思ってます。
0339デフォルトの名無しさん
2011/10/15(土) 00:33:25.370340デフォルトの名無しさん
2011/10/15(土) 00:50:17.65俺よくこういうコードを書くんだがもしかしてこんなので代用できねーか?
def wrap[A](block: => A): A = {
before()
try {
block
} finally {
after()
}
}
wrapに渡すときに引数も一緒に渡す
wrap(hoge(a,b))
やりたいことと違ったらゴメンだが
0341デフォルトの名無しさん
2011/10/15(土) 00:50:47.56どうも発想の筋が悪いというか、関数型っぽくないというか
0342デフォルトの名無しさん
2011/10/15(土) 03:11:52.66関数型ではデコレーターとかあまり使わないのでしょうか?
代わりにどのような方法で代用するのでしょうか?
ログ出力とか楽なのになぁ。
0343デフォルトの名無しさん
2011/10/15(土) 08:30:28.80残念ながらscalaはJavaとあわせるという制約があって、そうなっていないので
ちょっとぎこちなくなるね。
0344デフォルトの名無しさん
2011/10/15(土) 14:47:24.92レスありがとうございます
JavaとJavaScriptは少しだけ書けます
JavaもJavaScriptのように自由に関数を扱えればいいのにと思っていたところ
Scalaを知って大変興味を持ちました
SICPは翻訳も内容も難しいとのことですが、挑戦してみよぅと思います
Scalaプログラマの皆さん、ありがとうございました
0345デフォルトの名無しさん
2011/10/15(土) 16:36:35.35SICPは何年かかっても読む価値のある本だ
問題も解けよ。感動がある
分厚いので挫折しそうになるが、なんとか二章までがんばれ
偉そうなこと言えるレベルになるぞ
0346デフォルトの名無しさん
2011/10/15(土) 16:57:13.27後半はmeta circular
重要だけどちょっと毛色が違う
0347デフォルトの名無しさん
2011/10/15(土) 17:08:53.26なるほど!
1引数の関数しかないってことですか。
じゃあ関数をカリー化する関数を作れば
なんとかなりそうな気がしてきました。
ありがとうございます。
def wrap[T, U](func: T => U): T => U = {
val r: T => U = {...}
r
}
こんな感じ?
0348デフォルトの名無しさん
2011/10/15(土) 21:56:40.01そのメソッドと同名のフィールドがあると呼び出せません。
public class A {
private int m;
public int m() { return 0; }
}
--- scala
def f(A a) {
a.m() <-- エラー
}
scalaではメソッドとフィールドの名前空間が同じためかと思うのですが
回避策はあるのでしょうか?
0349デフォルトの名無しさん
2011/10/18(火) 00:38:14.38http://twitter.github.com/scala_school/basics2.html
0350デフォルトの名無しさん
2011/10/18(火) 00:41:04.56http://apocalisp.wordpress.com/
http://www.codecommit.com/blog/ruby/monads-are-not-metaphors
0351デフォルトの名無しさん
2011/10/18(火) 01:30:20.95http://dl.dropbox.com/u/261418/Monads_are_Elephants/index.html
これを貼れというステマですか?
0352デフォルトの名無しさん
2011/10/21(金) 13:59:25.96ビルドパスに追加するか聞かれてうざったいんだけど、これ消せない?
0353デフォルトの名無しさん
2011/10/22(土) 08:43:48.90SICPを読むくらいならHaskell勉強した方が学びやすいし、ためにもなると思うよ。
基礎的な勉強がしたいならTAPLの方がオススメ ttp://www.cis.upenn.edu/~bcpierce/tapl/
0354デフォルトの名無しさん
2011/10/22(土) 10:35:57.23「Scalaプログラミングに欠かせない機能---Scalaの基本4」
http://itpro.nikkeibp.co.jp/article/COLUMN/20111011/370491/
0355デフォルトの名無しさん
2011/10/22(土) 12:21:48.240356デフォルトの名無しさん
2011/10/22(土) 13:04:35.670357デフォルトの名無しさん
2011/10/22(土) 14:00:01.44連載っていうか、もともとは月刊雑誌の一回だけの特集を、Webに乗せただけ。
日経ソフトウェアの2011年6月号 pp.78-79 が、
http://itpro.nikkeibp.co.jp/article/COLUMN/20111011/370488/
変数とクラスを学ぶ---Scalaの基本1
同じく pp.85-87が
http://itpro.nikkeibp.co.jp/article/COLUMN/20111011/370491/
Scalaプログラミングに欠かせない機能---Scalaの基本4
だから、最初から これで完結だよ。
0358デフォルトの名無しさん
2011/10/24(月) 00:33:03.64直接さらしてしまう、という欠点を持っているけど
Scalaではケースクラスにしつつ内部表現を隠蔽することも簡単にできるらしい
これってどういうこと?
0359デフォルトの名無しさん
2011/10/24(月) 08:36:24.45なんかOCamlとかでもできそう。
0360デフォルトの名無しさん
2011/10/24(月) 10:03:50.82内部と外部の境界がモジュールなので、クラスとかに比べたら少し大きい
0361デフォルトの名無しさん
2011/10/24(月) 17:22:44.52ありがたがってる土俵が関数型のプログラミングではあまりありがたみが
ないというのはよく有りそうだよ。
0362デフォルトの名無しさん
2011/10/24(月) 17:53:53.25■ このスレッドは過去ログ倉庫に格納されています