- 1 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/07(土) 21:26:47.61 ]
- 一般的には、オブジェクト指向型言語が優勢でが
一部には関数型言語を崇拝している人もいます どちらが上なのか、この際はっきりさせましょう 前スレ toro.2ch.net/test/read.cgi/tech/1331328955/
- 169 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/09(月) 22:21:19.77 ]
- OOも関数型も単なる一機能なんだから、
それをもって〜言語って言い張るのは無理があるんだよ。
- 170 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/09(月) 22:52:21.84 ]
- >>169
でも、マルチスレッドや分散処理の論文は関数型や論理型の推奨する永続データモデルばかりだよ? シングルスレッドならともかく、マルチスレッド意識したら純粋関数型や論理型じゃないと厳しい時代になってくると思うんだけど
- 171 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/09(月) 22:53:59.95 ]
- >>170
今は普通にマルチスレッドの機能は オブジェクト指向言語に搭載されてる。
- 172 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/09(月) 23:20:47.45 ]
- ストラウストラップのOOのキモは「抽象データ型にクラスを使うアイデア」。
ref. www2.research.att.com/~bs/whatis.pdf ケイのOOのキモは「処理系のみならず、その受け皿であるナンチャッテOS、工程まで ひっくるめたあらゆることで徹底した動的性」。 ref. metatoys.org/oxymoron/oxymoron.html 関数型のキモは「非破壊操作とそれがもたらす参照透明性」。 型推論とかメッセージとかパターンマッチとかはオマケです。偉い人には(ry
- 173 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/09(月) 23:31:04.63 ]
- >>170
分散したいならデータも共有しないのが基本なので 永続データの共有を推奨するのはおかしいと思う
- 174 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/09(月) 23:41:08.58 ]
- >>170
あんま最近は追いかけてないから知らないけど、 汎用手続き型+トランザクショナルメモリの研究はもう止めちゃったのかね。 デッドロックのみならず、例外処理もしやすくなるから期待していたんだけど。 トランザクションで思い出したけど、SQLは宣言的言語と言われてたはずだったんだけど、 今どきはストアドプロシージャとかも使うらしいね。
- 175 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/09(月) 23:44:18.47 ]
- 結局欲しいのは副作用の管理
- 176 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/10(火) 06:49:32.37 ]
- >>161>>163
オブジェクト指向の何を取り入れたの? Haskellのどの機能がオブジェクト指向由来なのか教えてくれ
- 177 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/10(火) 06:55:00.27 ]
- OOで見るべきところがあるのはメッセージング(徹底的な動的性)とtraitsのみ
他はゴミ
- 178 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/10(火) 07:27:14.51 ]
- OCaml のことを言ってるんじゃないのか?
あとジェネリックプログラミングとかは、中途半端に型があるオブジェクト指向系の 言語でやるより、がっちり型のある関数型言語でやったほうがいいし、ST モナド 使えば、本物の「状態のカプセル化」ができる。 関数型ではオブジェクト指向なんてできない、というのは初心者が陥りがちなデマ。
- 179 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/10(火) 07:47:00.64 ]
- そういや、関数型でOOPLでいう継承ってどんな形になるの?
- 180 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/10(火) 08:04:22.67 ]
- >>179
継承っぽいやつ>>93 プロトタイプOOっぽいやつ>>25 OCamlは普通にクラスも継承もあるので省略
- 181 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/10(火) 08:24:34.70 ]
- >>179
OCamlで高階ファンクター F はモジュール X,Y を引数にして新しいモジュールを返す module type S = sig end module type T = sig end module F (X : S) (Y : T) = struct include X include Y end
- 182 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/10(火) 09:21:46.15 ]
- やろうと思えばCでもできること
自然に書けるかなんだけどな
- 183 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/10(火) 12:05:42.06 ]
- 不自然なものを自然にしたいという需要は確かにあるね
科学的に有害か無害かは関係なく、自然か不自然かだけで商売になる
- 184 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/10(火) 12:30:26.91 ]
- ただし自然かどうかはOO信者のさじ加減ひとつで決まります
- 185 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/10(火) 13:06:13.85 ]
- セマンティクスとしては x の評価を 2 度する、というのは変わらんじゃないのかな。
その評価が状態に対して idempotent かどうかという違いであって。
- 186 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/10(火) 13:08:03.10 ]
- (誤爆w)
- 187 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/10(火) 23:37:56.20 ]
- >>183
自分はHaskellのリバース関数が自然だと感じて入門当時は感動したな reverse [] = [] reverse (x:xs) = reverse xs ++ [x] もちろん、組込み関数のreverseは速度重視の直感的ではないコードなんだが・・・
- 188 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/11(水) 01:26:37.69 ]
- >>187
演算子とコンストラクタの違いが直感的に分からない 英単語だったら先頭が大文字かどうかで分かるんだが
- 189 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/11(水) 03:24:43.28 ]
- >>188
コ、コンストラクタ!? Haskellを例に出した私にレスされましても・・・ クラスの生成時に呼び出すメソッドと演算子に直感的な違いも何も無いと思いますが・・・ Cons演算子のことでしたら、リストという構造に対する演算子だと理解しておけば良いと思います [1,2,3] = 1:[2.3] = 1:2:[3] = 1:2:3:[] 関数の引数にリストの全部の要素を書きたければ(要素数固定になりますが)書けますよ sum3 (x:y:z:[]) = x+y+z (x:xs)の部分の理解はghci上で let (x:xs) = [1..5] とかしてxとxsの値を調べると良いです リストを引数に取る時の表記は、Haskellの中では特別な表記法と言う訳ではないです +演算子もこう言う書き方は出来ま・・・廃止になったけど、ちょっと前までは出来たんです dec (n + 1) = n
- 190 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/11(水) 03:47:40.43 ]
- >>189
彼には言っても無駄な稀ガス…
- 191 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/11(水) 13:49:19.06 ]
- >クラスの生成時に呼び出すメソッドと演算子に直感的な違いも何も無いと思いますが・・・
右辺で使う演算子を左辺に書いてみれば違いが分かるよ reverse (xs++[x]) = x : reverse xs 実際には xs++[x] というパターンマッチはできない
- 192 名前:デフォルトの名無しさん mailto:sage [2012/04/11(水) 21:29:08.42 ]
- ユーザ定義のデータコンストラクタは頭大文字で始まるから
そんな混乱せんだろ むしろコンストラクタを関数としても使えるのは便利だ まあリストやタプルのコンストラクタは記号だが、それくらい覚えとけ
- 193 名前:デフォルトの名無しさん mailto:sage [2012/04/11(水) 23:24:51.38 ]
- 関数型言語ってようするに、
関数がクラスになる。 言ってみればJavaScriptからprototypeがなくなったようなもの。 prototypeがなくなっても効率が悪くなるだけで オブジェクト指向できるでしょ? それが関数型言語。
- 194 名前:デフォルトの名無しさん mailto:sage [2012/04/12(木) 00:08:31.03 ]
- オブジェクト指向言語ってようするに、
オブジェクトがクロージャになる。 言ってみれば関数型言語から代数データ型やパターンマッチやカリー化が無くなったようなもの。 代数データ型やパターンマッチやカリー化が無いと効率悪いけど 関数型スタイルでプログラミングできるでしょ? それがオブジェクト指向言語。
- 195 名前:デフォルトの名無しさん mailto:sage [2012/04/12(木) 00:14:31.10 ]
- > 代数データ型やパターンマッチやカリー化が無いと効率悪いけど
それはないな。
- 196 名前:デフォルトの名無しさん mailto:sage [2012/04/12(木) 00:22:10.76 ]
- >>194
それはチョット違うだろ。 クロージャーはlexical scope内にある変数をバインドして保持している関数オブジェクトで、あくまで関数オブジェクト。 オブジェクト指向のオブジェクトは、主に構造を持ったデータオブジェクト(単純スカラーでも可)またはクラスscopeにメソッドやインスタンス変数を 従属させモジュラレティーを確保する事に加え、インヘリタンス/mixin/treitなどで共有または階層関係を持たせ、データドリブンなインターフェースを提供する。 似たところもあるけれど、分けて考えるべきかと。
- 197 名前:デフォルトの名無しさん mailto:sage [2012/04/12(木) 00:29:40.32 ]
- >>196
いや、マジレスされると困るわw つーか、そこ突っ込むなら>>193の方が違いすぎるだろ > 関数がクラスになる
- 198 名前:デフォルトの名無しさん mailto:sage [2012/04/12(木) 00:39:23.32 ]
- >>197
じゃあ、関数の戻り値がオブジェクト(インスタンス)になる。でいいか? オブジェクトを作り出すもの = クラス 戻り値を作り出すもの = 関数 言ってることは同じだけどなw
- 199 名前:デフォルトの名無しさん mailto:sage [2012/04/12(木) 00:48:53.41 ]
- >>198
カリー化されてんだから関数の戻り値も関数だろ クラスとインスタンスのような関係はねーよ それともあれか?関数もオブジェクトだから 関数型言語はオブジェクト指向ってやつか?くだらねえ
- 200 名前:デフォルトの名無しさん mailto:sage [2012/04/12(木) 00:56:44.16 ]
- 気持ち悪いアナロジーで無理矢理OOに対応付けて
理解しようとしなくても ドカタの人生で関数型言語を使う機会なんて来ないから 安心しろよ お前にとって運悪く関数型言語が普及してしまったとしても その頃にはお前の仕事は無くなってるよ
- 201 名前:デフォルトの名無しさん mailto:sage [2012/04/12(木) 00:57:45.87 ]
- >>197
>>193も突っ込もうと思ってたw JSがらprototype削ったらinfix notationなlispみたいなのになっちゃうから。
- 202 名前:デフォルトの名無しさん mailto:sage [2012/04/12(木) 01:01:03.49 ]
- ドカタ以下のトイプログラマー
- 203 名前:デフォルトの名無しさん mailto:sage [2012/04/12(木) 01:05:35.12 ]
- オレ>>169>>201だけれど、
関数をOOのオブジェクトとみなすところにはそれ程違和感無かった。 言語によっては、関数オブジェクトにもメタ情報設定してOOのオブジェクトみたいにmethodを従属させたり、他のmethodをmixinさせることもできるものがあるから。 ただしhaskellではないが。
- 204 名前:デフォルトの名無しさん mailto:sage [2012/04/12(木) 01:12:21.32 ]
- 関数型が自己満足以上のメリットがあると感じたこと無い
- 205 名前:デフォルトの名無しさん mailto:sage [2012/04/12(木) 01:15:35.37 ]
- >>203
うそつけ。>>169はオレの書き込みだ。
- 206 名前:デフォルトの名無しさん mailto:sage [2012/04/12(木) 01:17:46.33 ]
- >>203
あ、でもやっぱ違うか、勘違い。 クラスは静的な物(ともかぎらないclassすらもオブジェクトという概念の言語もあるけれどちょっとおいて置いて) オブジェクトの生成はコンストラクタってのが昨今普及している概念だから。
- 207 名前:デフォルトの名無しさん mailto:sage [2012/04/12(木) 01:18:40.06 ]
- >>205
こめ、あんか間違えた。えーとどれがオレのレスだったっけw
- 208 名前:デフォルトの名無しさん mailto:sage [2012/04/12(木) 01:19:35.18 ]
- ぶっちゃけいうと
関数型は今仕事がない。 将来はあると信じてる。 オブジェクト指向は今仕事がある 将来はなくなって欲しいと、関数型厨は思ってる。 >>200とかそうだなw
- 209 名前:デフォルトの名無しさん mailto:sage [2012/04/12(木) 01:49:53.91 ]
- スパコン向けのプログラム書いてる人とかなら関数型を使う機会があるかもだが、
求められるのはプログラミング技術じゃなくて、対象問題の専門知識だわな。 あとは、大学教授が自分の論文に必要な計算をキャンパスのコンピュータを使って並列計算しました的な。 関数型は並列化が容易だから、実行速度が求められる分野に適していそうだが、 手続き型で並列化したほうがもっと速くなるから、結局なんだかなーな。 クラスタを電卓代わりに使う人用かと。
- 210 名前:デフォルトの名無しさん mailto:sage [2012/04/12(木) 02:03:13.63 ]
- >>209
本気で並列化に取り組むとその考えかたは変わるよ。 関数型の並列化はタスク?データ?どっちのparallelだと思う。 スパコンは徹底的に性能重視だし。 まいいや2chでマジレスカコワルイオレw
- 211 名前:デフォルトの名無しさん mailto:sage [2012/04/12(木) 02:20:44.68 ]
- >>210
関数型で出来ることが手続き型で出来ないってことはないんで。 FPGAとかは別としても、主流のノイマン型は手続き型がネイティブなんで。
- 212 名前:デフォルトの名無しさん mailto:sage [2012/04/12(木) 02:45:31.08 ]
- >>211
できるできないまで話を広げればパラダイムなぞ何でもいいんだよ。 性能を徹底的に追及するにはCPUの命令レベル並列化SIMD並列化core間メモリ共有離散並列化ネットワーク分散並列化 徹底的に実効効率(≒GFLOPS)と性能を追求する。 一方の関数型で一部取りざたされる並列化は、並列化のしやすさ=参照透過による並列依存解析の簡便さなどで まだ止まっている段階であり性能の追求に関してはマッタク解になっていないンジャマイカ? だからデータパラレルorタスクパラレルか上で訊いてみた。その答えでどのくらい深く考えている椰子かわかるから。 簡便さは無視できず大切なことかもしれないが、それで数値解析がいままでより早くなっていないのであればつかわれなくてもしょうがない。。 安易に並列化に研究成果を求めて逃げるのは愚。 で、FPGAって何の話だ?と小一時間w もしかしてハード・ソフト両面でずぶの素人さんをオレは相手にしてしまった? 上のクロージャーもしかりだけれど2chでマジレスあまりしたくない。
- 213 名前:デフォルトの名無しさん mailto:sage [2012/04/12(木) 03:06:38.71 ]
- あーわかったわかった。
関数型が並列化に向いてるって書き込みに噛み付いてたのか。そりゃ食い違うわ。 でも、参照透過性って並列化以外に上手い生かし方が無いと思うんだが。 遅延評価も言語レベルでサポートが欲しいかと言われると、別にねぇ。
- 214 名前:デフォルトの名無しさん mailto:sage [2012/04/12(木) 03:13:37.82 ]
- >>213
参照透過性はプログラムコードの理解しやすさ、バグの入りにくさなどに少なからず貢献あるんじゃマイカ
- 215 名前:デフォルトの名無しさん mailto:sage [2012/04/12(木) 03:20:08.01 ]
- でも、副作用のないプログラムが読みやすいのは、手続き型でも同じことだしなぁ。
言語レベルでサポートしていることの意味は、自動化、 つまりは自動遅延評価や自動並列化になるとおもうんよ。
- 216 名前:デフォルトの名無しさん mailto:sage [2012/04/12(木) 03:27:10.53 ]
- >>215
副作用を禁止しちゃっても十分ソフトウェアは記述できるという数学的な原理に基づき そのための仕組みを言語レベルの機能でちゃんとサポートし副作用を低減しようとする意義はあるのでは?
- 217 名前:デフォルトの名無しさん mailto:sage [2012/04/12(木) 03:42:11.67 ]
- そんな蓮舫さんみたいなこと言われても。
- 218 名前:デフォルトの名無しさん mailto:sage [2012/04/12(木) 06:22:33.36 ]
- 副作用のある部分をコードの一部に隔離したとき、
それが他に漏れてないことを静的型検査できるのがメリット 静的型検査なんて要らないし、副作用の有無なんて コメントにでも書いとけば分かるだろ というプログラマにはメリット無い(批判する意図はないので注意)
- 219 名前:デフォルトの名無しさん mailto:sage [2012/04/12(木) 06:34:07.76 ]
- ただし、>>218は特定の言語(HaskellとかD)のメリットであって
関数型言語のメリットでは無い
- 220 名前:デフォルトの名無しさん mailto:sage [2012/04/12(木) 06:44:16.58 ]
- 普及してるかどうかで使う言語を決めてる人って
TIOBEとか見て一喜一憂してるの? www.tiobe.com/index.php/content/paperinfo/tpci/index.html JavaプログラマならJavaの人気が長期的に下がり続けてる (ついに今月は2位に陥落)の見てショック受けてるの? 幾らでも他と交換可能な木っ端プログラマは大変だね
- 221 名前:デフォルトの名無しさん mailto:sage [2012/04/12(木) 09:49:24.36 ]
- 中身無いなぁ。
普及率は人気の度合い。なぜ人気があるのか考える必要がある。 誰かさんの思い込みより価値ある。
- 222 名前:デフォルトの名無しさん mailto:sage [2012/04/12(木) 09:50:24.09 ]
- >>216
仮にIOを禁止しても、IOと殆ど同じモナドを簡単に作れる だから禁止していいんだという解釈もあるが、禁止しても無意味だという解釈もある Haskellが、いずれかの解釈を一方的にサポートすることはない あくまで中立
- 223 名前:デフォルトの名無しさん mailto:sage [2012/04/12(木) 09:55:43.85 ]
- モナドって副作用の定義を限定的にして副作用なくしたと主張してるだけで
ソフトウェア工学上で問題になる事項をすべて解消しているわけではいないと思うんだけど どう思う?
- 224 名前:デフォルトの名無しさん mailto:sage [2012/04/12(木) 11:16:27.37 ]
- 問題を定義した本人には、自己解決しましたと主張する権利があると思う
- 225 名前:デフォルトの名無しさん mailto:sage [2012/04/12(木) 16:43:59.37 ]
- >>221
全くもってその通り!! 中国語だって世界中で大人気だからな!!
- 226 名前:デフォルトの名無しさん mailto:sage [2012/04/12(木) 16:51:24.45 ]
- >>223
現実のコンピュータが副作用必須の設計で、モナドは副作用解決に使えるというだけ。 モナドが副作用解決のために作られた訳じゃない。
- 227 名前:デフォルトの名無しさん mailto:sage [2012/04/12(木) 17:45:50.95 ]
- モナドは何のために作られたの?
- 228 名前:デフォルトの名無しさん mailto:sage [2012/04/12(木) 18:33:25.41 ]
- 人工知能だけに限らず人間の知能にも起こり得るフレーム問題は、ジョン・マッカーシー
らの提案したフレーム問題と区別して一般化フレーム問題と呼ばれている。 ソースはwikipedia >>223 限定的なフレームを選択しないと、フレーム問題に対処できない
- 229 名前:デフォルトの名無しさん mailto:sage [2012/04/12(木) 19:54:30.42 ]
- 関数型は問題資源を乱獲してあっという間に死滅させる蛮族の手法
対して従来のやり方は問題を死滅させず適宜再生産もする 農耕・牧畜をおぼえた文明人の手法
- 230 名前:デフォルトの名無しさん mailto:sage [2012/04/12(木) 20:03:40.16 ]
- は?
単に生産性が低いものを賞賛してるだけのバカですねw
- 231 名前:デフォルトの名無しさん mailto:sage [2012/04/12(木) 20:11:16.33 ]
- OOを使ったプロジェクトは次の二つに分類される
・プロジェクトが成功した場合 => 成功したのはOOのおかげ ・プロジェクトが失敗した場合 => 設計者やプログラマがOOに未熟だった 以上の詭弁により、OOはソフトウェア工学の全ての問題を解決した
- 232 名前:デフォルトの名無しさん mailto:sage [2012/04/12(木) 20:12:09.57 ]
- え、関数型って生産性あったんですか。
- 233 名前:デフォルトの名無しさん mailto:sage [2012/04/12(木) 20:15:51.90 ]
- どんな被害妄想だよ。成功も失敗も設計者の腕次第だろ。
- 234 名前:デフォルトの名無しさん mailto:sage [2012/04/12(木) 20:41:17.18 ]
- 解決はするけど生産はしない
- 235 名前:デフォルトの名無しさん mailto:sage [2012/04/12(木) 22:36:25.45 ]
- >>232
生産性については職業プログラマの人に比較して貰うとして、少なくとも、rubyで入門書のサンプル以上のものが作れなかった自分が、haskellでは>>41,>>74のコードを書ける様になった 初心者には、rubyよりhaskellの方が自力でコード書ける様になり易いんじゃ無いかと思う
- 236 名前:デフォルトの名無しさん mailto:sage [2012/04/12(木) 23:36:58.60 ]
- せめて一ファイル千行ぐらいのものを
数十ファイルからなるアプリを作ってから 書けるようになったといって下さい。 短い関数一つと程度、 あんなの誤差でしかない。
- 237 名前:デフォルトの名無しさん mailto:sage [2012/04/12(木) 23:59:11.36 ]
- プログラムが書けるようになったといえる最低ラインは数万行のアプリを作れてから・・か。
- 238 名前:デフォルトの名無しさん mailto:sage [2012/04/13(金) 00:07:17.03 ]
- gihyo.jp/design/serial/01/ec_cube2011/0002
EC-CUBE 4万行らしいよ。
- 239 名前:デフォルトの名無しさん mailto:sage [2012/04/13(金) 00:08:42.48 ]
- www.mapee.jp/ruby/ruby173.html
Rubyは10万行
- 240 名前:デフォルトの名無しさん mailto:sage [2012/04/13(金) 00:12:30.38 ]
- picomu-tech.blogspot.jp/2010/01/openpne2.html
OpenPNE2 13万行 Linuxは1500万行らしい www.infoq.com/jp/news/2012/03/Defects-Open-Source-Commercial 解析対象のオープンソースプロジェクトは、コード行数が10万〜50万のものが ほとんど(700万行を超えるプロジェクトが2つ)で、 の合計コード行数は3,744万6,469行、平均コード行数は83万2,000行になった。
- 241 名前:デフォルトの名無しさん mailto:sage [2012/04/13(金) 00:21:31.21 ]
- OpenDylanは処理系が80万でIDEが100万stepだったっけ、失念
gccが少し前は30~40万行あった、いまの4.6,47はもっとだろうな
- 242 名前:デフォルトの名無しさん mailto:sage [2012/04/13(金) 00:23:31.62 ]
- >>236
書きたいものを書ける様になったら行数関係無い気がするけど・・・ そもそも、私の場合、Rubyではどう書けばいいかすら思い浮かばない (学習が足りないと言われればそうだけど、どっちも入門書読みかけ状態での知識でしかない) Haskellは入門書読みかけの状態でも結構色々書けるから、入門者のモチベーション維持にも良いんじゃないかな (少なくとも、自分のモチベーション維持には良い効果がある)
- 243 名前:デフォルトの名無しさん mailto:sage [2012/04/13(金) 00:27:01.11 ]
- 書きたいものを書けるのは
プロである以上最低限のことです。
- 244 名前:デフォルトの名無しさん mailto:sage [2012/04/13(金) 00:27:48.64 ]
- >>241
間違えた、The compiler includes an IDE (Win32 only, sorry), CORBA, OLE, all in all 850000 lines of code. This is (nearly) all Dylan code.
- 245 名前:デフォルトの名無しさん mailto:sage [2012/04/13(金) 00:33:06.76 ]
- >>243
書きたくない物でも金を受けとる以上書き上げるのが…(ry
- 246 名前:デフォルトの名無しさん mailto:sage [2012/04/13(金) 00:36:02.31 ]
- >>245
あんたプロや。プログラマー(ry)や。
- 247 名前:デフォルトの名無しさん mailto:sage [2012/04/13(金) 00:38:56.24 ]
- >>243
プロじゃないと言うか、プロの卵として就職して半年で諦めたんですが・・・ そんな奴が、Haskellでなら、ちょっとは書ける様になったですよ それで気付いたのは、やってる事はどの言語も同じなのかもなぁー・・・と で、関数型言語はそのやってる事は同じ。の部分を気付きやすい言語だな・・・・と 他の言語で何やってるのか分かんなくて挫折した人は、一度、関数型言語に挑戦してみてほしいかも
- 248 名前:デフォルトの名無しさん mailto:sage [2012/04/13(金) 00:46:28.21 ]
- >>247
うん。やる気マンマンです。
- 249 名前:デフォルトの名無しさん mailto:sage [2012/04/13(金) 01:27:06.58 ]
- >>248
一緒に頑張りまっしい 多分、私はそもそものググルための用語を知らないのが、そもそもの才能の無さな気がする なので、そもそもググらず自分で作っちゃえ!派な自分には関数型言語の方が性に合うっぽい (不器用なのは自覚してる)
- 250 名前:デフォルトの名無しさん mailto:sage [2012/04/13(金) 01:30:15.85 ]
- そういうセリフは関数型言語を作ってから言って下さい。
作らずに言語を使ってるだけのくせに
- 251 名前:デフォルトの名無しさん mailto:sage [2012/04/13(金) 01:41:31.45 ]
- >>249
> なので、そもそもググらず自分で作っちゃえ!派な自分には関数型言語の方が性に合うっぽい 初心者なら当然のことだよ。 俺なんかだと、見ただけで簡単な処理と分かるようなもの、 自分で作れると分かっているものは、作っても時間 を浪費するだけで何の経験値にならないし、自慢にもならない。 でも初心者にとっては、そんなものでも 挑戦する価値がある課題なのだから。 自分で作ったんだって自慢げになるでしょ?
- 252 名前:デフォルトの名無しさん mailto:sage [2012/04/13(金) 06:51:30.77 ]
- 何万行とかで脅されても気にする事無いよ
ドカタ仕事で書くコードなんてAPI呼び出すだけ、コピペコード満載の 頭悪いコードなんだから 疑うなら適当なコード書く御題出してみ?Javaのコードとか出てこないから
- 253 名前:252 mailto:sage [2012/04/13(金) 06:57:36.95 ]
- 多分、「そんなの意味ない」「もっと規模が大きくないと本当の事は分からない」
とかその手の言い訳を、御題のコードの10倍くらいの長さの文章で 必死に語ってくれるよ 本当は2chのレスに収まる規模のコードも書けないんだけどね
- 254 名前:デフォルトの名無しさん mailto:sage [2012/04/13(金) 07:16:26.24 ]
- >>252
じゃあお題。 プログラマーなら「FizzBuzz問題」解けるよな? kohada.2ch.net/test/read.cgi/prog/1209467166/401 401 :仕様書無しさん:2012/04/09(月) 23:59:48.08 FizzBuzzクイズ 1.fizz.buzz #=> 1 3.fizz.buzz #=> "Fizz" 5.fizz.buzz #=> "Buzz" 15.fizz.buzz #=> "FizzBuzz" となるようなメソッドfizz、buzzは定義可能か? 可能である場合、同様にgizzを追加定義し、 7.fizz.buzz.gizz #=> "Gizz" 21.fizz.buzz.gizz #=> "FizzGizz" 35.fizz.buzz.gizz #=> "BuzzGizz" 105.fizz.buzz.gizz #=> "FizzBuzzGizz" 105.fizz.gizz.buzz #=> "FizzGizzBuzz" と拡張・応用ができるか? メソッドのコールに()が必須の言語では 3.fizz().buzz() 形式でも構わない。 オープンクラス機構やメソッドのない言語では関数(buzz(fizz(3)) #=> "Fizz" など)で。
- 255 名前:デフォルトの名無しさん mailto:sage [2012/04/13(金) 07:48:45.37 ]
- >>252
ありがとうです では、仕事があるので明日私は書くと思いますが(飲んで帰るので、今日は無理) ファイルと検索したい文字列をコマンドから入れて、見つかった行と列のリストを表示すると言うのはどうでしょう?
- 256 名前:デフォルトの名無しさん mailto:sage [2012/04/13(金) 08:18:23.98 ]
- 全くなんの工夫もないが
$ cat fizzbuzz.hs import Control.Monad (mapM_) main = mapM_ (runFizzBuzz . gizz . buzz . fizz) [1, 3, 5, 7, 15, 21, 35, 105] runFizzBuzz (n, s) | s == "" = putStrLn $ show n | otherwise = putStrLn $ show s fizz n | n `mod` 3 == 0 = (n, "Fizz") | otherwise = (n, "") buzz (n, s) | n `mod` 5 == 0 = (n, showString s "Buzz") | otherwise = (n, s) gizz (n, s) | n `mod` 7 == 0 = (n, showString s "Gizz") | otherwise = (n, s) $ runghc fizzbuzz.hs 1 "Fizz" "Buzz" "Gizz" "FizzBuzz" "FizzGizz" "BuzzGizz" "FizzBuzzGizz"
- 257 名前:デフォルトの名無しさん mailto:sage [2012/04/13(金) 08:45:35.77 ]
- この場合の顧客がのぞむもの。
map (gizz . buzz . fizz) [1, 3, 5, 7, 15, 21, 35, 105] -- [1, "FIzz", "Buzz", "Gizz", "FizzBuzz", "FizzGizz", "BuzzGizz", "FizzBuzzGizz"] map (buzz . gizz . fizz) [1, 3, 5, 7, 15, 21, 35, 105] -- [1, "FIzz", "Buzz", "Gizz", "FizzBuzz", "FizzGizz", "GizzBuzz", "FizzGizzBuzz"]
- 258 名前:デフォルトの名無しさん mailto:sage [2012/04/13(金) 08:54:17.09 ]
- 整数と文字列が同じリストにフラットに入らなきゃ嫌だという主張?
- 259 名前:デフォルトの名無しさん mailto:sage [2012/04/13(金) 09:05:31.58 ]
- struct filter_t{ int e; const char *t; };
struct fizzbuzz_t { int in; std::string out; fizzbuzz_t &operator >>( filter_t &f ) { if( 0==in%f.e ){ out.append( f.t ); } return *this; } operator const char *() { if( out.length() ) return out.c_str(); static char tmp[50]; itoa( in, tmp, 10 ); return tmp; } }; fizzbuzz_t operator >>( int i, filter_t &f ){ fizzbuzz_t fb; fb.in = i; fb>>f; return fb; } filter_t fizz = { 3, "Fizz", }; filter_t buzz = { 5, "Buzz", }; filter_t gizz = { 7, "Gizz", }; int main(){ 105>>fizz>buzz>>gizz>>endfb; return 0; }
- 260 名前:デフォルトの名無しさん mailto:sage [2012/04/13(金) 09:05:55.65 ]
- fizz buzz gizz (とその合成)で完結する。
合成順が結果に反映される。 結果は標準出力ではなく関数の戻り値として欲しい。 というのが要件だろう。 関数縛りがなければマクロですぐなんだが。
- 261 名前:デフォルトの名無しさん mailto:sage [2012/04/13(金) 09:09:14.47 ]
- ごめんごめん途中で送信してしまった。
読まなくても良いくらいC++でのスタンダードな回答。 struct filter_t{ int e; const char *t; }; struct fizzbuzz_t { int in; std::string out; fizzbuzz_t &operator >>( filter_t &f ) { if( 0==in%f.e ){ out.append( f.t ); } return *this; } operator const char *() { if( out.length() ) return out.c_str(); static char tmp[50]; itoa( in, tmp, 10 ); return tmp; } }; fizzbuzz_t operator >>( int i, filter_t &f ){ fizzbuzz_t fb; fb.in = i; fb>>f; return fb; } filter_t fizz = { 3, "Fizz", }; filter_t buzz = { 5, "Buzz", }; filter_t gizz = { 7, "Gizz", }; int main(){ 105>>fizz>buzz>>gizz; return 0; }
- 262 名前:デフォルトの名無しさん mailto:sage [2012/04/13(金) 09:19:13.99 ]
- スタンダードっていうより姑息だな。(←褒め言葉)
とはいえ、関係ない演算子をしれっとまぎれこませちゃったら失格じゃまいか?
- 263 名前:デフォルトの名無しさん mailto:sage [2012/04/13(金) 09:30:20.96 ]
- >>260
マクロを使わなくても、型クラスと多値とモナドが賢い言語なら関数でも書けるんじゃね?
- 264 名前:デフォルトの名無しさん mailto:sage [2012/04/13(金) 09:49:06.63 ]
- >>257 map でそれをやれ、というのは無理。
それに hoge を追加することを想定して、 map (hoge . gizz . buzz . fizz) [1, 3, 5, 7, 15, 21, 35, 105] について考える。 関数合成と map の性質より、 map (f . g) [...] = map f (map g [...]) であるから map (hoge . gizz . buzz . fizz) [1, 3, 5, 7, 15, 21, 35, 105] = map hoge (map (gizz . buzz . fizz) [1, 3, 5, 7, 15, 21, 35, 105]) = map hoge [1, "FIzz", "Buzz", "Gizz", "FizzBuzz", "FizzGizz", "BuzzGizz", "FizzBuzzGizz"] よって hoge が書けない。===== 終 ===== 了 ===== -- という風に論破されちゃうのが嫌な自称上流には嫌われるだろうなぁ、 -- Haskell や形式手法はw
- 265 名前:デフォルトの名無しさん mailto:sage [2012/04/13(金) 10:04:19.47 ]
- メソッドの追加は副作用よりも難しい
代入しても型は不変だがメソッドを追加したら型が変わる
- 266 名前:デフォルトの名無しさん mailto:sage [2012/04/13(金) 10:10:13.95 ]
- マクロも型クラスも多値もモナドも無いけどSqueak Smalltalkで。
Trait named: #FizzBuzz uses: #() category: 'FizzBuzz-Trait' FizzBuzz >> fizzBuzzPrep self value isString ifFalse: [thisContext sender receiver: self -> '']. FizzBuzz >> fizzBuzzReturn | method nextByte type | method := thisContext sender sender method. nextByte := thisContext sender sender method at: thisContext sender sender pc. type := nextByte // 16. ^(type = 13 and: [FizzBuzz selectors includes: (method literalAt: nextByte \\ 16 + 1)]) ifTrue: [self] ifFalse: [self value ifEmpty: [self key]] FizzBuzz >> fizz self fizzBuzzPrep. (self key isDivisibleBy: 3) ifTrue: [self value: self value, 'Fizz']. ^self fizzBuzzReturn FizzBuzz >> buzz self fizzBuzzPrep. (self key isDivisibleBy: 5) ifTrue: [self value: self value, 'Buzz']. ^self fizzBuzzReturn FizzBuzz >> gizz self fizzBuzzPrep. (self key isDivisibleBy: 7) ifTrue: [self value: self value, 'Gizz']. ^self fizzBuzzReturn Integer uses: FizzBuzz. Association uses: FizzBuzz. 105 fizz gizz buzz. "=> 'FizzGizzBuzz' "
- 267 名前:デフォルトの名無しさん mailto:sage [2012/04/13(金) 10:18:03.23 ]
- >>256 は runFizzBuzz に渡す前までは文字列の蓄積で通してるから、
putStrLn を削るだけでリストになるんじゃね?
- 268 名前:デフォルトの名無しさん mailto:sage [2012/04/13(金) 10:45:33.86 ]
- 継続使える言語なら書けるんじゃね?
- 269 名前:デフォルトの名無しさん mailto:sage [2012/04/13(金) 11:19:14.13 ]
- Scheme使いの登場を待ってるわけ?
てか継続をどう使うことを想定してるの?
|

|