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/
587 名前:デフォルトの名無しさん mailto:sage [2008/12/11(木) 23:17:31 ] $ scala helloWorld.scala /work/helloWorld.scala:1 error: not found: value println println("hello, world!") ^ one error found
588 名前:デフォルトの名無しさん [2008/12/11(木) 23:27:20 ] それからScalaのジェネリクスがC++とJavaのどちらと多くを共有しているかっていったら問答無用でJavaのほうだよ。 それでScalaやらないでC++やるっていうんだったら好きにすればいいと思う。 「C++にできてJavaにできない○○があるが、Scalaではどうか?」って聞いてくれればがんばって答えてみるかも。
589 名前:582 mailto:sage [2008/12/11(木) 23:38:37 ] >>586 ワイルドカードの下限境界の事言ってる?あれは「型を使う側」で明示的に指定しない といけないという点で違うし、制限も強い。ワイルドカードに相当するのは、Scalaだと Existential Typeだね。
590 名前:デフォルトの名無しさん [2008/12/11(木) 23:42:16 ] いや、だから反変がJavaにはないっていうのは違うでしょ?
591 名前:582 mailto:sage [2008/12/11(木) 23:54:19 ] いや、A <: B => T[A] <: T[B]であるような、厳密な意味での反変はやはり無いと 言って良いと思う。Javaの場合、A <: B => T[A] <: T[? extends B]なわけだし。 ただまあ、誤解を招く書き方ではあったかもしれんとは思うけど。
592 名前:582 mailto:sage [2008/12/11(木) 23:58:46 ] すまん。共変と反変が逆になっとる。正しくは、以下。 いや、A <: B => T[B] <: T[A]であるような、厳密な意味での反変はやはり無いと 言って良いと思う。Javaの場合、A <: B => T[B] <: T[? super A]なわけだし。 ただまあ、誤解を招く書き方ではあったかもしれんとは思うけど。
593 名前:デフォルトの名無しさん [2008/12/12(金) 08:35:32 ] >>569 です。582 さん、詳細に答えて下さり感謝します。 「Java の generics では、下のように extends を使う。デフォルトでは Object を継承 する」との説明を読んで、これは制限が強すぎると感じました。List, Vector, Map など の素直なコレクション・ライブラリを記述するには型チェックが有効に働くでしょう。で も使いもしないメソッドにまで型チェックが利いてしまうのでは、generic なライブラリ を作るほうが大変だろうと推測していました。 public static <T extends Comparable<T>> boolean greater(T t1, T t2) { return t1.compareTo(t2) > 0; } だからこそ、List(Any) と書けるようにしたのだと思います。 反変/共変は理解できていませんが、皆様の議論を見ていると scala では型チェックを 重視・活用しているように思えます。OCaml でのようにコンパイル段階でエラーを検出・ 指摘することに拘っているのだろうと推測します。 Python duck typing のように、実行時にエラーを吐き出していたのでは、ビジネス用途 で使い物にならないのだと思います。C++ template でのように、大量の意味を掴みにく いエラーメッセージを吐き出すことは、scala ではないのだと思います。 もうすこし調べてみます。ありがとうございました。
594 名前:デフォルトの名無しさん mailto:sage [2008/12/12(金) 18:54:30 ] 相対論スレかと思った
595 名前:デフォルトの名無しさん [2008/12/13(土) 00:12:24 ] scalaを使うと並列処理がとても上手く書けると聞いた そのメカニズムを教えてくれないか?
596 名前:デフォルトの名無しさん [2008/12/13(土) 00:15:40 ] 関数型だから??
597 名前:デフォルトの名無しさん mailto:sage [2008/12/13(土) 00:19:00 ] つ www.scala-lang.org/node/50
598 名前:デフォルトの名無しさん mailto:sage [2008/12/13(土) 12:45:16 ] >>587 あえて print1n にしてエラーメッセージ出させるとうちの 2.7.2 final では (fragment of HelloWorld.scala):1: error: not found: value print1n print1n("Hello, world!") ^ one error found !!! discarding <script preamble> となる エラーメッセージ冒頭が違うのは何故?
599 名前:デフォルトの名無しさん [2008/12/13(土) 15:09:29 ] なんか結局Java7にクロージャ入らないらしいので 結構本当にScalaの時代が到来するのではないか。
600 名前:デフォルトの名無しさん mailto:sage [2008/12/13(土) 16:38:09 ] ないないw エッジな人達はとっくに関数型に行ってるし そうでない人にScalaは無理 下級兵士はこれからもJavaだよ
601 名前:デフォルトの名無しさん mailto:sage [2008/12/13(土) 17:03:06 ] 俺もScalaの時代が来るかについては否定的だけど Javaな人に関数型の考え方を知ってもらう教材としてScalaは悪く無いと思う 適切なドキュメントさえあればScalaを学ぶのはそう難しいことではない
602 名前:デフォルトの名無しさん mailto:sage [2008/12/13(土) 19:49:40 ] エッヂな人達って関数型に行ってもやっぱり実際に物作るのはC++とかスクリプトとかじゃないの?
603 名前:デフォルトの名無しさん mailto:sage [2008/12/13(土) 20:37:13 ] エッチな人なので関数型言語でWEBクローラつくりました
604 名前:デフォルトの名無しさん mailto:sage [2008/12/13(土) 22:32:32 ] >>599 RubyでいうRuby on Railsのようなキラーライブラリの爆発のようなもの必要だな Liftはあるが、採用実績はまだこれからだ Lift Web Framework: Home demo.liftweb.net/ ↓後はLiftのようなものを流行らせるなら、こういう記事がもっと増えて、 InfoQ: David Pollak氏 lift と Scala を語る www.infoq.com/jp/news/2008/03/liftweb さらにこういう本まで出版しないと Amazon.co.jp: JavaからRubyへ ―マネージャのための実践移行ガイド: Bruce A. Tate, 角谷 信太郎: 本 www.amazon.co.jp/dp/4873113202 images-jp.amazon.com/images/P/4873113202.09.MZZZZZZZZZ.jpg おれ自身はRuby好きだけど、静的の魅力も知っているとScalaにすごく期待したくなるわけだよ
605 名前:デフォルトの名無しさん mailto:sage [2008/12/13(土) 22:38:38 ] liftよりWeb Flavorに期待してる。あと、WicketはJavaよりScalaの方が書き易そうな気がするんだ。
606 名前:デフォルトの名無しさん mailto:sage [2008/12/13(土) 22:46:11 ] 昔はEJBが駄目すぎたけど今や 生産性なんて言語やフレームワークでそんなに違うかって思う それより絶対性能の高さや簡単に数十台規模のシステムを開発できる フレームワークでも作ってくれた方がありがたい
607 名前:デフォルトの名無しさん mailto:sage [2008/12/14(日) 00:54:45 ] >>601 Javaな人に関数型を知ってもらうなら、Groovyでどうよ?
608 名前:デフォルトの名無しさん mailto:sage [2008/12/14(日) 01:56:17 ] >>606 実際は大して違わないんですよ。 それよりも大事なのは 10分でブログが作れます、的なアトラクションや コードが少なくてすみます、的な表向きな利点(実際はテストコードてんこもりで大して変わらん) 他に・・・ 何がいると思いますか?
609 名前:デフォルトの名無しさん mailto:sage [2008/12/14(日) 05:05:36 ] >>607 Groovyは関数型の要素が少な過ぎると思う。無名関数くらいじゃない? しかも、そのくらいなら今どきの言語のほとんどが持っている機能だし それにGroovyは関数型的な(immutableな)データ構造を作成するのを助けてくれないよね Scalaは関数型的なデータ構造を作りやすい構文になってるので、その点でもScalaの 方が良いと思う
610 名前:デフォルトの名無しさん mailto:sage [2008/12/14(日) 09:48:57 ] 「関数型的なデータ構造」なんて曖昧な言葉は使わずに、 「代数的データ構造」と言いましょう。
611 名前:デフォルトの名無しさん mailto:sage [2008/12/14(日) 11:17:44 ] >>610 代数的データ構造と言っちゃうとかなり範囲を限定しちゃうでしょ immutableなデータ構造全般を指すつもりで関数型的なデータ構造と書いた
612 名前:デフォルトの名無しさん mailto:sage [2008/12/14(日) 11:29:23 ] コンストくらいしかないような
613 名前:デフォルトの名無しさん mailto:sage [2008/12/14(日) 23:07:17 ] >>598 Ubuntuでsynapticから入れたんですけど、 エラーになるんです。 $ scala -version Scala code runner version unknown version -- (c) 2002-2006 LAMP/EPFL こんなになるんです。
614 名前:デフォルトの名無しさん mailto:sage [2008/12/15(月) 00:37:57 ] 2.3.0 のようです ttp://ubuntuforums.org/showthread.php?t=662629 ちなみに Debian の Etch も 2.3.0 Java 系はプラットフォームを汚すことはめったにないので、 Scala ホームサイトから直落としでも良いかと Debian の Java は GNU 系に力を入れてるんで、 Sun 系の 方はまだまだです
615 名前:デフォルトの名無しさん mailto:sage [2008/12/15(月) 20:28:40 ] >>614 アドバイスありがとうございます。 tar落としてきてやってみたらうまくいきました。
616 名前:デフォルトの名無しさん mailto:sage [2008/12/17(水) 13:37:24 ] neopythonic.blogspot.com/2008/11/scala.html
617 名前:デフォルトの名無しさん mailto:sage [2008/12/17(水) 21:15:12 ] >>616 最初の学習曲線が厳しいようだ 私は Odersky の文章のまずさ (英語ネイティブでないのでしかたないのだが) が最初にして最大の壁になるだろうな、と言語仕様を読んでて思ったが
618 名前:デフォルトの名無しさん mailto:sage [2008/12/17(水) 23:58:38 ] >>617 俺は英語能力あまり無いのでOderskyの文章のどの辺がまずいのかあまり よくわからんかったのだが、たとえば言語仕様のどの辺の文章?
619 名前:デフォルトの名無しさん mailto:sage [2008/12/18(木) 20:26:02 ] どの辺というか、全体的に大ざっぱすぎたり専門的すぎたり、てか 書きぶりなどからして文章書いてる時間的余裕がなさげな感じ 明白なミスはほとんどないんだけど (616 紹介中の文章で can learning と かあってわらたw)、肝心なところで何十回も読まないと何が言いたい のか的を得なかったり、もっと簡単に言えるところを妙にまわりくどく 表現したり まあさすがに数十回も読み直すうちに慣れましたが (だから、例の本も当人が書くと知ってちょっと不安に思いますた、買う 予定ないけど)
620 名前:デフォルトの名無しさん mailto:sage [2008/12/18(木) 22:55:36 ] 私は、どうしてこういう機能や文法が必要なのか、 その説明が少ないんじゃないかなと思いました。 特に代数データタイプに通じてない人は 何が何やらさっぱり分からないんじゃないかと。 どうしてこういう形式を採用したのかが。
621 名前:デフォルトの名無しさん [2008/12/19(金) 07:48:40 ] 仕様書はどこでも大体そんなもんでしょう。By Exampleは読んだ?
622 名前:620 mailto:sage [2008/12/19(金) 11:19:41 ] www.scala-lang.org/node/143 も結構よんでいるから俺は全然問題ない。 ただこういうのを読まずに始めたい人、 代数データタイプの知識のない人、 そういう人への「解説」がない。
623 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 19:32:43 ] 英語に文句を言う前に 「的を得ない」という間違った日本語を使わないようにしようぜ。
624 名前:デフォルトの名無しさん mailto:sage [2008/12/19(金) 20:04:29 ] scalaの公式サイトに雪が降ってるじゃないか!
625 名前:デフォルトの名無しさん [2008/12/19(金) 20:06:17 ] 凄い!!
626 名前:619 mailto:sage [2008/12/20(土) 12:41:14 ] >621 てか、英語日本語ともネット上で読めるものはすべて読みました、でも結局、 622 さんの言うように、OCaml、Haskell さらにジョイン計算理論まで目を通した 上で読み返してはじめて得心しました ちなみにそんな私の Scala 評価は、 増築しまくりな OCaml よりはすっきり 原理原則にこだわって常時遅延評価を意識する必要が (少なくとも使用初 期には) ある Haskell よりは気が楽 オブジェクト指向はジョイン計算の具現と知って納得 といった感じス
627 名前:デフォルトの名無しさん mailto:sage [2008/12/20(土) 13:02:53 ] >>626 他の言語の仕様書(英語)は読んでみたことある? 俺はScalaの言語仕様の文章が特にわかりにくいとは感じなかったな。
628 名前:619 mailto:sage [2008/12/20(土) 13:05:01 ] >623 古来中国では「的を射ない」ことを「失鵠」とも表現していました (鵠 はこの場合的の 中心の黒丸のこと; 正鵠など) だから「失う = 得ない」で「漢字の用法」としては必ずしも間違っておらず、事実厳密 な議論では「どちらも可」となっているようです ただなるほど国語辞典などでは「的を射る」の方しか載ってないので、「普通の日本 語」としては「的を得ない」は非推奨、ということになるようです 実際には「的を得ない」の方がはるかに広く使われてるようですが
629 名前:619 mailto:sage [2008/12/20(土) 13:08:52 ] >>627 Java、ECMAScript と E4X をざっと ほかは Scheme や Haskell などは日本語訳でだけス てか、これらの文章が良すぎだったのかな?
630 名前:デフォルトの名無しさん mailto:sage [2008/12/20(土) 13:34:20 ] >>629 PrologのISO規格書が面白いのではないか。スタックモデルで説明している。 BNFも併記されてたと思うけど。
631 名前:619 mailto:sage [2008/12/20(土) 13:44:50 ] Prolog は、MSX のころに 98 用 BASIC で記述されたミニマム Prolog を移植して ちょっと遊んで以来 ちなみに自分初の処理系移植実装な経験 (懐 もしかして誤解されてるかもですが、別に言語仕様マニアではなく、Scala では チュートリアルでも ByExample でも「全体像」がさっぱり会得できなくてしかたな く言語仕様にトライするしかなかっただけなのでス
632 名前:デフォルトの名無しさん [2008/12/20(土) 14:58:39 ] まあ少しずつやっていきなよ。
633 名前:デフォルトの名無しさん mailto:sage [2008/12/20(土) 15:34:12 ] >>628 漱石枕流乙
634 名前:デフォルトの名無しさん mailto:sage [2008/12/20(土) 18:45:34 ] ジョイン計算理論って何よ
635 名前:デフォルトの名無しさん mailto:sage [2008/12/20(土) 19:33:44 ] >>634 たぶんJoin-calculus en.wikipedia.org/wiki/Join-calculus のことだと思う。全然知らないけど、分散計算の形式的な計算モデルの一つらしい
636 名前:デフォルトの名無しさん mailto:sage [2008/12/20(土) 19:57:19 ] >>634 ラムダ計算を並行性の観点から鍛え直したのがパイ計算 ttp://web.yl.is.s.u-tokyo.ac.jp/kobalab/kadai99/picalc.html で、それにさらに場所階層性を導入したのがジョイン計算 ttp://jijixi.azito.com/cgi-bin/diary/index.rb?date=20070531 (すごい分かりやすい pdf があったけどパスワード封鎖されたようで、 現状で日本語での記事はこの程度しか見あたらず、2 項目の JoCaml の部分) ちなみに OCaml から JoCaml を作る過程で練り上げられた理論っぽい
637 名前:デフォルトの名無しさん mailto:sage [2008/12/20(土) 20:38:54 ] なるほど Scalaのどの辺がそれに基づいてるの
638 名前:デフォルトの名無しさん mailto:sage [2008/12/21(日) 00:30:03 ] 「Scala開眼」を書いた人がこの中にいるな
639 名前:620 mailto:sage [2008/12/21(日) 00:58:28 ] >>637 Scala.Actorsとか。 こういうのは仕様書やライブラリのAPI見れば分かる話じゃないよ。 知っているのと知らないのでは理解の速度が全然違うし、 モデルの把握もしやすくなる。 >>626 の言うようにScalaはいろいろといいところがあるんだけど、 解説文が少なくてあまり理解されてないと思う。 まあ>>622 にある論文読めばいいんだけどw
640 名前:636 mailto:sage [2008/12/21(日) 11:12:25 ] Scala のオブジェクト指向導入は ML 系からのアバウトな逸脱ではなく、ジョイン 計算の場所階層性 (プロセスは「場所」に属し、チャネルはその場所階層を上 位へとさかのぼりつつ目的のプロセスを検索する) をクラス階層と解釈しての きちんとした理論を背景とするものである、ということ これで何がうれしいかというと、プログラムの実行時エラー皆無性が計算で事 前に証明可能になる、つまり静的型のエラー回避性が動的結合にも延長でき るようになる ということらしい
641 名前:デフォルトの名無しさん mailto:sage [2008/12/21(日) 19:37:52 ] > つまり静的型のエラー回避性が動的結合にも延長できるようになる 面白そうですが、今の型システムで回避できなくて、join計算で回避できる ようなエラーってどういうもの?
642 名前:640 mailto:sage [2008/12/21(日) 20:19:02 ] 先の今は見れない pdf では純粋にプロセス間通信に限ればそこにおける 予期せぬエラーが理論上ゼロとなることを証明してました 、たしか むろん、ハードのエラーとかプロセス間通信以外に起因するエラーは回避 不能なはずですが ちなみに、パイ計算の方はたしか理論上どうしても無限回帰になってしま う場合があったはず (非理論的なメタ制約を与えれば回避できるようですが)
643 名前:デフォルトの名無しさん mailto:sage [2008/12/22(月) 13:02:43 ] >>639 Actorとπは別もんだろー。
644 名前:デフォルトの名無しさん mailto:sage [2008/12/22(月) 18:35:11 ] Scalaのpattern matchingは、 Join calculusとの関係が深いです。例えば、 ALGEBRAIC PATTERN MATCHING IN JOIN CALCULUS arxiv.org/pdf/0802.4018 そのpattern matchingを使えば、 多くの並列計算モデルが、 「ライブラリとして」実装できるというのが、 Scalaの核の一つです。 Scala.Actorsはその実装の一つで、 ライブラリのソースも公開されています。 ちなみにお父さん言語のFunnelでは、 もっとJoin calculus丸出しの文法でした。
645 名前:デフォルトの名無しさん [2008/12/23(火) 01:09:04 ] 【Programing in Scala】ついに届いた(笑) 自主学習進みすぎて、最早入門書は要らないんだがな・・
646 名前:デフォルトの名無しさん [2008/12/23(火) 11:24:49 ] ついに購入者が!! どこで注文したの?
647 名前:デフォルトの名無しさん [2008/12/23(火) 17:24:59 ] >>646 Artimaのサイトで9月くらいから予約済
648 名前:556 [2008/12/23(火) 23:14:15 ] 2.7.3 RC1 www.scala-lang.org/node/417 はやっ
649 名前:デフォルトの名無しさん [2008/12/23(火) 23:33:16 ] ちゃんと日本にも発送してくれるんだ かなり待たされたね で、結局Amazon.co.jpではいつまでたっても買えないんだろうか??
650 名前:デフォルトの名無しさん [2008/12/24(水) 07:02:59 ] Scalaで実行時にScalaのソースファイルをコンパイルして 出来たクラスのメソッドをリフレクションで実行したい時ってどんな風に書く?
651 名前:デフォルトの名無しさん mailto:sage [2008/12/24(水) 09:08:48 ] >>624 ほっとくとめっちゃCPU食うよ 職場着いたら部屋が微妙に暖かかった…
652 名前:デフォルトの名無しさん mailto:sage [2008/12/24(水) 16:46:47 ] プログラミングしりとり schiphol.2ch.net/test/read.cgi/575/1010948472/l50
653 名前:デフォルトの名無しさん mailto:sage [2008/12/24(水) 21:57:01 ] >>650 Scala コンパイラソースの scala/tools/nsc/Interpreter.java interpret メソッド (475 - 520 行) 427 - 432 には compileSources、437 - 438 には compileString なんてメソッドも ただし当然 scala-compiler.jar もクラスパス組み込みのこと
654 名前:653 mailto:sage [2008/12/24(水) 22:00:54 ] あと、883 - 898 の loadAndRun: メソッドで名前どおりリフレクションロード & 実行
655 名前:デフォルトの名無しさん [2008/12/24(水) 22:11:43 ] >>653-654 thx!
656 名前:デフォルトの名無しさん [2008/12/25(木) 10:19:00 ] www.ibm.com/developerworks/jp/java/library/j-scala04298.html >trait が実際にクラスの一部として組み込まれるまで >trait の振る舞いの定義はチェックされません。 >あるいは別の言い方をすれば、trait を使用するクラス定義の中に >組み込まれるまで適切さをチェックされないメソッドを定義することができます。 これはどういう意味か教えてください あとclassに出来てtraitに出来ないことってnewだけで、 他は何でも出来るという理解でいいのでしょうか
657 名前:デフォルトの名無しさん mailto:sage [2008/12/25(木) 11:07:52 ] 「late binding」ってことだけど。 C++0xだとtemplate/conceptで使うlate_checkってキーワードが増えてます。 これがないと、 > あとclassに出来てtraitに出来ないことってnewだけで、 > 他は何でも出来るという理解でいいのでしょうか となって全く使えない。
658 名前:657 mailto:sage [2008/12/25(木) 11:49:07 ] ibm.comが調子悪かったからみれなかったけど、 具体例でちゃんと説明書いてあるじゃん。 良く読みこなそう! C++はブロックごとに指定。 template <Semigroup T> T add(T lhs, T rhs) { return x + y; // Semigroup<T>::operator+ } template <Semigroup T> T add(T lhs, T rhs) { late_check { return x + y; // class Tのoperator+ } }
659 名前:デフォルトの名無しさん [2008/12/25(木) 11:53:12 ] C++ 0xのlate_checkはコンセプトじゃなくて 生成したソースコードで判断するというものですよね traitはそれに近いようなことをやってるということですか? 具体的にどういうコードを書けば遅延バインディングされるんですか?
660 名前:デフォルトの名無しさん mailto:sage [2008/12/25(木) 13:05:13 ] www.ibm.com/developerworks/jp/java/library/j-scala04298.html のどの部分が分からないの?
661 名前:デフォルトの名無しさん [2008/12/25(木) 13:10:45 ] >>660 >trait が実際にクラスの一部として組み込まれるまで >trait の振る舞いの定義はチェックされません。 >あるいは別の言い方をすれば、trait を使用するクラス定義の中に >組み込まれるまで適切さをチェックされないメソッドを定義することができます。 この文章以外は分かりました traitのメソッドでも定義されていない変数なんかを使えば普通にコンパイルエラーになるので 適切さをチェックされないメソッドというのがどんなものなのかが分からないのです
662 名前:デフォルトの名無しさん mailto:sage [2008/12/26(金) 16:30:05 ] trait 中の定義は、実際にはそれを実装するクラスか、あるいはスーパークラス 内のプライベートメンバとしてその本体は別名定義され、trait 中のシグネチャが それにアクセスするゲッタセッタの形になります また、trait からはそれが指定される位置以前のほかの trait などの名前が見え るようになっています。このため、指定順を入れ替えると動作が変わることもあ りえます
663 名前:アク禁解禁 mailto:sage [2008/12/27(土) 16:40:54 ] >>661 Orderd[A]の例だと def compare(that: A): Int の定義の存在はチェックされずに、Ordered[A]をコンパイルできます。 Object withするまで定義の存在はチェックされないわけです。 宣言の正当性はチェックされているのですが。
664 名前:デフォルトの名無しさん mailto:sage [2008/12/27(土) 22:36:35 ] scala.xml.NodeSeqの\\メソッドでXPath式っぽいのをかけるけど これXPathにしなかったのはなんでだろう。 素直にXPathが使えればもっと簡潔にかけるのに。 あと属性のパターンマッチできないのも中途半端。これは属性定義が順序をもたないからだろうか?
665 名前:デフォルトの名無しさん [2008/12/27(土) 22:38:44 ] >>662-663 なるほどありがとうございます
666 名前:デフォルトの名無しさん [2008/12/28(日) 10:58:57 ] XPathを完全に実装しようとおもったらノードの構造をZipperとかにしないといけなくなる。
667 名前:デフォルトの名無しさん mailto:sage [2008/12/28(日) 20:52:47 ] 本家サイトで XML の鉄人の参加を募集してることからして、そっちの方は まだ十分にカバーできてないっぽい感じ
668 名前:デフォルトの名無しさん [2008/12/28(日) 21:23:08 ] >>666 はよく考えたら違うな。 XPathをフル実装してかつ不変な構造にしたかったら、だな。 なんか関数型言語脳になってきたのかもしれん。