1 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/07(土) 21:26:47.61 ] 一般的には、オブジェクト指向型言語が優勢でが 一部には関数型言語を崇拝している人もいます どちらが上なのか、この際はっきりさせましょう 前スレ toro.2ch.net/test/read.cgi/tech/1331328955/
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使いの登場を待ってるわけ? てか継続をどう使うことを想定してるの?
270 名前:デフォルトの名無しさん mailto:sage [2012/04/13(金) 12:38:39.46 ] join fs n = case concatMap (\f -> f n) fs of "" -> Left n s -> Right s fizzT f s n | f n == 0 = s fizzT _ _ _ | otherwise = "" fizz = fizzT (`mod` 3) "Fizz" buzz = fizzT (`mod` 5) "Buzz" gizz = fizzT (`mod` 7) "Gizz" main = print $ join [fizz, buzz, gizz] 105
271 名前:デフォルトの名無しさん mailto:sage [2012/04/13(金) 12:50:09.96 ] こっちのほうが join を入れ子に出来て良いかも import Data.Either join fs n = case concat $ rights $ map (\f -> f n) fs of "" -> Left n s -> Right s fizzT f s n | f n == 0 = Right s fizzT _ _ _ | otherwise = Right "" fizz = fizzT (`mod` 3) "Fizz" buzz = fizzT (`mod` 5) "Buzz" gizz = fizzT (`mod` 7) "Gizz" main = print $ join [join [fizz, buzz], gizz] 105
272 名前:デフォルトの名無しさん mailto:sage [2012/04/13(金) 13:14:50.14 ] join とか無しで gizz buzz fizz 105 で "FizzBuzzGizz" をさくっと返す方法はないの?
273 名前:デフォルトの名無しさん mailto:sage [2012/04/13(金) 13:43:15.17 ] ここまでruby/python無し LLに有利っぽいのに
274 名前:デフォルトの名無しさん mailto:sage [2012/04/13(金) 13:43:49.58 ] gizz buzz fizz 105 という式が、ちゃんと型を持っているとする。 また、fizz 105、buzz fizz 105 という式も、同様になんらかの型を持つとする。 すると、 fizz の型は Int -> a buzz の型は (Int -> a) -> Int -> b gizz の型は ((Int -> a) -> Int -> b) -> (Int -> a) -> Int -> c というような型でなければならない。無理。というか、どう頑張っても、 先頭に do か何かが要る。
275 名前:デフォルトの名無しさん mailto:sage [2012/04/13(金) 13:56:46.55 ] 型システムに制約を受けないパワフルな関数型言語ってのはないもんかね。
276 名前:デフォルトの名無しさん mailto:sage [2012/04/13(金) 14:00:17.79 ] Perlしか読めないから誰かPerlで書いて
277 名前:デフォルトの名無しさん mailto:sage [2012/04/13(金) 14:04:41.69 ] >>275 Erlang ?
278 名前:デフォルトの名無しさん mailto:sage [2012/04/13(金) 14:24:54.40 ] >>273 つーか元出題者が Ruby だとオープンクラスやらなんやら使ってできるぜ、 って言いたいだけで作った問題なのがかなり見え見えなんだが。
279 名前:デフォルトの名無しさん mailto:sage [2012/04/13(金) 15:57:16.91 ] 書き込み行数がオーバーするんで適当に圧縮した module FizzBuzz SYM_HASH = {} ; def self.add_fizz sym, n ; SYM_HASH[sym] = n ; end def self.do_it sym, n, prefix ; if m = SYM_HASH[sym] if n % m == 0 s = sym.to_s ; s.capitalize! if prefix.kind_of? String then s[0, 0] = prefix end s.fizzbuzzval = n ; s else prefix end else nil end end end class Integer ; def method_missing sym if it = FizzBuzz.do_it(sym, self, self) then it else super end end end class String ; attr_writer :fizzbuzzval ; def method_missing sym if it = FizzBuzz.do_it(sym, @fizzbuzzval, self) then it else super end end end FizzBuzz.add_fizz :fizz, 3 FizzBuzz.add_fizz :buzz, 5 FizzBuzz.add_fizz :gizz, 7 p [1, 3, 5, 7, 15, 21, 35, 105].map{|n|n.fizz.buzz.gizz}
280 名前:デフォルトの名無しさん mailto:sage [2012/04/13(金) 16:17:23.17 ] >>276 突貫工事だけれど… package FizzBuzzGizz; sub new { my ($c, $n) = @_; bless {n => $n, s => ''}, $c } sub fizz {my $t = shift; $t->{s} .= 'Fizz' if 0 == $t->{n} % 3; $t} sub buzz {my $t = shift; $t->{s} .= 'Buzz' if 0 == $t->{n} % 5; $t} sub gizz {my $t = shift; $t->{s} .= 'Gizz' if 0 == $t->{n} % 7; $t} sub result {my $t = shift; $t->{s} ? $t->{s} : $t->{n}} 1; package main; do { my $fbg = new FizzBuzzGizz($_); print "$_:" . FizzBuzzGizz::result($fbg->fizz->buzz->gizz) . "\n" # あるいは print "$_:" . $fbg->fizz->buzz->gizz->result . "\n" } for qw{1 3 5 7 15 21 35 105}; $ perl p_fizzBuzzGizz.pl 1:1 3:Fizz 5:Buzz 7:Gizz 15:FizzBuzz 21:FizzGizz 35:BuzzGizz 105:FizzBuzzGizz
281 名前:デフォルトの名無しさん mailto:sage [2012/04/13(金) 16:22:11.22 ] >>280 objectのmethodが返す値はまたobjectだけれど、 printで評価すると判定結果文字列を返すには、 こんな書き方くらいしかないのかな…? 多値のリスト返しでやってみようと思ったけれどうまい方法が思いつかなかったぜよ
282 名前:デフォルトの名無しさん mailto:sage [2012/04/13(金) 17:12:42.66 ] >>281 package FizzBuzzGizz; sub new { my ($c, $n) = @_; bless \"$n." } sub fizz {my $t=shift; $_=$$t; bless do { /(^\d+)/; 0 == $1 % 3 ? \"${_}Fizz": $t }} sub buzz {my $t=shift; $_=$$t; bless do { /(^\d+)/; 0 == $1 % 5 ? \"${_}Buzz": $t }} sub gizz {my $t=shift; $_=$$t; bless do { /(^\d+)/; 0 == $1 % 7 ? \"${_}Gizz": $t }} 1; package main; do { my $fbg = new FizzBuzzGizz($_); print ${$fbg->fizz->buzz->gizz} . "\n" } for qw{1 3 5 7 15 21 35 105};
283 名前:デフォルトの名無しさん mailto:sage [2012/04/13(金) 17:29:05.85 ] >>272 何縛りのゲームなのかわからんけど、関数合成演算子でも駄目かね? import Data.Either import Prelude hiding ((.)) (.) f g n = case concat $ rights [f n, g n] of [] -> Left n s -> Right s fizzT f s n | f n == 0 = Right s fizzT _ _ _ | otherwise = Right [] fizz = fizzT (`mod` 3) "Fizz" buzz = fizzT (`mod` 5) "Buzz" gizz = fizzT (`mod` 7) "Gizz" main = print $ fizz.buzz.gizz $ 105
284 名前:デフォルトの名無しさん mailto:sage [2012/04/13(金) 17:30:10.61 ] >>282 package FizzBuzzGizz; sub new { my ($c, $n) = @_; bless \"$n." } sub comm { my ($t, $r, $s) = @_; $$t =~ /(^\d+)/; 0 == $1 % $r ? \"${_}$s": $t } sub fizz {bless comm((shift), 3, 'Fizz')} sub buzz {bless comm((shift), 5, 'Buzz')} sub gizz {bless comm((shift), 7, 'Gizz')} 1; package main; for (qw(1 3 5 7 15 21 35 105)) { print ${new FizzBuzzGizz($_)->fizz->buzz->gizz} . "\n" }
285 名前:デフォルトの名無しさん mailto:sage [2012/04/13(金) 17:31:15.65 ] Ruby のカオスな部分を前面に押し出して書いてみた class String attr_accessor :srcint private def f(n,s); (@srcint % n == 0) ? (self << s) : (self); end end class Integer private def f(n,s); (self % n == 0) ? (s.srcint = self; s) : (self); end end class Object def fizz; f(3,'Fizz'); end def buzz; f(5,'Buzz'); end def gizz; f(7,'Gizz'); end end p [1,3,5,7,15,21,35,105].map{|n| n.fizz.buzz.gizz } # => [1, "Fizz", "Buzz", "Gizz", "FizzBuzz", "FizzGizz", "BuzzGizz", "FizzBuzzGizz"] p [1,3,5,7,15,21,35,105].map{|n| n.fizz.gizz.buzz } # => [1, "Fizz", "Buzz", "Gizz", "FizzBuzz", "FizzGizz", "GizzBuzz", "FizzGizzBuzz"]
286 名前:デフォルトの名無しさん mailto:sage [2012/04/13(金) 17:33:52.32 ] >>284 ${_}$s←バグ package FizzBuzzGizz; sub new { my ($c, $n) = @_; bless \"$n." } sub comm { my ($t, $r, $s) = @_; 0 == $$t % $r ? \"$${t}$s": $t } sub fizz {bless comm((shift), 3, 'Fizz')} sub buzz {bless comm((shift), 5, 'Buzz')} sub gizz {bless comm((shift), 7, 'Gizz')} 1; package main; for (qw(1 3 5 7 15 21 35 105)) { print ${new FizzBuzzGizz($_)->fizz->buzz->gizz} . "\n" }
287 名前:デフォルトの名無しさん mailto:sage [2012/04/13(金) 17:45:43.30 ] >>286 オッチャン、どうせ書くならこうやろ package FizzBuzzGizz; sub new { my ($c, $n) = @_; bless \"$n." } sub com { my ($t, $m, $s) = @_; bless 0 == $$t % $m ? \($$t.$s): $t } sub fizz {com(shift, 3, 'Fizz')} sub buzz {com(shift, 5, 'Buzz')} sub gizz {com(shift, 7, 'Gizz')} 1; package main; for (qw(1 3 5 7 15 21 35 105)) { print ${new FizzBuzzGizz($_)->fizz->buzz->gizz} . "\n" } 大差ないか…
288 名前:デフォルトの名無しさん mailto:sage [2012/04/13(金) 17:54:12.60 ] new FizzBuzzGizz($_) している時点でダメだろ。
289 名前:デフォルトの名無しさん mailto:sage [2012/04/13(金) 17:58:22.56 ] >>288 え?なぜ?
290 名前:デフォルトの名無しさん mailto:sage [2012/04/13(金) 18:10:15.39 ] 関係ないオブジェクトにもfizz buzz gizzが継承されてしまう気持ち悪さを除けば、 ちゃんと書けているのは今のところRubyだけって感じか。 文字列オブジェクトにインスタンス変数(状態)を持たせられるのが強みだなぁ。 Smalltalkのはやってることが「独立した関数(メソッド)」と呼ぶにはどーよという内容だから失格。 関数型は型システムの制約でこういう仕様の関数モドキは書けないっていうことでFA?
291 名前:デフォルトの名無しさん mailto:sage [2012/04/13(金) 18:22:32.06 ] >>290 でも実際のところ、こんな書き方したくないけどね 実際にやるなら、何らかのコンテナにラップしてからmapして それが終わったら、文字列や数値として取り出すと思う 原文がいきなり数値に対してメソッド呼んでるから、容赦なく組み込みクラスを弄ったが…
292 名前:デフォルトの名無しさん mailto:sage [2012/04/13(金) 18:30:51.94 ] JSならやれそうじゃね?
293 名前:デフォルトの名無しさん mailto:sage [2012/04/13(金) 18:33:45.54 ] >>291 まあクイズだからね。言語機能をどう使って無茶な要件をクリアするかのパズルみたいなもん。
294 名前:デフォルトの名無しさん mailto:sage [2012/04/13(金) 18:35:01.97 ] >>292 まずコード出せ。話はそれからだ。
295 名前:デフォルトの名無しさん mailto:sage [2012/04/13(金) 18:57:18.70 ] 数値がobjectとしてmethodを持たない言語ではどうするかってお題だったのかよ…
296 名前:デフォルトの名無しさん mailto:sage [2012/04/13(金) 19:00:25.49 ] >>290 自分の足を自分で撃ちたいなら、それに向いた言語ある、という話、でFA
297 名前:デフォルトの名無しさん mailto:sage [2012/04/13(金) 19:35:12.73 ] >>290 RubyはメソッドチェインOKなのに 関数型言語はfizz(buzz(gizz))しか認めないんだろ? そりゃ静的型じゃ無理っつーか制限する意味が分からん 後からgizz等を追加できる拡張性あるコードを 書けないならともかく、そうでもないしな
298 名前:デフォルトの名無しさん mailto:sage [2012/04/13(金) 19:40:42.95 ] >文字列オブジェクトにインスタンス変数(状態)を持たせられるのが強みだなぁ。 -- String "has-a" Integer data HasA = HasA String Integer instance Show HasA where show (HasA s n) = if s == "" then show n else show s fizz (HasA s n) = HasA (s ++ if mod n 3 == 0 then "Fizz" else "") n buzz (HasA s n) = HasA (s ++ if mod n 5 == 0 then "Buzz" else "") n gizz (HasA s n) = HasA (s ++ if mod n 7 == 0 then "Gizz" else "") n main = print $ map (gizz . buzz . fizz . HasA "") [1,3,5,7,15,21,35,105]
299 名前:デフォルトの名無しさん mailto:sage [2012/04/13(金) 19:47:44.31 ] >>298 似たようなコード書いてたら先に張られてた 個人的には hasA = HasA "" を定義しておくのが好み それはともかく、.演算子使ってるからケチ付けられると思うぜ多分w
300 名前:デフォルトの名無しさん mailto:sage [2012/04/13(金) 19:56:22.62 ] >>294 おまえはどれかのコード書いたの?