1 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/07(土) 21:26:47.61 ] 一般的には、オブジェクト指向型言語が優勢でが 一部には関数型言語を崇拝している人もいます どちらが上なのか、この際はっきりさせましょう 前スレ toro.2ch.net/test/read.cgi/tech/1331328955/
418 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 18:08:11.82 ] >>417 main { return ... } 部分をただのコードブロックとみせかけて 実は戻り値を変換しているという作戦だったのに、バレたか。
419 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 18:31:37.86 ] Smalltalkが流行らないように関数型メインは流行らないよ
420 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 18:34:04.58 ] ついに「流行らない」以外に縋るものがなくなっちゃったか
421 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 18:34:51.92 ] 副作用ありとは言え、唯一まともな解出しててF#△だったのに この期に及んで汚ないチートとかなにこのものすごい残尿感。
422 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 18:40:05.54 ] .NET発表時のHaskell.NETはどこに行ったんだよ?
423 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 18:43:46.95 ] マクロ使っていいならそもそも多値なんぞ使わんでも楽勝だろ。
424 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 18:47:39.47 ] FizzBuzzって流行ってるけど何が面白いの?
425 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 18:52:45.85 ] 低能はFizzBuzzすら書けないという事実が面白い
426 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 18:53:02.18 ] >>423 具体的にドーゾ
427 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 19:04:47.51 ] オープンクラスとか副作用有り等の 汚いコードだけが「合格」www 勝手に判定してる(コード書けない)バカのセンスが露呈してますな
428 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 19:05:21.22 ] >>423 perl書いたのオレなんだけれどもさ、その通りなんだよな…
429 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 19:08:10.88 ] C#とかも関数型言語のエッセンスを取り入れるけど すげえ無理矢理くさくて笑えるw 関数型がオブジェクト指向を取り入れるのはもっと自然なのに オブジェクト指向っていうかC系列はもう駄目なんだと思う
430 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 19:18:55.29 ] 守らなければならない資産がたくさんあるからな そりゃ無理やりくさくもなるさ
431 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 19:28:01.70 ] 後付で入れなきゃならなくなる時点で失敗だったはずなんだけどなぁ。 最近のC#の機能なんてC#以前から概念として存在してたはずなのに。 必要ないという当初の目論見は外れてるわけだ。 というか、資産っていうのはC風の構文そのものなんだよね・・・ C風じゃないとヤダヤダいう人が多すぎてD言語とかいちいち作られてる気がする。 C++、Java、C#、D言語 このへんは全て老害でしょ。
432 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 19:30:26.05 ] C#、D言語は設計に一貫した思想がないからアホっぽくなるのは仕方ない。
433 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 19:41:07.47 ] fizz 1 -- "1" fizz 3 -- "Fizz" buzz 5 -- "Buzz" buzz fizz 15 -- "FizzBuzz" だったらHaskellでも解ける?
434 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 19:45:23.42 ] 可変長引数とかさーー
435 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 19:50:00.84 ] >>431 C系列でまともなのはCだけ
436 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 19:50:26.06 ] >>433 型の不整合が生じるから無理
437 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 19:52:02.10 ] >>432 C#はどんどんダメな方向に向かってる気はするわー。
438 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 20:01:50.15 ] Javascriptは結構好きなのよん > C系文法族
439 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 20:11:47.98 ] >>406 >>303-304
440 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 20:19:32.18 ] >>431 後付で入れてもらったのがScala、Clojure、F#でしょ なんで後付を悪く言うのかな
441 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 20:41:24.35 ] C#は言語設計に一貫性がなく節操のないところが最大の魅力 偉い人にはそれがわからんのです
442 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 21:08:30.57 ] >>440 アホか それらは最初から関数型言語として作られてるでしょ。 関数型は糞、オブジェクト指向最高ってスタンスで作ってたはずのもんが なんで今更関数型の要素を入れようとするんだよ。
443 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 21:16:51.80 ] >>439 オーバーライドした toString() を println() に暗黙に呼ばせるとかいう 使い古されたチートをキメ顔で出してこられても…。 new myInteger(3).fizz() が "Fizz" を返せるとか少しは挑戦しようよ。
444 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 21:17:08.32 ] 「.Netファミリーに関数型言語入ったからC#でも使えるようにすっか!」 くらいのノリだろ。たぶん dynamic型導入したときもそんな感じだったし
445 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 21:18:37.55 ] いやC#の場合は「C#で〜が出来ないと言わせない」という一貫した姿勢があると思う。 もともとJavaへの嫉妬から始まった言語だし。
446 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 21:21:52.66 ] >>442 手続き型言語がまずあって、 そこへOOの機能を取り入れた。 こんどはさらに関数型の機能も取り入れようとしているだけ。
447 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 21:40:30.50 ] C#厨ってVB.NETをVB厨のための言語って馬鹿にしてたけど C#だってCっぽくないとヤダヤダっていう老害のために 無理矢理作ってるんだから全然人のこといえねーわ。 ラムダとかそんなに良いんならなんで最初から関数型言語使わないんだよw
448 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 21:46:15.09 ] >>442 > 関数型は糞、オブジェクト指向最高ってスタンスで作ってたはずのもんが > なんで今更関数型の要素を入れようとするんだよ。 オブジェクト指向最高はそうかもしれないが、 関数型は糞なんて言ってないだろ。 現実世界における物質(オブジェクト)に対応づけやすい 自然な発想に基づくオブジェクト指向。 そこに便利な関数型を取り入れただけ。 りんごの方程式とは何か?を考えれば オブジェクト指向と関数型の関係がわかるだろう。
449 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 21:48:54.81 ] C#作った奴らはvoidを型と思っていなかった。 だから、C#じゃクロージャ作るのに引数や戻り値にvoidがあると作れないw やるには予めデリゲートを定義しなきゃならん。 クロージャを使うのを考えさせられる。 ありえん。手軽さが全然ない。 F#はローカル変数(厳密には違うが)を定義するのもクロージャを定義するのも同じ手間しかかからない。 クロージャをバンバン使っていけるのでクロージャの応用もどんどん閃ける。 F#やった方がC#が上手くなるという現実。 C#はやればやるほど馬鹿になる言語。
450 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 21:50:04.90 ] 速度やメモリ・言語ごとの風習で最適かどうかは変わるのだろうけれど、 関数型でOOPをするときは、返り値として変更したオブジェクトを返すより、新たなオブジェクトを返したほうが関数型ぽいのかね?
451 名前: ◆QZaw55cn4c mailto:sage [2012/04/15(日) 21:51:05.55 ] >>447 F#のことも思い出してあげてください
452 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 21:59:08.45 ] 関数型言語でWindowsアプリを開発したいっつー需要がどれだけあるかだな
453 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 22:00:17.15 ] >>442 どちらが糞でどちらが最高かなんて、問い詰められても答えなくていいと思うんだが 沈黙が正解って小学生でも知ってる奴は知ってるだろ
454 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 22:54:52.02 ] >>443 >>443 がんばってみたんですが、糸口がみえてきません。もしよろしければアドバイスをいただけないでしょうか。 >new myInteger(3).fizz() が "Fizz" を返せる @ これは、「メソッド fizz() が副作用として "Fizz" を出力する」ということですか? この場合、fizz(), buzz(), gizz() を通過してきて 3 でも 5 でも 7 でもわりきれなかった場合に元の数字を出力する、ということが不可能だと思います。 >>303 では妥協して endl() というメソッドを準備してこの処理を行うしかありませんでした。 A それとも「メソッド fizz() の返り値が String("fizz") であるべき」ということですか? String にメソッド fizz() を追加したいのであれば、 String から新しいクラスmyString を継承して、そこにメソッドを定義するということだろうと思いますが、 (new myString(3).fizz() が myString("Fizz") を返す) A-1 java.lang.String は final。 A-2 メソッド fizz() が "Fizz" を返してしまうと、もとの String("3") を忘れてしまい、buzz(), gizz() が処理できない。多値を返したいのですが >>304 で精一杯。 >>304 の toString()#Object をオーバーライドする、ってこういうときには普通にすることだと思っていたんですが、何かまずい問題でもあるのでしょうか?
455 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 23:40:26.22 ] トイプログラムしか書かない奴は言語なんて何でもいいだろw
456 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 23:47:29.56 ] >>443 >>303 の方針でがんばってみました。gizz() は最後に置かなければならない、と決めうちすることにしました。 toro.2ch.net/test/read.cgi/tech/1313183984/194
457 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 23:49:17.32 ] 苦しいねぇ
458 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 23:50:41.61 ] >>454 > fizz() が "Fizz" を返してしまうと、もとの String("3") を忘れてしまい、buzz(), gizz() が処理できない その一見回避不可能な問題を解決する方法を考えるのがこのクイズがクイズたるゆえんです。 言語によっては型システムの制約によりどうやっても実現できないこともあります。
459 名前:デフォルトの名無しさん mailto:sage [2012/04/16(月) 00:02:21.18 ] >>450 関数型に限らず、GCのあるOOPLだと 属性変更をせずに新規オブジェクトをサクサク作るやり方も結構使うね
460 名前:デフォルトの名無しさん mailto:sage [2012/04/16(月) 00:45:51.08 ] >>454 >>341 の方法(元の数値をどこかにメモしておいて適宜参照)はJavaでも使えます。
461 名前:デフォルトの名無しさん mailto:sage [2012/04/16(月) 01:11:55.59 ] >>458 OOとPFの言語比較としてこのようなクイズを出したのは、 どのような観点からこれら両者のパラダイムの優劣を比較しようとしたのか 聞きたい
462 名前:デフォルトの名無しさん mailto:sage [2012/04/16(月) 01:13:44.79 ] もうこのお題はcloseでいいんじゃないの? このクイズではせっかくの労力を生産的でないことに費やしている
463 名前:デフォルトの名無しさん mailto:sage [2012/04/16(月) 01:30:58.12 ] >>462 クイズなんかそんなもんだろ。しょせん暇つぶし。 つーか、こんな程度のクイズ解くのに「労力」なんか大仰なもん必要か?
464 名前:デフォルトの名無しさん mailto:sage [2012/04/16(月) 01:38:59.77 ] このクイズのくだらなさはかなり問題。
465 名前:デフォルトの名無しさん mailto:sage [2012/04/16(月) 01:48:07.75 ] くやしいのうw
466 名前:デフォルトの名無しさん mailto:sage [2012/04/16(月) 02:07:04.82 ] 全然くやしくないぜよ。perlでobjectのnew版も多値版もさらりと書いた。 tieとマクロ使ったのも書こうと思ったけれど手間がもったいなくなってやめた。 パラダイム比較としてもうすこし書く値打ちのあるテーマ出せよ、 このクイズじゃ再帰は使いどころないし javaのnewだめ静的型システムダメ 何を有利に誘導したいんだか せめて前スレのpermutationレベルのテーマを出題の下限レベルとしてクレヨ
467 名前:466 mailto:sage [2012/04/16(月) 02:18:35.03 ] 大体fizz buzzってのが下らないんだよ プログラムプロムナード、ナノピコ教室、Cマガ課題、オイラー4、AIアルゴリズム、OR最適化、 パーサ、マッチング、グラフ問題あたりの 小問題で再帰・高階/部分適用、遅延・カーリー化vsOOの比較できる題材が妥当かもな step数は2chの1レスに収まるくらいの小問題でいいからサ
468 名前:466 mailto:sage [2012/04/16(月) 02:26:58.99 ] 最悪、基本アルゴリズムの再実装でもいいや たとえばqsortはperlやhaskellでpivotを適当に選択して再帰した短いコードと pivot選択くどくど頑張ったCやjavaの長いコード比較してファンクショナルの再帰はマンセーみたいな サイトがあちこちにあるだろ、 あのレベルでも今回のFizzBuzzGizzよりましだろ
469 名前:466 mailto:sage [2012/04/16(月) 02:35:35.13 ] あと、言い出しっぺの法則はナシだぞw
470 名前:466 mailto:sage [2012/04/16(月) 02:44:04.67 ] つか、OOとPFの単純比較って何か意味あるのか? どのみち記述する言語の特徴または弱点、癖の比較レベルの議論に落ちがちな稀ガス ズット前スレでヨンだが、意味論的にはOOとPFは相容れない物らしい しかし生々しい実装レベルではいまんとこ清濁併せ呑んで実現するし まあいいや寝るか。ノシ
471 名前:デフォルトの名無しさん mailto:sage [2012/04/16(月) 02:46:25.77 ] 多値使うアイデアはイケてたはずなのに、仕上げの文字列との結合やprintとの併用で ズル呼ばわりされるわ、Rubyの>>377 の挙動も再現できなかったしで散々だったしね。
472 名前:デフォルトの名無しさん mailto:sage [2012/04/16(月) 02:53:06.66 ] なぜかC++で挑み続ける俺。 これ以上C++では無理かも。0xだと知らんが。 template< int e, unsigned t > struct fizzbuzz { int in; std::string out; fizzbuzz( int i ):in( i ){ init(); } template< int e2, unsigned t2 > fizzbuzz( const fizzbuzz< e2, t2 > &r ) :in( r.in ),out( r.out ){ init(); } void init(){ if( in%e ) return; unsigned tmp=t; out.append( (char*)&tmp, 4 ); } operator const char *(){ return out.c_str(); } operator int(){ return in; } }; typedef fizzbuzz< 3, 'zziF' > fizz; typedef fizzbuzz< 5, 'zzuB' > buzz; typedef fizzbuzz< 7, 'zziG' > gizz; int main() { int i = (gizz)(buzz)(fizz)1; std::string t = (gizz)(buzz)(fizz)15; std::string u = (gizz)(buzz)(fizz)105; std::string v = gizz((buzz(fizz(105)))); //こうも書けるね return 0; }
473 名前:466 mailto:sage [2012/04/16(月) 02:54:29.65 ] >>471 あれはね最初に書いたnewはだめって言われて仕方なくの面はあるのよ $scalar = 関数(関数 と明示的にscalarで主値だけを受けとるように明示するのがホントは作法なんだ。 Rubyの>>377 に関しては読んでなかったから挙動の再現にそもそも着手してないよ。 rubyは文法がかなりカオスになって来ちゃって残念だね
474 名前:466 mailto:sage [2012/04/16(月) 02:59:22.51 ] fizzbuzzgizzはいいんだどうでも。 それより前スレのpermutaion perl版はwebなど参照せず一から考えて書いて オレなりに結構な自信作だったのに なんの反応もなかったことの方が寂しかったな
475 名前:デフォルトの名無しさん mailto:sage [2012/04/16(月) 03:19:21.92 ] 何このスレ
476 名前:デフォルトの名無しさん mailto:sage [2012/04/16(月) 06:20:08.75 ] ruby無双をしたかった奴が、もっとエレガントな解を他言語で出されて、 涙目でdisるスレです
477 名前:デフォルトの名無しさん mailto:sage [2012/04/16(月) 06:53:26.91 ] Rubyと違う解法が出る度に 必死に難癖付けてて笑ったわww
478 名前:デフォルトの名無しさん mailto:sage [2012/04/16(月) 08:13:17.85 ] 頭が固くて馬鹿だから 数や文字列に状態持たせる以外の方法が 理解できないんだろう
479 名前:デフォルトの名無しさん mailto:sage [2012/04/16(月) 08:32:48.03 ] 頭が固くて馬鹿だから 数や文字列に状態持たせる方法が 許容できないんだろう
480 名前:デフォルトの名無しさん mailto:sage [2012/04/16(月) 08:38:53.99 ] 世の中は状態がある世界なのにねw
481 名前:デフォルトの名無しさん mailto:sage [2012/04/16(月) 08:50:48.96 ] じゃあFixnumのインスタンスに特異メソッド定義してみろRuby厨
482 名前:デフォルトの名無しさん mailto:sage [2012/04/16(月) 09:44:46.42 ] 元ネタのCLのEQLスペシャライザならそういうことできたよな。 Haskellとかでコンストラクタ無しで1以外の引数をとるとコンパイル時に 型エラーになる関数って定義できたっけ?
483 名前:デフォルトの名無しさん mailto:sage [2012/04/16(月) 10:00:08.87 ] template< int n > void func(){int i="";} template<> void func<1>(){} ・・・ func<2>();//エラー
484 名前:デフォルトの名無しさん mailto:sage [2012/04/16(月) 12:34:04.90 ] > cat FooTH.hs {-# LANGUAGE TemplateHaskell #-} module FooTH where import Language.Haskell.TH foo 1 = [| 1 |] foo _ = error "" > cat Main.hs {-# LANGUAGE TemplateHaskell #-} import FooTH main = print $(foo 1) -- foo 2 に変えるとコンパイルエラー
485 名前:デフォルトの名無しさん mailto:sage [2012/04/16(月) 12:50:08.98 ] >>474 あれ覚えてるよ、実は感心してた ていうか、このスレでPerlの評価が結構変わったよ(もちろん高い方へ) でも、読み易さ優先で書いてあれとは Perl使いとは分かり合えないな...と思ったけどw
486 名前:デフォルトの名無しさん mailto:sage [2012/04/16(月) 20:25:48.62 ] >>479 許容はしてるだろう エレガントさから程遠いと言ってるだけで
487 名前:デフォルトの名無しさん mailto:sage [2012/04/16(月) 22:19:41.52 ] 俺の基準における エレガントってやつかw
488 名前:285 mailto:sage [2012/04/17(火) 00:46:48.85 ] 正直、あの問題は無いと思うよ 問題があれだし書き捨てだからやったが、実際には絶対にやりたくないな
489 名前:デフォルトの名無しさん mailto:sage [2012/04/17(火) 00:47:44.00 ] >>487 FizzBuzzすら書けない口だけ野郎の基準よりマシだろwww お前はこのスレでは最底辺のカスなんだから敬語使えw
490 名前:デフォルトの名無しさん mailto:sage [2012/04/17(火) 00:53:04.36 ] >>481 ぶっちゃけ>>479 のバカが理解できたのが たまたまRubyのコードだっただけでRuby厨ですらねーと思うぜ むしろバカにクソコード褒められてRuby可哀想ってなもんだ
491 名前:デフォルトの名無しさん mailto:sage [2012/04/17(火) 00:59:54.74 ] あの問題出したのぶっちゃけPython使いだと思う(陰謀説)
492 名前:466 mailto:sage [2012/04/17(火) 01:35:17.45 ] >>491 アレは学部・卒研レベルの課題をここに投げたのかなーと オレは感じた。(真相はシラネ) もしかしてオレ様はボクちゃんに利用されたのかなとww
493 名前:デフォルトの名無しさん mailto:sage [2012/04/17(火) 10:56:11.26 ] F#のスレッドローカル(有り体にはグローバル変数)と同様の方法でSqueak Smalltalkの解。 オープンクラスは使わずにブロック(無名関数)で。 | fb fizz buzz gizz | fb := [:x :cond :str | | p n | p := Processor activeProcess. (x isKindOf: Integer) ifTrue: [p instVarNamed: #env put: (n := x). x := ''] ifFalse: [n := p instVarNamed: #env]. (cond value: n) ifTrue: [x, str] ifFalse: [x ifEmpty: [n]]]. fizz := [:x | fb value: x value: [:n | n isDivisibleBy: 3] value: 'Fizz' ]. buzz := [:x | fb value: x value: [:n | n isDivisibleBy: 5] value: 'Buzz']. gizz := [:x | fb value: x value: [:n | n isDivisibleBy: 7] value: 'Gizz']. self assert: (fizz value: 1) = 1. self assert: (fizz value: 3) = 'Fizz'. self assert: (buzz value: (fizz value: 1)) = 1. self assert: (buzz value: (fizz value: 3)) = 'Fizz'. self assert: (buzz value: (fizz value: 5)) = 'Buzz'. self assert: (buzz value: (fizz value: 15)) = 'FizzBuzz'. self assert: (gizz value: (buzz value: (fizz value: 105))) = 'FizzBuzzGizz'. self assert: (buzz value: (gizz value: (fizz value: 105))) = 'FizzGizzBuzz'.
494 名前:デフォルトの名無しさん mailto:sage [2012/04/17(火) 12:02:41.83 ] >>493 Pythonも同じ方針のやつ import threading fbdata = threading.local() def fb(x, cnd, msg): if isinstance(x, int): fbdata.m = n = x s = "" else: n = fbdata.m s = x if cnd(n): return s + msg elif s <> "": return s else: return n def fizz(n): return fb(n, lambda n: n%3==0, "Fizz") def buzz(n): return fb(n, lambda n: n%5==0, "Buzz") def gizz(n): return fb(n, lambda n: n%7==0, "Gizz") assert fizz(1) == 1 assert fizz(3) == "Fizz" assert buzz(fizz(1)) == 1 assert buzz(fizz(3)) == "Fizz" assert buzz(fizz(5)) == "Buzz" assert buzz(fizz(15)) == "FizzBuzz" assert gizz(buzz(fizz(105))) == "FizzBuzzGizz" assert buzz(gizz(fizz(105))) == "FizzGizzBuzz"
495 名前:デフォルトの名無しさん mailto:sage [2012/04/18(水) 13:10:30.34 ] っていうか問題どこだよ
496 名前:デフォルトの名無しさん mailto:sage [2012/04/18(水) 13:31:40.56 ] スレタイに惹かれて開いたけどゴミスレだった・・・
497 名前:デフォルトの名無しさん mailto:sage [2012/04/19(木) 02:49:08.33 ] $t = sub { my $f = shift; sub { my $x = shift; $f->($f->($x)) } }; $rst = $t->($t)->($t)->($t)->( sub{ my $x = shift; $x + 1 })->(0); print $rst, "\n";
498 名前:デフォルトの名無しさん mailto:sage [2012/04/19(木) 09:02:56.87 ] 同じくRubyも。 ケチがついた、オープンクラス、メソッドチェーン、リフレクションは無しで require 'test/unit' def fb(x, cnd, msg) th = Thread.current x.kind_of?(Integer) ? (th[:m] = n = x; s = "") : (n = th[:m]; s = x) cnd[n] ? s + msg : !s.empty? ? s : n end def fizz(n); fb(n, proc{ |n| n%3==0 }, "Fizz") end def buzz(n); fb(n, proc{ |n| n%5==0 }, "Buzz") end def gizz(n); fb(n, proc{ |n| n%7==0}, "Gizz") end class FizzBuzzQuizTest < Test::Unit::TestCase def test_fbq assert_equal( fizz(1), 1 ) assert_equal( fizz(3), "Fizz" ) assert_equal( buzz(fizz(1)), 1 ) assert_equal( buzz(fizz(3)), "Fizz" ) assert_equal( buzz(fizz(5)), "Buzz" ) assert_equal( buzz(fizz(15)), "FizzBuzz" ) assert_equal( gizz(buzz(fizz(105))), "FizzBuzzGizz" ) assert_equal( buzz(gizz(fizz(105))), "FizzGizzBuzz" ) end end
499 名前:デフォルトの名無しさん mailto:sage [2012/04/19(木) 09:53:30.31 ] リフレクションやらスレッドローカルやら組み込みクラス汚染やら使った クソみたいな実装が出てくる出題だったけど 言語比較に役立つ何かは得られましたか?
500 名前:デフォルトの名無しさん mailto:sage [2012/04/19(木) 10:07:54.14 ] あるときは数値またあるときは文字列を返すような関数は 動的型であれ作るもんじゃないという幼稚園児並みの洞察が得られました
501 名前:デフォルトの名無しさん mailto:sage [2012/04/19(木) 10:43:06.55 ] >>499 「数値と文字列の組」と「数値または文字列」の違いが不明瞭だった。 リフレクションや継承で二つのクラスを一組にしたいのか、 それとも一つのクラスを数種類に分けたいのか明示されていなかった。
502 名前:デフォルトの名無しさん mailto:sage [2012/04/19(木) 10:53:45.22 ] どうしてもスレッドローカル変数が必要になったとき 関数的にはどう記述したらいいのかよかったら教えてください。
503 名前:デフォルトの名無しさん mailto:sage [2012/04/19(木) 11:37:33.00 ] そもそもスレッド自体が処理系に依存した、言語パラダイムとは関係ない概念だから、 関数型的にもオブジェクト指向的にも、どう記述したらいいかとか答えようがない。
504 名前:デフォルトの名無しさん mailto:sage [2012/04/19(木) 12:23:49.22 ] Readerモナドでグローバル変数っぽいことをするには どうすればいいのでしょうか。たとえば、状態をfizzとかbuzzから (引数として渡すことなしに)参照したり更新したりしたいのです。
505 名前:デフォルトの名無しさん mailto:sage [2012/04/19(木) 12:50:34.08 ] ttp://www.haskell.org/haskellwiki/Thread-local_storage いまんとこHaskellからTLSを使う、「これ」といった定番はないようだ
506 名前:デフォルトの名無しさん mailto:sage [2012/04/19(木) 12:58:07.14 ] 個人的に、関数型でスレッドとかハードに近い領域の制御はしたくないな。
507 名前:デフォルトの名無しさん mailto:sage [2012/04/19(木) 13:20:53.20 ] >>504 それは基本的にStateモナドの領域。 Readerモナドの中で、さらにサブルーチン的に他のReaderモナドを呼び出す時に、 一時的に書き換えたように見せかけたい、っていう場合ならばlocal関数が使えるけど。 Readerモナドで更新したいって、読み取り専用変数に書き込みたいって言ってるのと同じ事なのはわかってるよな…?
508 名前:デフォルトの名無しさん mailto:sage [2012/04/19(木) 17:54:57.76 ] Reader (s -> a) -> (a -> s -> b) -> s -> b Writer (a,s) -> (a -> (b,s)) -> (b,s) State (s -> (a,s)) -> (a -> s -> (b,s)) -> s -> (b,s)
509 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 11:54:43.80 ] >>500 あるときは a またあるときは m a m a -> (a -> m b) -> m b
510 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 17:52:20.76 ] なんつーか、FizzBuzzしたいんならHQ9F+使えばいんじゃね?
511 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 22:29:27.34 ] お題出していい?
512 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 22:55:07.28 ] ・コンソール上で動く、カード(つーてもただの数字を表示するだけだが)を使ったミニゲーム ・1〜9のカードを各4枚ずつ用意、それをシャッフルして「ストック」とする ・ストックから7枚のカードを引く ・引いたカードの中から、プレイヤーは合計が15になるように数枚を選んで捨てる (選ばせ方はプログラマが考える、ギブアップ手段も用意) ・捨てなかったカードと合わせて再び7枚になるか、もしくはストックが空になるまでストックからカードを引く ・また15になるように捨てる ・引いては捨ててを繰り返し、ストックと手札が共に空になったらおめでとう的な言葉を吐いて終了
513 名前:デフォルトの名無しさん mailto:sage [2012/04/20(金) 23:16:37.51 ] つまらない。
514 名前:デフォルトの名無しさん mailto:sage [2012/04/21(土) 01:27:35.30 ] >>512 Squeak Smalltalk で。 | ui stock player | ui := UIManager default. stock := (1 to: 9) gather: [:each | Array new: 4 withAll: each]. stock := stock shuffled asOrderedCollection. player := (stock removeFirst: 7) asOrderedCollection. [ | choice | [ | input | input := ui request: player asSortedArray asString, 'から合計が15になるようにチョイス'. choice := input subStrings collect: #asInteger. choice ifEmpty: [(ui confirm: 'ギブアップ?') ifTrue: [^self] ifFalse: [choice := {nil}]]. (choice allSatisfy: #isInteger) and: [choice sum = 15] and: (player includesAllOf: choice) and: [choice asSet allSatisfy: [:card | (player occurrencesOf: card) >= (choice occurrencesOf: card)]] ] whileFalse. player removeAll: choice. player addAll: (stock removeFirst: (choice size min: stock size)). player notEmpty] whileTrue. ui inform: 'おめでとう!'
515 名前:デフォルトの名無しさん mailto:sage [2012/04/21(土) 02:46:31.71 ] >>514 なぜこの人は今どきSmalltalkの末裔を使っているのか理由をうかがいたいので おしえてくださいです
516 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 01:52:01.88 ] # Ruby版、指定は半角空白区切り、EOFでギブアップ class CardNotFoundException < RuntimeError; end def remove_cards(specs, tableau) specs.each do |spec| if idx = tableau.find_index{|card| card == spec } then tableau.delete_at idx else raise CardNotFoundException.new(spec.to_s) end end end stock = ((1..9).to_a * 4).shuffle tableau = [] until tableau.empty? && stock.empty? tableau.push stock.pop until tableau.size >= 7 || stock.empty? printf "stock=%d tableau=%p\n? ", stock.size, tableau k = gets or exit specs = k.chomp.split(' ').map{|s| s == 'giveup' ? exit : s.to_i } begin remove_cards specs,tableau.dup if (total = specs.inject{|result,n| result + n }) == 15 then remove_cards specs,tableau else puts "total(#{total}) not equal to 15" end rescue CardNotFoundException => e puts "not found `#{e}'." end end puts 'Congraturations !'
517 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 02:31:25.32 ] >>514 をRubyに翻訳してみた版 stock = ([*1..9]*4).shuffle player = stock.shift(7) loop do choice = nil loop do puts player.sort.inspect + "から合計が15になるようにチョイス" choice = gets.split(/[, ]/).map(&:to_i) choice.delete(0) if choice.empty? puts "ギブアップ?[Y/n]" !(gets=="n\n") ? exit : choice = [0] end break if choice.all?(&:integer?) and choice.reduce(&:+) == 15 and choice.uniq.all?{ |card| player.count(card) >= choice.count(card) } end choice.each{ |e| player.delete_at(player.index(e)) } player += stock.shift([choice.size, stock.size].min) break if player.empty? end puts "おめでとう!"
518 名前:デフォルトの名無しさん mailto:sage [2012/04/22(日) 12:27:13.72 ] Squeakは入れたことあるが(てか今も入ってるけど)何をどうしたらいいのか判らん >>514 のコードをどこに入力して、どう実行したら動くんだ?