【激突】関数型言語 VS オブジェクト指向言語2
■ このスレッドは過去ログ倉庫に格納されています
0001営利利用に関するLR審議中@詳細は自治スレへ
2012/04/07(土) 21:26:47.61一部には関数型言語を崇拝している人もいます
どちらが上なのか、この際はっきりさせましょう
前スレ http://toro.2ch.net/test/read.cgi/tech/1331328955/
0160営利利用に関するLR審議中@詳細は自治スレへ
2012/04/09(月) 20:57:58.20OO感→OO観
0161営利利用に関するLR審議中@詳細は自治スレへ
2012/04/09(月) 20:57:59.82オブジェクト指向を取り入れる方向で進化してるよね。
0162営利利用に関するLR審議中@詳細は自治スレへ
2012/04/09(月) 20:59:11.07parottはなかろう…
0163営利利用に関するLR審議中@詳細は自治スレへ
2012/04/09(月) 21:00:32.51関数型言語の利点を取り入れ、
関数型言語はそれだけではアプリを作りにくと
現実的な選択肢としてオブジェクト指向を取り入れる。
0164営利利用に関するLR審議中@詳細は自治スレへ
2012/04/09(月) 21:01:15.18最近楽しいなと思うのは10年くらい前に産声を上げたオデスキーのScalaがここ近年
実用に使われるようになってきたこととか、Clojureというもう一つの選択肢がでてきたこととかetc
0165営利利用に関するLR審議中@詳細は自治スレへ
2012/04/09(月) 21:02:41.73あ、いや成功したのはparottでは(まだ)なく、parottの実装でhaskellが注目されたこと
0166営利利用に関するLR審議中@詳細は自治スレへ
2012/04/09(月) 21:03:54.88関数型もまた、珍しい技術から単なる常識になりつつある
ただそれだけのことだろ
0167営利利用に関するLR審議中@詳細は自治スレへ
2012/04/09(月) 21:05:12.460168営利利用に関するLR審議中@詳細は自治スレへ
2012/04/09(月) 21:06:16.770169営利利用に関するLR審議中@詳細は自治スレへ
2012/04/09(月) 22:21:19.77それをもって〜言語って言い張るのは無理があるんだよ。
0170営利利用に関するLR審議中@詳細は自治スレへ
2012/04/09(月) 22:52:21.84でも、マルチスレッドや分散処理の論文は関数型や論理型の推奨する永続データモデルばかりだよ?
シングルスレッドならともかく、マルチスレッド意識したら純粋関数型や論理型じゃないと厳しい時代になってくると思うんだけど
0171営利利用に関するLR審議中@詳細は自治スレへ
2012/04/09(月) 22:53:59.95今は普通にマルチスレッドの機能は
オブジェクト指向言語に搭載されてる。
0172営利利用に関するLR審議中@詳細は自治スレへ
2012/04/09(月) 23:20:47.45ref. http://www2.research.att.com/~bs/whatis.pdf
ケイのOOのキモは「処理系のみならず、その受け皿であるナンチャッテOS、工程まで
ひっくるめたあらゆることで徹底した動的性」。
ref. http://metatoys.org/oxymoron/oxymoron.html
関数型のキモは「非破壊操作とそれがもたらす参照透明性」。
型推論とかメッセージとかパターンマッチとかはオマケです。偉い人には(ry
0173営利利用に関するLR審議中@詳細は自治スレへ
2012/04/09(月) 23:31:04.63分散したいならデータも共有しないのが基本なので
永続データの共有を推奨するのはおかしいと思う
0174営利利用に関するLR審議中@詳細は自治スレへ
2012/04/09(月) 23:41:08.58あんま最近は追いかけてないから知らないけど、
汎用手続き型+トランザクショナルメモリの研究はもう止めちゃったのかね。
デッドロックのみならず、例外処理もしやすくなるから期待していたんだけど。
トランザクションで思い出したけど、SQLは宣言的言語と言われてたはずだったんだけど、
今どきはストアドプロシージャとかも使うらしいね。
0175営利利用に関するLR審議中@詳細は自治スレへ
2012/04/09(月) 23:44:18.470176営利利用に関するLR審議中@詳細は自治スレへ
2012/04/10(火) 06:49:32.37オブジェクト指向の何を取り入れたの?
Haskellのどの機能がオブジェクト指向由来なのか教えてくれ
0177営利利用に関するLR審議中@詳細は自治スレへ
2012/04/10(火) 06:55:00.27他はゴミ
0178営利利用に関するLR審議中@詳細は自治スレへ
2012/04/10(火) 07:27:14.51あとジェネリックプログラミングとかは、中途半端に型があるオブジェクト指向系の
言語でやるより、がっちり型のある関数型言語でやったほうがいいし、ST モナド
使えば、本物の「状態のカプセル化」ができる。
関数型ではオブジェクト指向なんてできない、というのは初心者が陥りがちなデマ。
0179営利利用に関するLR審議中@詳細は自治スレへ
2012/04/10(火) 07:47:00.640180営利利用に関するLR審議中@詳細は自治スレへ
2012/04/10(火) 08:04:22.67継承っぽいやつ>>93
プロトタイプOOっぽいやつ>>25
OCamlは普通にクラスも継承もあるので省略
0181営利利用に関するLR審議中@詳細は自治スレへ
2012/04/10(火) 08:24:34.70OCamlで高階ファンクター
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
0182営利利用に関するLR審議中@詳細は自治スレへ
2012/04/10(火) 09:21:46.15自然に書けるかなんだけどな
0183営利利用に関するLR審議中@詳細は自治スレへ
2012/04/10(火) 12:05:42.06科学的に有害か無害かは関係なく、自然か不自然かだけで商売になる
0184営利利用に関するLR審議中@詳細は自治スレへ
2012/04/10(火) 12:30:26.910185営利利用に関するLR審議中@詳細は自治スレへ
2012/04/10(火) 13:06:13.85その評価が状態に対して idempotent かどうかという違いであって。
0186営利利用に関するLR審議中@詳細は自治スレへ
2012/04/10(火) 13:08:03.100187営利利用に関するLR審議中@詳細は自治スレへ
2012/04/10(火) 23:37:56.20自分はHaskellのリバース関数が自然だと感じて入門当時は感動したな
reverse [] = []
reverse (x:xs) = reverse xs ++ [x]
もちろん、組込み関数のreverseは速度重視の直感的ではないコードなんだが・・・
0188営利利用に関するLR審議中@詳細は自治スレへ
2012/04/11(水) 01:26:37.69演算子とコンストラクタの違いが直感的に分からない
英単語だったら先頭が大文字かどうかで分かるんだが
0189営利利用に関するLR審議中@詳細は自治スレへ
2012/04/11(水) 03:24:43.28コ、コンストラクタ!?
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
0190営利利用に関するLR審議中@詳細は自治スレへ
2012/04/11(水) 03:47:40.43彼には言っても無駄な稀ガス…
0191営利利用に関するLR審議中@詳細は自治スレへ
2012/04/11(水) 13:49:19.06右辺で使う演算子を左辺に書いてみれば違いが分かるよ
reverse (xs++[x]) = x : reverse xs
実際には xs++[x] というパターンマッチはできない
0192デフォルトの名無しさん
2012/04/11(水) 21:29:08.42そんな混乱せんだろ
むしろコンストラクタを関数としても使えるのは便利だ
まあリストやタプルのコンストラクタは記号だが、それくらい覚えとけ
0193デフォルトの名無しさん
2012/04/11(水) 23:24:51.38関数がクラスになる。
言ってみればJavaScriptからprototypeがなくなったようなもの。
prototypeがなくなっても効率が悪くなるだけで
オブジェクト指向できるでしょ?
それが関数型言語。
0194デフォルトの名無しさん
2012/04/12(木) 00:08:31.03オブジェクトがクロージャになる。
言ってみれば関数型言語から代数データ型やパターンマッチやカリー化が無くなったようなもの。
代数データ型やパターンマッチやカリー化が無いと効率悪いけど
関数型スタイルでプログラミングできるでしょ?
それがオブジェクト指向言語。
0195デフォルトの名無しさん
2012/04/12(木) 00:14:31.10それはないな。
0196デフォルトの名無しさん
2012/04/12(木) 00:22:10.76それはチョット違うだろ。
クロージャーはlexical scope内にある変数をバインドして保持している関数オブジェクトで、あくまで関数オブジェクト。
オブジェクト指向のオブジェクトは、主に構造を持ったデータオブジェクト(単純スカラーでも可)またはクラスscopeにメソッドやインスタンス変数を
従属させモジュラレティーを確保する事に加え、インヘリタンス/mixin/treitなどで共有または階層関係を持たせ、データドリブンなインターフェースを提供する。
似たところもあるけれど、分けて考えるべきかと。
0197デフォルトの名無しさん
2012/04/12(木) 00:29:40.32いや、マジレスされると困るわw
つーか、そこ突っ込むなら>>193の方が違いすぎるだろ
> 関数がクラスになる
0198デフォルトの名無しさん
2012/04/12(木) 00:39:23.32じゃあ、関数の戻り値がオブジェクト(インスタンス)になる。でいいか?
オブジェクトを作り出すもの = クラス
戻り値を作り出すもの = 関数
言ってることは同じだけどなw
0199デフォルトの名無しさん
2012/04/12(木) 00:48:53.41カリー化されてんだから関数の戻り値も関数だろ
クラスとインスタンスのような関係はねーよ
それともあれか?関数もオブジェクトだから
関数型言語はオブジェクト指向ってやつか?くだらねえ
0200デフォルトの名無しさん
2012/04/12(木) 00:56:44.16理解しようとしなくても
ドカタの人生で関数型言語を使う機会なんて来ないから
安心しろよ
お前にとって運悪く関数型言語が普及してしまったとしても
その頃にはお前の仕事は無くなってるよ
0201デフォルトの名無しさん
2012/04/12(木) 00:57:45.87>>193も突っ込もうと思ってたw
JSがらprototype削ったらinfix notationなlispみたいなのになっちゃうから。
0202デフォルトの名無しさん
2012/04/12(木) 01:01:03.490203デフォルトの名無しさん
2012/04/12(木) 01:05:35.12関数をOOのオブジェクトとみなすところにはそれ程違和感無かった。
言語によっては、関数オブジェクトにもメタ情報設定してOOのオブジェクトみたいにmethodを従属させたり、他のmethodをmixinさせることもできるものがあるから。
ただしhaskellではないが。
0204デフォルトの名無しさん
2012/04/12(木) 01:12:21.320205デフォルトの名無しさん
2012/04/12(木) 01:15:35.37うそつけ。>>169はオレの書き込みだ。
0206デフォルトの名無しさん
2012/04/12(木) 01:17:46.33あ、でもやっぱ違うか、勘違い。
クラスは静的な物(ともかぎらないclassすらもオブジェクトという概念の言語もあるけれどちょっとおいて置いて)
オブジェクトの生成はコンストラクタってのが昨今普及している概念だから。
0207デフォルトの名無しさん
2012/04/12(木) 01:18:40.06こめ、あんか間違えた。えーとどれがオレのレスだったっけw
0208デフォルトの名無しさん
2012/04/12(木) 01:19:35.18関数型は今仕事がない。
将来はあると信じてる。
オブジェクト指向は今仕事がある
将来はなくなって欲しいと、関数型厨は思ってる。
>>200とかそうだなw
0209デフォルトの名無しさん
2012/04/12(木) 01:49:53.91求められるのはプログラミング技術じゃなくて、対象問題の専門知識だわな。
あとは、大学教授が自分の論文に必要な計算をキャンパスのコンピュータを使って並列計算しました的な。
関数型は並列化が容易だから、実行速度が求められる分野に適していそうだが、
手続き型で並列化したほうがもっと速くなるから、結局なんだかなーな。
クラスタを電卓代わりに使う人用かと。
0210デフォルトの名無しさん
2012/04/12(木) 02:03:13.63本気で並列化に取り組むとその考えかたは変わるよ。
関数型の並列化はタスク?データ?どっちのparallelだと思う。
スパコンは徹底的に性能重視だし。
まいいや2chでマジレスカコワルイオレw
0211デフォルトの名無しさん
2012/04/12(木) 02:20:44.68関数型で出来ることが手続き型で出来ないってことはないんで。
FPGAとかは別としても、主流のノイマン型は手続き型がネイティブなんで。
0212デフォルトの名無しさん
2012/04/12(木) 02:45:31.08できるできないまで話を広げればパラダイムなぞ何でもいいんだよ。
性能を徹底的に追及するにはCPUの命令レベル並列化SIMD並列化core間メモリ共有離散並列化ネットワーク分散並列化
徹底的に実効効率(≒GFLOPS)と性能を追求する。
一方の関数型で一部取りざたされる並列化は、並列化のしやすさ=参照透過による並列依存解析の簡便さなどで
まだ止まっている段階であり性能の追求に関してはマッタク解になっていないンジャマイカ?
だからデータパラレルorタスクパラレルか上で訊いてみた。その答えでどのくらい深く考えている椰子かわかるから。
簡便さは無視できず大切なことかもしれないが、それで数値解析がいままでより早くなっていないのであればつかわれなくてもしょうがない。。
安易に並列化に研究成果を求めて逃げるのは愚。
で、FPGAって何の話だ?と小一時間w
もしかしてハード・ソフト両面でずぶの素人さんをオレは相手にしてしまった?
上のクロージャーもしかりだけれど2chでマジレスあまりしたくない。
0213デフォルトの名無しさん
2012/04/12(木) 03:06:38.71関数型が並列化に向いてるって書き込みに噛み付いてたのか。そりゃ食い違うわ。
でも、参照透過性って並列化以外に上手い生かし方が無いと思うんだが。
遅延評価も言語レベルでサポートが欲しいかと言われると、別にねぇ。
0214デフォルトの名無しさん
2012/04/12(木) 03:13:37.82参照透過性はプログラムコードの理解しやすさ、バグの入りにくさなどに少なからず貢献あるんじゃマイカ
0215デフォルトの名無しさん
2012/04/12(木) 03:20:08.01言語レベルでサポートしていることの意味は、自動化、
つまりは自動遅延評価や自動並列化になるとおもうんよ。
0216デフォルトの名無しさん
2012/04/12(木) 03:27:10.53副作用を禁止しちゃっても十分ソフトウェアは記述できるという数学的な原理に基づき
そのための仕組みを言語レベルの機能でちゃんとサポートし副作用を低減しようとする意義はあるのでは?
0217デフォルトの名無しさん
2012/04/12(木) 03:42:11.670218デフォルトの名無しさん
2012/04/12(木) 06:22:33.36それが他に漏れてないことを静的型検査できるのがメリット
静的型検査なんて要らないし、副作用の有無なんて
コメントにでも書いとけば分かるだろ
というプログラマにはメリット無い(批判する意図はないので注意)
0219デフォルトの名無しさん
2012/04/12(木) 06:34:07.76関数型言語のメリットでは無い
0220デフォルトの名無しさん
2012/04/12(木) 06:44:16.58TIOBEとか見て一喜一憂してるの?
http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html
JavaプログラマならJavaの人気が長期的に下がり続けてる
(ついに今月は2位に陥落)の見てショック受けてるの?
幾らでも他と交換可能な木っ端プログラマは大変だね
0221デフォルトの名無しさん
2012/04/12(木) 09:49:24.36普及率は人気の度合い。なぜ人気があるのか考える必要がある。
誰かさんの思い込みより価値ある。
0222デフォルトの名無しさん
2012/04/12(木) 09:50:24.09仮にIOを禁止しても、IOと殆ど同じモナドを簡単に作れる
だから禁止していいんだという解釈もあるが、禁止しても無意味だという解釈もある
Haskellが、いずれかの解釈を一方的にサポートすることはない
あくまで中立
0223デフォルトの名無しさん
2012/04/12(木) 09:55:43.85ソフトウェア工学上で問題になる事項をすべて解消しているわけではいないと思うんだけど
どう思う?
0224デフォルトの名無しさん
2012/04/12(木) 11:16:27.370225デフォルトの名無しさん
2012/04/12(木) 16:43:59.37全くもってその通り!!
中国語だって世界中で大人気だからな!!
0226デフォルトの名無しさん
2012/04/12(木) 16:51:24.45現実のコンピュータが副作用必須の設計で、モナドは副作用解決に使えるというだけ。
モナドが副作用解決のために作られた訳じゃない。
0227デフォルトの名無しさん
2012/04/12(木) 17:45:50.950228デフォルトの名無しさん
2012/04/12(木) 18:33:25.41らの提案したフレーム問題と区別して一般化フレーム問題と呼ばれている。
ソースはwikipedia
>>223
限定的なフレームを選択しないと、フレーム問題に対処できない
0229デフォルトの名無しさん
2012/04/12(木) 19:54:30.42対して従来のやり方は問題を死滅させず適宜再生産もする
農耕・牧畜をおぼえた文明人の手法
0230デフォルトの名無しさん
2012/04/12(木) 20:03:40.16単に生産性が低いものを賞賛してるだけのバカですねw
0231デフォルトの名無しさん
2012/04/12(木) 20:11:16.33・プロジェクトが成功した場合 => 成功したのはOOのおかげ
・プロジェクトが失敗した場合 => 設計者やプログラマがOOに未熟だった
以上の詭弁により、OOはソフトウェア工学の全ての問題を解決した
0232デフォルトの名無しさん
2012/04/12(木) 20:12:09.570233デフォルトの名無しさん
2012/04/12(木) 20:15:51.900234デフォルトの名無しさん
2012/04/12(木) 20:41:17.180235デフォルトの名無しさん
2012/04/12(木) 22:36:25.45生産性については職業プログラマの人に比較して貰うとして、少なくとも、rubyで入門書のサンプル以上のものが作れなかった自分が、haskellでは>>41,>>74のコードを書ける様になった
初心者には、rubyよりhaskellの方が自力でコード書ける様になり易いんじゃ無いかと思う
0236デフォルトの名無しさん
2012/04/12(木) 23:36:58.60数十ファイルからなるアプリを作ってから
書けるようになったといって下さい。
短い関数一つと程度、
あんなの誤差でしかない。
0237デフォルトの名無しさん
2012/04/12(木) 23:59:11.360238デフォルトの名無しさん
2012/04/13(金) 00:07:17.03EC-CUBE 4万行らしいよ。
0239デフォルトの名無しさん
2012/04/13(金) 00:08:42.48Rubyは10万行
0240デフォルトの名無しさん
2012/04/13(金) 00:12:30.38OpenPNE2 13万行
Linuxは1500万行らしい
http://www.infoq.com/jp/news/2012/03/Defects-Open-Source-Commercial
解析対象のオープンソースプロジェクトは、コード行数が10万〜50万のものが
ほとんど(700万行を超えるプロジェクトが2つ)で、
の合計コード行数は3,744万6,469行、平均コード行数は83万2,000行になった。
0241デフォルトの名無しさん
2012/04/13(金) 00:21:31.21gccが少し前は30~40万行あった、いまの4.6,47はもっとだろうな
0242デフォルトの名無しさん
2012/04/13(金) 00:23:31.62書きたいものを書ける様になったら行数関係無い気がするけど・・・
そもそも、私の場合、Rubyではどう書けばいいかすら思い浮かばない
(学習が足りないと言われればそうだけど、どっちも入門書読みかけ状態での知識でしかない)
Haskellは入門書読みかけの状態でも結構色々書けるから、入門者のモチベーション維持にも良いんじゃないかな
(少なくとも、自分のモチベーション維持には良い効果がある)
0243デフォルトの名無しさん
2012/04/13(金) 00:27:01.11プロである以上最低限のことです。
0244デフォルトの名無しさん
2012/04/13(金) 00:27:48.64間違えた、The compiler includes an IDE (Win32 only, sorry), CORBA, OLE, all in all 850000 lines of code. This is (nearly) all Dylan code.
0245デフォルトの名無しさん
2012/04/13(金) 00:33:06.76書きたくない物でも金を受けとる以上書き上げるのが…(ry
0246デフォルトの名無しさん
2012/04/13(金) 00:36:02.31あんたプロや。プログラマー(ry)や。
0247デフォルトの名無しさん
2012/04/13(金) 00:38:56.24プロじゃないと言うか、プロの卵として就職して半年で諦めたんですが・・・
そんな奴が、Haskellでなら、ちょっとは書ける様になったですよ
それで気付いたのは、やってる事はどの言語も同じなのかもなぁー・・・と
で、関数型言語はそのやってる事は同じ。の部分を気付きやすい言語だな・・・・と
他の言語で何やってるのか分かんなくて挫折した人は、一度、関数型言語に挑戦してみてほしいかも
0248デフォルトの名無しさん
2012/04/13(金) 00:46:28.21うん。やる気マンマンです。
0249デフォルトの名無しさん
2012/04/13(金) 01:27:06.58一緒に頑張りまっしい
多分、私はそもそものググルための用語を知らないのが、そもそもの才能の無さな気がする
なので、そもそもググらず自分で作っちゃえ!派な自分には関数型言語の方が性に合うっぽい
(不器用なのは自覚してる)
0250デフォルトの名無しさん
2012/04/13(金) 01:30:15.85作らずに言語を使ってるだけのくせに
0251デフォルトの名無しさん
2012/04/13(金) 01:41:31.45> なので、そもそもググらず自分で作っちゃえ!派な自分には関数型言語の方が性に合うっぽい
初心者なら当然のことだよ。
俺なんかだと、見ただけで簡単な処理と分かるようなもの、
自分で作れると分かっているものは、作っても時間
を浪費するだけで何の経験値にならないし、自慢にもならない。
でも初心者にとっては、そんなものでも
挑戦する価値がある課題なのだから。
自分で作ったんだって自慢げになるでしょ?
0252デフォルトの名無しさん
2012/04/13(金) 06:51:30.77ドカタ仕事で書くコードなんてAPI呼び出すだけ、コピペコード満載の
頭悪いコードなんだから
疑うなら適当なコード書く御題出してみ?Javaのコードとか出てこないから
0253252
2012/04/13(金) 06:57:36.95とかその手の言い訳を、御題のコードの10倍くらいの長さの文章で
必死に語ってくれるよ
本当は2chのレスに収まる規模のコードも書けないんだけどね
0254デフォルトの名無しさん
2012/04/13(金) 07:16:26.24じゃあお題。
プログラマーなら「FizzBuzz問題」解けるよな?
http://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" など)で。
0255デフォルトの名無しさん
2012/04/13(金) 07:48:45.37ありがとうです
では、仕事があるので明日私は書くと思いますが(飲んで帰るので、今日は無理)
ファイルと検索したい文字列をコマンドから入れて、見つかった行と列のリストを表示すると言うのはどうでしょう?
0256デフォルトの名無しさん
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"
0257デフォルトの名無しさん
2012/04/13(金) 08:45:35.77map (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"]
0258デフォルトの名無しさん
2012/04/13(金) 08:54:17.090259デフォルトの名無しさん
2012/04/13(金) 09:05:31.58struct 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; }
■ このスレッドは過去ログ倉庫に格納されています