1 名前:デフォルトの名無しさん mailto:sage [2008/03/10(月) 22:40:17 ] The Scala Programming Language ttp://www.scala-lang.org/ チュートリアル日本語訳 ttp://homepage.mac.com/takashi_miyamoto/scala/ScalaTutorial.pdf どう書く?org Scala ttp://ja.doukaku.org/lang/scala/
697 名前:デフォルトの名無しさん mailto:sage [2009/02/04(水) 21:57:14 ] _の正確な意味を知るにはScala言語仕様の6.23 Anonymous Functionの Placeholder Syntaxを読むのが良いと思う。特に英語圏のブログでScala やってる人が多用してる気がするけど、正確な意味を解説した記事ってないんだよな。 不正確だけどおおざっぱな説明としては、_を囲む最も内側の式が無名関数化される。 だから、println(_)だと、(x) => println(x)になるけど(_を囲む一番内側の式がprintln(_) だから)、println(_ + 3)はprintln((x) => x + 3)になる(_を囲む一番内側の式が_ + 3だから) あと、無名関数化される式はsyntactic category(文法定義上の非終端記号みたいなもの)が Exprである必要がある。 基本的に、_がどう展開されるかは純粋に構文的に決まり、型とかは一切関係しない。
698 名前:デフォルトの名無しさん mailto:sage [2009/02/04(水) 23:17:55 ] println((_)) とかやると内側の括弧で阻害できるのか?
699 名前:デフォルトの名無しさん mailto:sage [2009/02/04(水) 23:34:42 ] >>698 試してみるとわかるけど、それはできない。 仕様書にはproperly containsという文言があるんだけど 単に式を囲む(_)は構文解析で_と同じになっちゃって、 (_) properly contains _とはみなされないということだと思う。
700 名前: mailto:sage [2009/02/05(木) 00:11:19 ] >>697 おお、わかりやすい説明ありがとう。 それでちっとまた実験してみた。 val a = List(1,2,3,4); a.map( x => x) はエラーにならないけど a.map( _ ) はエラーになった。 この場合は a.map( _ + 3) にするとエラーにならない。 なるほど。
701 名前:デフォルトの名無しさん mailto:sage [2009/02/05(木) 00:23:42 ] 酔っぱらっているので一つだけ。(>>697 の括弧が構文解析できないレベル) Scalaの_は、C++のboost/bind.hppの_1, _2, _3から来ているんだと思う。 >>697 が解説してくれているけどそっくり。おやすみ
702 名前: mailto:sage [2009/02/05(木) 00:32:11 ] しかし算術式はなにかとくべつなのかな? a.filter( 2 < 1 + _ ) はエラーにならない。 1 + _ が最も内側の式ではなく 2 < 1 + _を最も内側の式と見てくれる。 でも a.filter( (2).<( 1 + _ ) ) だと1 + _ を最も内側の式と見てエラーになる。 2 < 3 は (2).<(3)と同じことだと読んだような気がするけど 、上の場合は挙動が違う。
703 名前: mailto:sage [2009/02/05(木) 00:35:41 ] あ、でも a.filter( 2 < 1 + _ ) はエラーにならないけど a.filter( 2 < (1 + _ ) ) はエラーになる。 この場合は ( 1 + _ )が最も内側の式とみなされるから。
704 名前: mailto:sage [2009/02/05(木) 00:42:17 ] 明示的にかっこでくくちゃうと、そこでもっとも内側の式とみなされるけど 演算子の優先順位のためにかっこがいらなければセーフなのか。
705 名前: mailto:sage [2009/02/05(木) 00:58:57 ] ただし明示的な括弧といっても ( _ )は意味がないl。 _ とおなじ。 それ以外の場合は括弧の段階で一番内側の式とみなされる。
706 名前:697 mailto:sage [2009/02/05(木) 01:01:19 ] >>701 >>702 その辺の挙動は、>>697 で最後にさらっと書いたsyntactic categoryというのが絡んでくる。 >>697 では最も内側の式という風に書いたけど、実はもうちょっと正確に言うと、もっとも内側で、 syntactic categoryがExprの式が無名関数化される。 まず、 a.filter(2 < 1 + _) についてだが、1 + _の部分だけではInfixExprとみなされる。その外側の 2 < 1 + _も同じくInfixExprだが、メソッド呼び出しの引数の位置に来ることによって Exprに昇格(適当にでっち上げた用語だが)し、結果として、2 < 1 + _が(x) => (2 < 1 + _) のように無名関数化される。 a.filter( (2).<( 1 + _ ) ) については、1 + _は同様にInfixExprだが、メソッド呼び出し引数の括弧の位置に 現れたことによって、Exprに昇格してしまう。そのため、1 + _が無名関数化される。 a.filter( 2 < (1 + _ ) ) でも、やはり1 + _はInfixExprだが、式をグルーピングする括弧があることによって、 Exprに昇格してしまう。そのため、1 + _が無名関数化される。
707 名前:デフォルトの名無しさん mailto:sage [2009/02/05(木) 01:01:43 ] _はどのくらい強いの? 括弧以外は突き抜けられるぐらい強いの?
708 名前:697 mailto:sage [2009/02/05(木) 01:04:40 ] >>707 基本的にはメソッド呼び出しの引数の括弧 or 式のグルーピングの括弧が区切りになっているという 認識で良いと思う。あとは、使っているとなんとなくわかるようになってくる感じ。上では言語仕様の 記述を元に挙動を説明したけど、そこまで知っていなくてもまあだいじょうぶだと思う。
709 名前: mailto:sage [2009/02/05(木) 01:11:54 ] >>706 697さん、詳しくわかりやすくどうもありがとう! すっきりして寝れます。
710 名前: mailto:sage [2009/02/05(木) 12:18:40 ] amazon.co.jpの洋書でScala本、ただいま在庫切れだけど注文できるようになってて人気がすごいぞ。 www.amazon.co.jp/Programming-Scala-Comprehensive-Step-step/dp/0981531601/ref=sr_1_2?ie=UTF8&s=english-books&qid=1233803774&sr=1-2 Amazon.co.jp ランキング: 洋書 - 455位 (洋書のベストセラーを見る) 各カテゴリー内でのランキング: 1位 ─ 洋書 > Computers & Internet > Programming > Java 2位 ─ 洋書 > Computers & Internet > Programming > Software Design, Testing & Engineering > Object-Oriented Design 2位 ─ 洋書 > Computers & Internet > Programming > Languages & Tools すげー!
711 名前:デフォルトの名無しさん mailto:sage [2009/02/05(木) 12:33:07 ] >>710 米国での期待の大きさが現れてる。同時に、 Haskellの棺桶の釘を打つ音でもある。
712 名前:デフォルトの名無しさん mailto:sage [2009/02/05(木) 15:54:30 ] そういう二者選択は馬鹿げてると思うよ。
713 名前:デフォルトの名無しさん mailto:sage [2009/02/05(木) 15:58:15 ] >>712 あくまで、米国のソフトウェア界のはなし。
714 名前:デフォルトの名無しさん mailto:sage [2009/02/05(木) 16:55:08 ] > 米国のソフトウェア界 藁
715 名前:デフォルトの名無しさん [2009/02/05(木) 23:21:10 ] >>712 洋書を買うのは物好きだけだろjk 現在のランク: 6位 ─ 洋書 > Computers & Internet > Programming > Software Design, Testing & Engineering > Object-Oriented Design 8位 ─ 洋書 > Computers & Internet > Programming > Java 28位 ─ 洋書 > Computers & Internet > Programming > Languages & Tools
716 名前:デフォルトの名無しさん mailto:sage [2009/02/06(金) 06:46:27 ] 日本での順位に米国の話をレスとしたのがまちがい。>>711 は撤回します。
717 名前: mailto:sage [2009/02/07(土) 15:09:56 ] ScalaにJavaみたいなenumないのですか? Enumerationってのがあるみたいなのですが object Main extends Application { object WeekDays extends Enumeration { val Mon, Tue, Wed, Thu, Fri, Sat, Sun = Value } def isWorkingDay(d: WeekDays.Value) = ! (d == WeekDays.Sat || d == WeekDays.Sun) WeekDays filter (isWorkingDay) foreach { d => Console.println(d) } } printlnでの出力もMain$WeekDays(4)という形式です。 JavaのenumだったらFriとかよみやすい値です。メンバを加えたりもできました。 Javaのenum使えないのですか?
718 名前:デフォルトの名無しさん mailto:sage [2009/02/07(土) 15:51:00 ] 多少コード量が増えるけど、 blogtrader.net/page/dcaoyuan/entry/erlang_plugin_for_netbeans_in を参考にして、Weekdaysにメンバを追加するか、 abstract sealed class Weekdays object Weekdays { case object Mon extends Weekdays case object Tue extends Weekdays case object Wed extends Weekdays case object Thu extends Weekdays case object Fri extends Weekdays case object Sat extends Weekdays case object Sun extends Weekdays } val x: Weekdays = Weekdays.Mon println(x) //Mon のようにして、case objectを使う手段がある。
719 名前: mailto:sage [2009/02/07(土) 16:05:59 ] >>718 ブログのよりあなたのやり方のほうがJavaのenumっぽいですよね。 実質、個々のenum値が独自クラスのシングルトンになってるあたり。 でもJavaの場合はコンパイラが自動的にやってくれるので短く書けるけどScalaだとちょっと面倒ですね。 使いようによってはcase classのぶん便利なこともあるのかな。 ちょっと気になって質問したので、具体的にどう使うか目的があって質問したわけじゃないけど。 詳しくどうもありがとうございました。
720 名前:デフォルトの名無しさん [2009/02/07(土) 22:16:19 ] enumにメソッド追加ってかなりJava独自じゃないですか? 必要ない気がするんですけどJavaラーは活用してるんですかね。
721 名前: mailto:sage [2009/02/08(日) 20:04:19 ] 2版のEffective Javaに活用した例があっておもしらかった記憶があるけど 自分自身はつかったことない。
722 名前:デフォルトの名無しさん mailto:sage [2009/02/08(日) 22:10:21 ] enumのメソッド追加は便利。 ステートパターンが書きやすい。
723 名前:デフォルトの名無しさん mailto:sage [2009/02/08(日) 22:45:31 ] メモリ効率を重視する必要がある時に使ってる。 自分でナンバリングして整数型で扱うよりずっと型は強い。
724 名前:デフォルトの名無しさん mailto:sage [2009/02/08(日) 23:51:01 ] Scalaって実際どんな時に使うもんなんでしょ。 Javaだとサーバーサイドでしか使えないイメージがあるけど・・・ みんな基幹とか、webサービスのサーバー側に使ってたりするのかな? webフレームワークはleftくらいしか見かけないけど
725 名前:デフォルトの名無しさん mailto:sage [2009/02/09(月) 00:04:57 ] >>724 先入観で凝り固まりたいように見える
726 名前:デフォルトの名無しさん mailto:sage [2009/02/09(月) 00:47:57 ] >>725 うーん、実際の話をしているんですが、どうなんでしょうか?
727 名前:デフォルトの名無しさん mailto:sage [2009/02/09(月) 00:52:19 ] >>724 > Javaだとサーバーサイドでしか使えないイメージがあるけど・・・ こういう人に答えても仕方ないしね。
728 名前:デフォルトの名無しさん mailto:sage [2009/02/09(月) 01:44:45 ] 煽りを聞きたいのではないのですが・・・
729 名前:デフォルトの名無しさん mailto:sage [2009/02/09(月) 02:12:43 ] そもそもScalaがJavaで書かれているのに、 サーバーサイドしか使えないってw
730 名前:デフォルトの名無しさん [2009/02/10(火) 01:12:49 ] >>724 スレの上の方でも議論があるけど、π計算の延長上にある言語だから SOAとかメチャ無茶やりやすいぞ。 デスクトップクライアントが作りたいならSwingでやればいい SwingがPoorで嫌だと言うのであれば、3月まで待って、Qt4.5(LGPL)を使いなさん
731 名前:デフォルトの名無しさん [2009/02/10(火) 01:19:46 ] >>729 >そもそもScalaがJavaで書かれているのに、 あんまりいい表現じゃないな・・・
732 名前:デフォルトの名無しさん mailto:sage [2009/02/10(火) 02:38:38 ] >>724 liftだろ
733 名前:デフォルトの名無しさん mailto:sage [2009/02/10(火) 10:45:22 ] というかソース見ればわかるけど、今のScalaはScalaで書かれてる。 1.XのときはJavaで書かれてたらしいけどね。
734 名前:デフォルトの名無しさん mailto:sage [2009/02/10(火) 20:20:42 ] Scala をコンパイルするための Scala をコンパイルするための・・・
735 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 09:02:15 ] なに!ScalaはJVMで動作するのか!? 無駄スグルwww 一体何のために。。。
736 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 09:17:32 ] 無知すぎるwww
737 名前:デフォルトの名無しさん mailto:sage [2009/02/11(水) 09:52:40 ] JVMつながりと言えば、Clojureのスレがないな……。 まぁS式嫌いなのでどうでもいいが。
738 名前:724 mailto:sage [2009/02/11(水) 10:06:39 ] ありがとうございます。 >>733 を見てうやむやが氷解しました。 Scalaを書くためのScala。 何か関数言語的な美しいひびきを感じます。 使う気がしてきました。
739 名前:デフォルトの名無しさん [2009/02/12(木) 02:57:16 ] + や * はメソッドだって聞いたけど、 2 + 3 * 4 は 14ってちゃんと評価してくれるんだね メソッドチェーンになるから、20が戻ってくると思った これって遅延評価のおかげ? Scalaのソースをちゃんと読まないといけないんだろうけど
740 名前:デフォルトの名無しさん mailto:sage [2009/02/12(木) 03:21:54 ] +や*がメソッドだというのは間違ってないけど、中置式のメソッド呼び出しに 関しては、演算子の最初の1文字で優先順位が決まるというルールになってる。 このルールのおかげで、算術式に関しては直感的な動作をしてくれる。 Scala言語仕様6.12.3 Infix Operationsによると、優先順位は以下のようになってる。 letter < '|' < '^' < '&' < '<', '>' < '=', '!' < ':' < '+', '*' < '/', '%' < all other special characters たとえば、 "HOGE" charAt 0 + 1 という式があった場合、charAtの最初の文字はletterなので、+よりも演算子としての優先順位は低い。 そのため、 "HOGE".charAt((0).+(1)) と解釈される。
741 名前:デフォルトの名無しさん mailto:sage [2009/02/12(木) 03:22:54 ] 訂正。s/letter/all letters/
742 名前:740 mailto:sage [2009/02/12(木) 03:25:55 ] ありゃりゃ。コピペして不等号加えるときにミスったorz 正しくは、以下。 all letters < '|' < '^' < '&' < '<', '>' < '=', '!' < ':' < '+', '-' < '*', '/', '%' < all other special characters
743 名前:739 [2009/02/13(金) 00:44:52 ] >>740 サンクス BigDecimalでも試したけど、ちゃんと掛け算・割り算を優先するってありがたいな RemoteActorの動作がいまいちわからなかったり(コンパイルした後、scalaコマンドで動かないのに、javaコマンドからだったらちゃんと動くとか) わからんことだらけなんだけど、しばらく弄ってみることにする
744 名前:デフォルトの名無しさん mailto:sage [2009/02/14(土) 03:01:26 ] RemoteActorっていったら、 メッセージ送った分だけヒープが貯まっていくのな・・ Asyncで(actor ! msg な)メッセージ送ると、反応しないことが多々ある インタプリタで使う限りは問題ににならないけど、コンパイルした途端にダメ・・ ありえねぇ・・・(;´Д`)
745 名前:デフォルトの名無しさん mailto:sage [2009/02/14(土) 18:03:54 ] >>774 まさかとおもってやってみたら、思い切りOutOfMemoryしやがった(笑) java.lang.OutOfMemoryError: Java heap space at java.lang.Class.getDeclaredMethods0(Native Method) at java.lang.Class.privateGetDeclaredMethods(Unknown Source) at java.lang.Class.getDeclaredMethod(Unknown Source) at java.io.ObjectStreamClass.getPrivateMethod(Unknown Source) at java.io.ObjectStreamClass.access$1700(Unknown Source) at java.io.ObjectStreamClass$2.run(Unknown Source) at java.security.AccessController.doPrivileged(Native Method) at java.io.ObjectStreamClass.<init>(Unknown Source) at java.io.ObjectStreamClass.lookup(Unknown Source) at java.io.ObjectOutputStream.writeObject0(Unknown Source) at java.io.ObjectOutputStream.defaultWriteFields(Unknown Source) at java.io.ObjectOutputStream.writeSerialData(Unknown Source) at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source) at java.io.ObjectOutputStream.writeObject0(Unknown Source) at java.io.ObjectOutputStream.defaultWriteFields(Unknown Source) at java.io.ObjectOutputStream.writeSerialData(Unknown Source)
746 名前:デフォルトの名無しさん mailto:sage [2009/02/14(土) 18:04:44 ] (続き) at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source) at java.io.ObjectOutputStream.writeObject0(Unknown Source) at java.io.ObjectOutputStream.defaultWriteFields(Unknown Source) at java.io.ObjectOutputStream.writeSerialData(Unknown Source) at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source) at java.io.ObjectOutputStream.writeObject0(Unknown Source) at java.io.ObjectOutputStream.writeObject(Unknown Source) at scala.actors.remote.JavaSerializer.serialize(JavaSerializer.scala:37) at scala.actors.remote.NetKernel.sendToNode(NetKernel.scala:32) at scala.actors.remote.NetKernel.namedSend(NetKernel.scala:39) at scala.actors.remote.NetKernel.forward(NetKernel.scala:71) at scala.actors.remote.DelegateActor$$anonfun$act$1$$anonfun$apply$1.apply(Proxy.scala:168) at scala.actors.remote.DelegateActor$$anonfun$act$1$$anonfun$apply$1.apply(Proxy.scala:125) at scala.actors.Reaction.run(Reaction.scala:78) at scala.actors.Scheduler$$anon$2.run(Scheduler.scala:77) at scala.actors.FJTaskRunner.run(Unknown Source)
747 名前:775 mailto:sage [2009/02/14(土) 18:06:57 ] >>744 ですた(苦笑) うーん、こういう不具合が未だにActor周りがver 1.0 にならない理由なのかな 2.7.2ではメモリーリークの不具合があったっていうし
748 名前:デフォルトの名無しさん mailto:sage [2009/02/17(火) 11:25:35 ] 初学者にやさしい100〜500行くらいで書けるようなお題くれ
749 名前:デフォルトの名無しさん mailto:sage [2009/02/17(火) 11:33:01 ] つ「正規表現マッチャ」 www.oreilly.co.jp/editors/archives/Btfl_Cd_01.pdf www.oreilly.co.jp/editors/archives/000158.html
750 名前:デフォルトの名無しさん mailto:sage [2009/02/17(火) 12:49:40 ] >>748 % 問題・・9時台から16時台(17時閉店)までの勤務表を作れ。 % % 勤務表は1時間単位とする。 % 要員はAya、Koh、Sho の3名である。 % 最小勤務単位は2時間であり、一時間だけの勤務は認められない。 % 一人勤務は1時間までであり、もし一人勤務に就いたときは % 次の少なくとも1時間は勤務につけない。 % 以下の時間は、それぞれ用事があり、勤務できない % Aya・・14時台、Koh・・11時台と14時台、Sho・・9時台と11時台。
751 名前:デフォルトの名無しさん mailto:sage [2009/02/22(日) 03:21:25 ] OreillyやAPressもScala本を出すみたいだね oreilly.com/catalog/9780596157746/index.html#top www.apress.com/book/view/9781430219897 Oreillyのほうは、Twitterの中の人が書いて Apressのほうは、Liftの中の人が書いてるみたいです
752 名前:デフォルトの名無しさん mailto:sage [2009/02/26(木) 00:15:33 ] >>737 Clojureは人口が少ないからね。scalaよりは。スレを作ってもarcスレみたいになりそう。 ircとgoogle groupをみてると盛りあがってるんだがね。 ScalaとClojureはライバル関係みたいだがなぁ。 ところでScalaでどのくらいの人口なの?
753 名前:デフォルトの名無しさん mailto:sage [2009/02/26(木) 00:57:02 ] clojureやarcは「yet another my own Lisp」でしょ。 面白いところはあるけど、Scalaとは無縁。
754 名前:デフォルトの名無しさん mailto:sage [2009/02/26(木) 01:08:45 ] >>753 調べた上でそういってるなら正しいが
755 名前:デフォルトの名無しさん mailto:sage [2009/02/26(木) 01:15:14 ] 仮に調べてなくても正しいものは正しい。
756 名前:デフォルトの名無しさん mailto:sage [2009/02/26(木) 01:18:06 ] >>755 それは率直にいうと頭が悪いな
757 名前:753 mailto:sage [2009/02/26(木) 01:28:37 ] >>753 が間違っていると思う人は根拠を言ってみれば? Scalaは静的な言語ですが、clojureやarcはそうではありません。 clojureなんて動的馬鹿といっていいような仕様です。 型システムや関数/メソッド呼び出しも全然違います。 OCaml辺りの方がずっとずっと近いです。 clojureやarcはLisp SchemeスレかARCスレがあるし、 ココで語る意味のある言語とは思えん。
758 名前:デフォルトの名無しさん [2009/03/02(月) 00:03:43 ] Lift 1.0が出たとか
759 名前:デフォルトの名無しさん [2009/03/02(月) 01:30:11 ] >>758 出ましたね。 APIドキュメントとか、Lyxで書いたドキュメントはいまいち整っていませんが・・
760 名前:デフォルトの名無しさん [2009/03/02(月) 01:34:09 ] Terracottaの中の人(Scala OTPの作者)が、QCon Londonで発表するスライドも SlideShareにupされています ttp://www.slideshare.net/jboner/pragmatic-real-world-scala-45-min-presentation
761 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 17:12:16 ] >>757 最近見かけたのは、 scala と clojureの共通点は java VM上の言語だってことだが それだけじゃなくて、並列処理のことが念頭にあるみたいなのね。だからその並列処理 の考えかたの違いもあって、どっちが。。。みたいなことが話題として出てきてる。 だから、無縁だと考えるのは視点の違いから来てるね。悪いけど>>757 は視野が狭いとしか 思えないね。言語の系統を語ってるだけなら無縁だからね。だから、言ってることはもっと もなことを言ってるし、そこでライバル関係だとは誰も言わないだろう。 もっとも、たまたま、>>737 で話題になって>>752 で答えたにすぎないし、 対立を煽ったり、>>752 や>>757 にあるように、他の言語をどこか馬鹿にするようなことも 言う気はないよ。
762 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 17:17:59 ] >>761 >>752 じゃなくて>>753 だね。 おまけとして、 japan.internet.com/column/developer/20090224/26.html でもみればいいよ。
763 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 20:26:57 ] > あるみたいなのね こういうの勘弁
764 名前:デフォルトの名無しさん mailto:sage [2009/03/05(木) 23:00:48 ] マギー司郎の声でよめば大丈夫だ
765 名前:デフォルトの名無しさん mailto:sage [2009/03/06(金) 22:53:35 ] ScalaはJava互換あるし、第一言語がJavaで、 Haskellもちょっとだけかじった俺なら余裕だろと思ったら、 Listのインスタンス化に2時間ハマったぞWWWWWWWW ArrayListをnewしようとちょっとずつ構文変えて頑張ってた健気な俺涙目WWWWWWWWW ていうか巷のブログ書いてるやつら、動くコード書いてくれよWWWW 断片だけじゃわからないからWWWWWWWWW コンパイルする身にもなれってのWWWWWWWWWWWWWW
766 名前:デフォルトの名無しさん mailto:sage [2009/03/07(土) 10:41:55 ] マニュアル嫁
767 名前:デフォルトの名無しさん [2009/03/07(土) 11:25:33 ] Haskellかじったらリストのインスタンス化思い当たるんじゃん
768 名前:デフォルトの名無しさん mailto:sage [2009/03/07(土) 12:09:38 ] >>765 ScalaByExample和訳 ttp://www29.atwiki.jp/tmiya/pages/23.html
769 名前:デフォルトの名無しさん mailto:sage [2009/03/07(土) 18:28:12 ] リストのインスタンス化で2時間悩むとか、プログラム初心者ならともかく、どうかしてるだろ Scala Listでぐぐって出てくる最初のページにすら、やり方出てくるぞ。
770 名前:デフォルトの名無しさん mailto:sage [2009/03/07(土) 19:07:59 ] こういうのを書きたかったんだ List<File> list = new ArrayList<File>(); で、ググってでてくるのかね?
771 名前:デフォルトの名無しさん mailto:sage [2009/03/07(土) 20:28:23 ] ああ、すまん。Javaの方のListを作りたかったわけね。それなら、Listでぐぐっても 出てこないわ(それだと、ScalaのListが出てくるし)。調べるべきは、Listの作り方じゃなくて、 ScalaでのGenericsの使い方の方だったね。Scala Genericsでぐぐれば、色々出てくる。 var list = new ArrayList[File]
772 名前:デフォルトの名無しさん [2009/03/08(日) 11:33:00 ] コレクションは特別な理由がない限りScalaライブラリのを使ったほうがいいとおもうけどなあ。
773 名前:デフォルトの名無しさん mailto:sage [2009/03/27(金) 16:32:46 ] 関数型言語について勉強中の者です。 関数型言語らしいプログラムの書き方ってどういうのを言うんでしょうか? 「リスト」を最初に作り、それに関数を適用して行くという形式で行くのが大事そうだ、というのは解りました。 ただ、これを読んでかえって解らなくなってしまいました。 刺激を求める技術者に捧げるScala講座---目次:ITpro 第7回 関数脳のつくり方 First Season ttp://itpro.nikkeibp.co.jp/article/COLUMN/20090224/325385/?ST=develop これを書いている人はなんか理解したようなのですが、読んでもちっとも解りません。 特に ttp://itpro.nikkeibp.co.jp/article/COLUMN/20090224/325385/?ST=develop&P=6 >しかし,オブジェクトの技術を使わず,純粋に手続きで考えてみたのですが,頭がパニックになりそうでした。 >最初のNode(XMLタグ)を取得して,その子要素をとってループをまわす。 >その子要素がDirの場合は,childでさらにその子要素をとってループを回す。 >Fileの場合は中身のファイル名を表示する。Dirの子要素にまたDirが含まれていたら,さらにchildを適用して…。 このあたり。 手続きだって再帰すればすぐだと思うのですが。 手続きって言った場合、再帰は含まないのでしょうか?
774 名前:デフォルトの名無しさん mailto:sage [2009/03/27(金) 17:09:12 ] 駄文読まずに>>8 のチュートリアル翻訳版読めば?
775 名前:デフォルトの名無しさん mailto:sage [2009/03/27(金) 20:05:13 ] >>773 その文章、体裁はともかく内容としては 人に何かを説明することを目的として書かれたという感じがしない。 自分の頭を自分なりに整理してみただけの感想文という感じ。
776 名前:デフォルトの名無しさん mailto:sage [2009/03/27(金) 21:23:46 ] ScalaってJavaで作られた過去の遺産をそのまま使えるという点では素晴らしいけどさ Scala使うなら関数型の技法を習得必要があるじゃん だってScalaでJavaの書き方使うってんなら、Scala使う意味がないんだもん 大変残念だけど日本のほとんどのシステム開発の現場では採用されないだろうね 先鋭的な技術会社なら別だけど
777 名前:デフォルトの名無しさん mailto:sage [2009/03/27(金) 21:25:52 ] >>776 > Scala使うなら関数型の技法を習得必要があるじゃん scalaを学べば十分
778 名前:デフォルトの名無しさん mailto:sage [2009/03/27(金) 21:45:34 ] だからScalaを習得するってことは関数型言語を習得するってことと同義だろ? Scala使って関数型言語のメリットを利用しないってのは意味がない Javaだけ使ってればいいんだから 学習コスト高すぎってことだ
779 名前:デフォルトの名無しさん [2009/03/27(金) 22:01:50 ] リストを使うっていうよりは一般的に副作用を最小化する心がけを持つといいんじゃないかな。 そして副作用のないコレクションの代表選手がリストなのでリストはよくつかわれる。 その記事で何を手続き的として想定してるかはわかんないけど、同じ再帰を使うのでも、 たとえばツリー構造からある条件で抽出するときに、 「結果を格納する変更可能なコレクションを用意しておいて再帰しながらその入れ物に追加していく」だとかなり手続き的だけど、 「再帰呼び出ししながら戻り値であるリストの和集合をとっていく」だとちょっと関数的になる、みたいな。
780 名前:デフォルトの名無しさん mailto:sage [2009/03/27(金) 22:02:30 ] scalaって関数型にしては癖が強いと思うよ。それはjavaを使った人向けに作られた 関数型言語でもあるからだよ。 日本で採用されるかどうかってのは、海外で普及して権威付けされるかどうかでしょ。 右に習えしか出来ないんだからね。先陣を切ってやるような多少?のリスクを背負っ て進めるようなところはないだろうから。まだ、ベンチャーが育つ土壌があるならば、 可能性はあると思うが、海外で普及したあとの2、3年まちってところではないかな。 並列プログラミングが重要さを増せば変わってくると思う。 学習コストは手続き型しか知らないような人にとってみれば未知への恐怖というコスト が高いと思うが、基本的なところは然程難しくないと思うよ。この手の事で保守的な ことを言って無理だと言う人って、一般的に融通が利かない人の傾向があるよ。そんな 人が多いんかなぁ。プログラマってひとたちは。。。
781 名前:デフォルトの名無しさん mailto:sage [2009/03/27(金) 22:03:39 ] javaプログラマ向けの関数型言語になってるから学習コストはさほど高くないと思うんだが。
782 名前:デフォルトの名無しさん mailto:sage [2009/03/27(金) 22:06:29 ] >>778 全然そうは思わない。ScalaはScala、関数型言語ではない。
783 名前:デフォルトの名無しさん mailto:sage [2009/03/27(金) 22:13:56 ] >>780 >>782 Scalaと関数型言語の特性については無知だったようですまねぇ でもね、俺みたいな2次請け3次請けで働いてるプログラマってプログラマの多数派なわけじゃん そんな多数派の「現場」ではRubyすら使われる気配がないし、ましてや関数型言語なんて採用されるわけがない ってことを言いたかっただけなんだが
784 名前:デフォルトの名無しさん mailto:sage [2009/03/27(金) 22:29:12 ] >>783 ごめん。言いすぎた。 言うようになかなか採用されないと思ってるよ。
785 名前:デフォルトの名無しさん mailto:sage [2009/03/27(金) 22:35:34 ] Scalaは関数型言語ではなくて、 関数型言語の機能、特徴[も]兼ね備えている言語。 今では特に珍しいことではない。 www.scala-lang.org/node/25 Introducing Scala > It smoothly integrates features of object-oriented and functional languages www.scala-lang.org/node/1305#Func Learning Scala > If you come to Scala with a functional programming background > you will find most of the more advanced functional programming style familiar. www.scala-lang.org/node/959 Book "Programming Scala" > "Programming Scala" will show you the fundamentals of functional programming using Scala.
786 名前:デフォルトの名無しさん [2009/03/27(金) 22:41:01 ] ちょっと件のページのデータを踏襲した例を作ってみた。 まずこれは再帰を使ってるけど手続きっぽいでしょ。resultが順次更新されていくから。 import scala.xml._ import scala.collection.mutable._ val result = new ArrayBuffer[Node] def find1(node: Node)(pred: Node => Boolean): Unit = { if (pred(node)) result += node for (child <- node.child) find1(child)(pred) } find1(xml) { case <file>{_*}</file> => true; case _ => false } こうするとちょっと関数型っぽくなる。 def find2(node: Node)(pred: Node => Boolean): List[Node] = { if (pred(node)) List(node) else node.child.toList.map(find2(_)(pred)).flatten[Node] } val result = find2(xml) { case <file>{_*}</file> => true; case _ => false } find2は便利メソッドのflatMapを使ってこう書いても同じ。 def find3(node: Node)(pred: Node => Boolean): List[Node] = { if (pred(node)) List(node) else node.child.toList.flatMap(find3(_)(pred)) }
787 名前:デフォルトの名無しさん mailto:sage [2009/03/27(金) 22:50:18 ] >>773 関数型言語の勉強なら「プログラミングの基礎」がいいよ。 www.amazon.co.jp/dp/4781911609/
788 名前:デフォルトの名無しさん mailto:sage [2009/03/27(金) 23:01:52 ] Scalaは関数型の要素抜きのGood Javaで使っても結構いい線いけてるから、 なかなか関数型まで行き着かないんだよね。 同じJavaVMで動くといってもJavaと食い合う言語だなと思ったよ。 確かに関数型だけを学びたいならHaskellやML系の言語を先にやったほうが手っ取り早いかもしれない。
789 名前:デフォルトの名無しさん mailto:sage [2009/03/27(金) 23:10:13 ] OCaml亜種のF#がC#や他の.NETグループの言語と組み合わせる前提の 設計になってるのと対比すると特徴的だな。
790 名前:デフォルトの名無しさん [2009/03/28(土) 09:22:03 ] jp.techcrunch.com/archives/20090326get-ready-for-java-on-appengine/ コンパイルしたScalaもつかえそう。
791 名前:デフォルトの名無しさん mailto:sage [2009/03/28(土) 09:40:47 ] いや、当然APIが制限されてるって。 Python版がそうであるように。