【激突】関数型言語 VS オブジェクト指向言語2
■ このスレッドは過去ログ倉庫に格納されています
0001営利利用に関するLR審議中@詳細は自治スレへ
2012/04/07(土) 21:26:47.61一部には関数型言語を崇拝している人もいます
どちらが上なのか、この際はっきりさせましょう
前スレ http://toro.2ch.net/test/read.cgi/tech/1331328955/
0336デフォルトの名無しさん
2012/04/14(土) 03:45:12.07むしろrubyやJavaScriptがチートだろw
リフレクション使いまくってるしw
0337デフォルトの名無しさん
2012/04/14(土) 03:46:02.04書け書け。だれもC++をけなしてないぞw
後出しじゃんは、なしね。
0338デフォルトの名無しさん
2012/04/14(土) 03:59:30.30すでに >>261 に書いた。
0339デフォルトの名無しさん
2012/04/14(土) 04:40:06.83Haskellの>>283もありだよな
ていうか、>>325がズルと言ってるの理由がさっぱり分からん
演算子オーバーロードのある言語でそれ使って何が悪いの?
別にmapもできるぜ?
main = print $ map (fizz.buzz.gizz) [1,3,5,7,15,21,35,105]
0340339
2012/04/14(土) 05:12:10.70>>312の言う通りHasAも隠蔽すれば良いんだな?
data HasA = HasA String Integer deriving Eq
instance Show HasA where
show (HasA s n) = if s == "" then show n else s
instance Num HasA where
(+) (HasA r m) (HasA s n) = HasA (r ++ s) (m + n)
(-) (HasA r m) (HasA s n) = HasA "" (m - n)
(*) (HasA r m) (HasA s n) = HasA "" (m * n)
negate (HasA s n) = HasA s (-n)
abs (HasA s n) = HasA s (abs n)
fromInteger n = HasA "" n
signum (HasA s n) = HasA s (signum n)
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) [1,3,5,7,15,21,35,105]
0341デフォルトの名無しさん
2012/04/14(土) 05:12:11.99let threadLocal = new System.Threading.ThreadLocal<_>()
let makeFizzBuzz name condition (x : obj) =
match x with
| :? int as number ->
threadLocal.Value <- number
if condition number then box name else box number
| :? string as names ->
box (if condition threadLocal.Value then names + name else names)
| _ -> failwith "ロジックエラー"
let fizz = makeFizzBuzz "Fizz" (fun x -> x % 3 = 0)
let buzz = makeFizzBuzz "Buzz" (fun x -> x % 5 = 0)
let gizz = makeFizzBuzz "Gizz" (fun x -> x % 7 = 0)
> [1; 3; 5; 7; 15; 21; 35; 105] |> List.map (fun x -> gizz(buzz(fizz x)));;
val it : obj list =
[1; "Fizz"; "Buzz"; "Gizz"; "FizzBuzz"; "FizzGizz"; "BuzzGizz"; "FizzBuzzGizz"]
0342デフォルトの名無しさん
2012/04/14(土) 05:26:59.930343デフォルトの名無しさん
2012/04/14(土) 05:45:13.46Rubyじゃこんなの書けないだろ的なのを
スレタイの趣旨にも沿ってる
0344デフォルトの名無しさん
2012/04/14(土) 05:58:16.50排除しておかないと比較にも議論にもなんねーんだよ
0345デフォルトの名無しさん
2012/04/14(土) 05:59:25.03fizzbuzzのscheme多値版ね。マクロ使っちゃっちゃったけど。
(define-syntax fizz (syntax-rules () ((_ arg) (receive it arg (fuzzbuzz it "Fizz" 3)))))
(define-syntax buzz (syntax-rules () ((_ arg) (receive it arg (fuzzbuzz it "Buzz" 5)))))
(define fuzzbuzz
(lambda (arg name m)
(let* ((is-num (null? (cdr arg))) (s (if is-num "" (car arg))) (a (if is-num (car arg) (cadr arg))))
(if (= 0 (mod a m)) (values (string-append s name) a) (if is-num a (values s a))))))
(define main (lambda (_) (letrec ((loop (lambda (n) (if (<= n 30)
(begin (print (buzz (fizz n))) (loop (+ n 1))))))) (loop 1))))
0346デフォルトの名無しさん
2012/04/14(土) 06:40:24.02末尾再帰最適化の無い実装じゃスタックオーバーフロー
0347デフォルトの名無しさん
2012/04/14(土) 06:51:51.42組み込みクラスを弄るのはOK
組み込み演算子を弄るのはNG
何故?
0348デフォルトの名無しさん
2012/04/14(土) 10:00:34.731.プログラミングを学ぶことが目的
2.作りたいものがあって、その手段としてプログラミングが必要
で違う。
1なら関数型言語は良い選択
2ならオブジェクト指向言語やLLの方が早い
こういうスレの喧嘩は
1の人の多くは、プログラミングを座学として勉強しただけで実は何も作れない
2の人の多くは、作りたいものが動けばいいというだけでプログラミングに対する向上心がない
という現実を反映しているだけ。
0349デフォルトの名無しさん
2012/04/14(土) 10:10:56.563向上心のカタマリのオレ様にケンカうってんのかーーー
カワネーゾ
0350デフォルトの名無しさん
2012/04/14(土) 10:28:07.46いまは人工的に作ったお題の信用がなくなってるんだよ
そこでまた中立でない人間がお題を出しても、紙屑のように無視されるんじゃないの
0351デフォルトの名無しさん
2012/04/14(土) 10:47:19.60QZってこんなスレまで見てるんだな
0352デフォルトの名無しさん
2012/04/14(土) 11:03:19.87>>290や>>325のような上から目線で変なルール押し付けてくるウザいヤツが
居なければ、言語ごとのアプローチの違いが見れて
遊びとしては面白いんだがなぁ
しかもウザいのに限って口だけでプログラム書けないんだ
あ、もしかして>>290や>>325がこのスレに書いたコード在る?だったら謝るけど
0353デフォルトの名無しさん
2012/04/14(土) 11:31:51.96関数合成演算子(あるいは関数)を定義が必須な場合でも、関数 fizz だけ用いた
fizz 1 や fizz 3 はちゃんと組み込み型の数値や文字列である 1 や "Fizz" を返せるのでしょうか?
これって一応要件だと思うんですよね。C++ の回答についても同様です。
Ruby や JS 、Smalltalk の回答はすべてこれが出来ているみたいなんだけど。
0354デフォルトの名無しさん
2012/04/14(土) 11:49:35.83FizzBuzzオブジェクトから文字列型と数値型へのキャストをそれぞれ用意すればよし。
0355デフォルトの名無しさん
2012/04/14(土) 12:28:02.63今でも十分おもしろいと思うよ。せっそうのない動的言語(OOといえばOOだけど、
ストラウストラップの抽象データ型OOでなくて、ケイの動的OO寄りの考え方)では
可能だけど、理論的にきっちりした関数型言語では実現不可な境界がはっきりしてきてて。
出来ないと分かっていることを出来ないときちんと理由付きで示せる勇気も見れるし。
他方で、動的言語でもすんなりできるとは限らないから各言語での工夫の仕方も興味深い。
0356デフォルトの名無しさん
2012/04/14(土) 12:29:01.02>>341だけど、関数fizz, buzz, gizzをそれぞれ単独で使用した場合をテスト。
> [fizz; buzz; gizz] |> List.map(fun f -> [1; 3; 5; 7] |> List.map f);;
val it : obj list list =
[[1; "Fizz"; 5; 7]; [1; 3; "Buzz"; 7]; [1; 3; 5; "Gizz"]]
0357デフォルトの名無しさん
2012/04/14(土) 13:02:32.74F#以外の関数型言語の回答で、ですね!
わざわざの検証、いたみいります。
0358デフォルトの名無しさん
2012/04/14(土) 14:04:34.170359デフォルトの名無しさん
2012/04/14(土) 14:10:22.100360デフォルトの名無しさん
2012/04/14(土) 14:42:43.34>>340だけどテストしてみた
*Main> [map f [1,3,5,7] | f <- [fizz, buzz, gizz]]
[[1,Fizz,5,7],[1,3,Buzz,7],[1,3,5,Gizz]]
0361デフォルトの名無しさん
2012/04/14(土) 14:50:32.97ついでに>>283もテスト
正しく動かなかったので修正
fizzT f s = (\x -> Left x) . fizzT'
where
fizzT' n | f n == 0 = Right s
fizzT' _ | otherwise = Right []
これで >>360と同じコードが動いた
0362361
2012/04/14(土) 15:07:31.88ちゃんとコンパイル時に型エラーになったこと
Haskellの型システムやるじゃん、みたいな
0363デフォルトの名無しさん
2012/04/14(土) 15:54:35.13map するコードを [1, 2, "Fizz"] に対して同じことをするコードとまったく同様に書いて
問題なく実行できるかどうか試しみててよ! クイズの要件をみたしていればできるよね!
もちろんいうまでもなく追加定義や修正は無しだよ。Ruby や F# のはもちろんできるよ!
0364340
2012/04/14(土) 16:01:06.17fizz (HasA s n) = HasA (s ++ if mod n 3 == 0 then "Fizz" else "") (10 * n)
0366デフォルトの名無しさん
2012/04/14(土) 16:06:40.84じゃあ、組み込みクラスをグローバルに汚染するのも禁止しようぜ
classbox等で一部に制限できるならアリ
0367デフォルトの名無しさん
2012/04/14(土) 16:07:57.17あまつさえ勝手な解釈で適当なコード書いてドヤ顔なの? バカなの? 死ぬの?
0368デフォルトの名無しさん
2012/04/14(土) 16:11:06.66誰もお前の頭の中なんて知らないし興味ないんだから
言わないと分からないっつーの
ここはお前の要求仕様を満たす場じゃねーし
馬鹿はお前
あと、まさかコードも書かずに議論参加してたとか無いよな
書いたコードのレス示せよ
俺は>>340書いたぞ
0369デフォルトの名無しさん
2012/04/14(土) 16:16:29.12`(defmacro ,name (form)
`(multiple-value-bind (int str) ,form
(values int
(if (= (mod int ,',divisor) 0)
(concatenate 'string str (string ',',name))
str)))))
(defun-fizz-buzz fizz 3)
(defun-fizz-buzz buzz 5)
(defun-fizz-buzz gizz 7)
0370デフォルトの名無しさん
2012/04/14(土) 16:21:51.37> ドヤ顔なの?バカなの? 死ぬの?
w
いまどき、こんな台詞をわざわざ書くやつがいるんだww
0371デフォルトの名無しさん
2012/04/14(土) 16:23:54.35言語や自分の発想の限界とかクリティカルなところはなんとか避けようとしているんだよ。
仕様を取り違えてるよってやんわりチェック方法をしめすと、
ルールを増やすな、後出しだ、仕様が欠陥だってなんやかやクレームつけて
相手が根負けして要求仕様のほうが変わるのを粘り強くじっと待つ戦略なんだ。
ある意味、賢いよ。
0372デフォルトの名無しさん
2012/04/14(土) 16:26:54.360373デフォルトの名無しさん
2012/04/14(土) 16:29:32.45> map するコードを [1, 2, "Fizz"] に対して同じことをするコードとまったく同様に書いて
Haskellは静的型付けだから数と文字列を同じリストには入れられないんだ
そんなことも知らずに議論してたんじゃないよね?
0374デフォルトの名無しさん
2012/04/14(土) 16:32:03.01>>368
> あと、まさかコードも書かずに議論参加してたとか無いよな
> 書いたコードのレス示せよ
って書いてるのに示さないってことは、まさか本当にコード書いてなかったの?
0375デフォルトの名無しさん
2012/04/14(土) 16:33:37.460376デフォルトの名無しさん
2012/04/14(土) 16:44:57.11最大限エスパーして書いてみた
>>283はこんな感じ
conv (Left n) = Left $ 10 * n
conv (Right s) = Right $ map toUpper s
main = do
print $ map conv [Left 1, Left 2, Right "Fizz"]
print $ map conv $ map fizz [1,2,3]
>>340はこんな感じ
conv (HasA s n) = HasA (map toUpper s) (10 * n)
main = do
print $ map conv [1, 2, "Fizz" `HasA` 3]
print $ map conv $ map fizz [1,2,3]
0377デフォルトの名無しさん
2012/04/14(土) 17:03:29.49=> [1, 2, "Fizz"]
>> xs.map{ |x| case x when Integer then x*10 when String then x.upcase end }
=> [10, 20, "FIZZ"]
>> ys = [1, 2, "Fizz"]
=> [1, 2, "Fizz"]
>> ys.map{ |x| case x when Integer then x*10 when String then x.upcase end }
=> [10, 20, "FIZZ"]
0378デフォルトの名無しさん
2012/04/14(土) 17:45:03.77「Javaドカタはコード書けない」説はまだ有効
0379デフォルトの名無しさん
2012/04/14(土) 17:57:01.510380デフォルトの名無しさん
2012/04/14(土) 18:26:18.940381デフォルトの名無しさん
2012/04/14(土) 18:49:30.59どんな言語使いから見ても口だけ野郎は最底辺のゴミだぞwww
0382デフォルトの名無しさん
2012/04/14(土) 18:52:07.050383デフォルトの名無しさん
2012/04/14(土) 19:54:38.00運が良ければ日本語で書いた戯れ言が
実行されるかもしれないぞ
0384デフォルトの名無しさん
2012/04/14(土) 21:39:02.30お前は詳しそうだな、その言語。
興味持って使ってみたのか?w
0385デフォルトの名無しさん
2012/04/15(日) 10:22:56.77class F(object):
def __init__(self, f):
self.fs = f if hasattr(f, '__iter__') else [f]
def __call__(self, x):
if isinstance(x, int):
s = ''.join(f(x) for f in self.fs if isinstance(f(x), str))
return x if s == '' else s
else:
return F(self.fs + [x])
fizz = F(lambda x: 'Fizz' if x % 3 == 0 else '')
buzz = F(lambda x: 'Buzz' if x % 5 == 0 else '')
gizz = F(lambda x: 'Gizz' if x % 7 == 0 else '')
print [fizz(buzz)(gizz)(x) for x in [1,3,5,7,15,21,35,105]]
0386デフォルトの名無しさん
2012/04/15(日) 10:31:36.360387デフォルトの名無しさん
2012/04/15(日) 10:48:20.05可能なら、
gizz(buzz(fizz(105))) is "FizzBuzzGizz" となるようなヤツをお願いします。
0388デフォルトの名無しさん
2012/04/15(日) 10:55:31.60理由を聞いても良い?
Pythonでは>>385のほうがデコレータでも使えて良いんだけど……
@fizz
@buzz
def bizz(x):
if x % 11 == 0: return 'Bizz'
else: ''
0389デフォルトの名無しさん
2012/04/15(日) 11:03:37.430390デフォルトの名無しさん
2012/04/15(日) 11:07:14.65>>254
0391デフォルトの名無しさん
2012/04/15(日) 11:08:32.55RubyとかJSは、同じようなコードをStringとNumberの両方に生やすとか、
見事に汚い解だw
0392デフォルトの名無しさん
2012/04/15(日) 11:13:32.41スゲーなこのスレ
0393デフォルトの名無しさん
2012/04/15(日) 11:16:23.31ちゃんと「など」って書いてるぞー
> オープンクラス機構やメソッドのない言語では関数(buzz(fizz(3)) #=> "Fizz" など)で。
それとも高階関数は関数じゃないんですかー
0394デフォルトの名無しさん
2012/04/15(日) 11:20:37.25それだけじゃない。
継続の状態如何で関数に振る舞いを変えさせるとか
関数型には無理な事ばかり要求している。
悪意に満ちたクイズだ。
0395デフォルトの名無しさん
2012/04/15(日) 11:23:20.66素直に考えれば、オープンクラスのある言語が良いという
意見に持っていきたい問題だからね
でも出てきた解はRubyが一番汚いという
0396デフォルトの名無しさん
2012/04/15(日) 11:25:11.88型クラスとかってこういう時には使えないの?
0397デフォルトの名無しさん
2012/04/15(日) 11:30:40.55問題の「#=> "FizzBuzz"」が意味しているものが、REPLでそのように表示されるもの、
という意味なら、Show型クラスでいいんだけど、String型([Char]型)を要求してるなら無理。
0398デフォルトの名無しさん
2012/04/15(日) 11:32:07.680399デフォルトの名無しさん
2012/04/15(日) 11:52:01.47いやあ俺は>>341のF#(er)が一番エレガントだと思うぞ。
無茶な要求仕様も黙ってすべて満たしつつ、簡潔できれいなコード出してきてるし。
0400デフォルトの名無しさん
2012/04/15(日) 11:57:38.79ThreadLocalが一番エレガントって
どういうセンスしてんだよ
0401デフォルトの名無しさん
2012/04/15(日) 12:04:48.59#include <string.h>
int v,w,t;char buf[4<<10];void*fizz(void*n){if(!t&&!v){v=(int)n;t=!t;}
if(!(v%3))goto a;else if(!(w&0x7))goto b;else goto c;a:{size_t
(*f)(char*restrict,const char*restrict,size_t);f=(w&0x7)?strlcat
:strlcpy;w|=0x1;f(buf,"Fizz",4<<10);}goto c;b:{char b[2<<8];;;;;;;;;;;
snprintf(b,2<<8,"%d",v);strlcpy(buf,b,2<<8);}goto c;c:return buf;}void
*buzz(void*n){if(!t&&!v){v=(int)n;t=!t;}if(!(v%5))goto a;else
if(!(w&0x7))goto b;else goto c;a:{size_t/**/(*f)(char*restrict,const
char*restrict,size_t);f=(w&0x7)?strlcat:strlcpy;w|=0x2;f(buf,"Buzz",
4<<10);}goto c;b:{char b[2<<8];snprintf(b,2<<8,"%d",v);strlcpy(buf,b,
2<<8);}goto c;c:return buf;}void*gizz(void*n){if(!t&&!v){v=(int)n;t=!t;}
if(!(v%7))goto a;else if(!(w&0x7))goto b;else goto c;a:{size_t (*f)
(char*restrict,const char*restrict,size_t);f=(w&0x7)?strlcat:strlcpy;
w|=0x1;f(buf,"Gizz",4<<10);}goto c;b:{char b[2<<8];;;snprintf(b,2<<8,
"%d",v);strlcpy(buf,b,2<<8);}goto c;c:return buf;}int main(void){printf
("%s\n",gizz(buzz(fizz(105))));}
0402デフォルトの名無しさん
2012/04/15(日) 12:22:36.47>あと、まさかコードも書かずに議論参加してたとか無いよな
>>395
>でも出てきた解はRubyが一番汚いという
このスレの特徴まとめ
0403デフォルトの名無しさん
2012/04/15(日) 12:34:01.13グローバル変数ではまずいと考えてThreadLocalにしたみたいに見える
まずいという認識がありながら、それを上に報告しないのはおかしい
結局、要求に対する不平不満は正直に言えばいいんだよ
0404デフォルトの名無しさん
2012/04/15(日) 12:52:12.220405デフォルトの名無しさん
2012/04/15(日) 13:06:57.34お前のコードかけないドカタって概念がおかしいけどねw
0406デフォルトの名無しさん
2012/04/15(日) 13:29:07.47あれ?まだこのスレに居たの?
派遣仕事で使い慣れたJavaを使って良いから
早くエレガントな解を出してくださいよwww
0407デフォルトの名無しさん
2012/04/15(日) 13:32:57.130408デフォルトの名無しさん
2012/04/15(日) 13:55:54.00求められているのは動くアプリだ。
0409デフォルトの名無しさん
2012/04/15(日) 14:23:06.70副作用を使わずにこのクイズは解けない。
よって純粋な関数型パラダイムでは対応不可。終了。
0410デフォルトの名無しさん
2012/04/15(日) 14:32:35.610411デフォルトの名無しさん
2012/04/15(日) 14:38:59.15この場合の「など」は、関数呼び出しにもいろいろありますよね、
buzz(fizz(3)) 、 (buzz (fizz 3)) 、buzz fizz 3 など―とかの「など」だと思われ。
0412デフォルトの名無しさん
2012/04/15(日) 15:23:11.97関数型言語で作るには
どうしたらいいのだろうか?
0413デフォルトの名無しさん
2012/04/15(日) 15:27:19.67副作用なしに解いたSchemeさんが涙目です
0414デフォルトの名無しさん
2012/04/15(日) 15:35:03.47三つ目が>>385だね(カリー化されてれば)
それとも見た目だけの問題?
0415デフォルトの名無しさん
2012/04/15(日) 16:42:00.03type MainBuilder() =
member this.Return x =
x |> List.map (function
| _, Some names -> box names
| number, None -> box number)
let main = MainBuilder()
let makeFizzBuzz name condition (x : obj) =
match x with
| :? int as number -> number, if condition number then Some name else None
| _ ->
let number, names = x :?> int * string option
number, if condition number then (defaultArg names "") + name |> Some else names
// fizz, buzz, gizzの定義は>>341と同じなので省略
> main { return [1; 3; 5; 7; 15; 21; 35; 105] |> List.map (fun x -> gizz(buzz(fizz x))) };;
val it : obj list =
[1; "Fizz"; "Buzz"; "Gizz"; "FizzBuzz"; "FizzGizz"; "BuzzGizz"; "FizzBuzzGizz"]
0416デフォルトの名無しさん
2012/04/15(日) 17:46:44.230417デフォルトの名無しさん
2012/04/15(日) 17:53:43.12mainがダウト、なんじゃないか?
0418デフォルトの名無しさん
2012/04/15(日) 18:08:11.82main { return ... } 部分をただのコードブロックとみせかけて
実は戻り値を変換しているという作戦だったのに、バレたか。
0419デフォルトの名無しさん
2012/04/15(日) 18:31:37.860420デフォルトの名無しさん
2012/04/15(日) 18:34:04.580421デフォルトの名無しさん
2012/04/15(日) 18:34:51.92この期に及んで汚ないチートとかなにこのものすごい残尿感。
0422デフォルトの名無しさん
2012/04/15(日) 18:40:05.540423デフォルトの名無しさん
2012/04/15(日) 18:43:46.950424デフォルトの名無しさん
2012/04/15(日) 18:47:39.470425デフォルトの名無しさん
2012/04/15(日) 18:52:45.850426デフォルトの名無しさん
2012/04/15(日) 18:53:02.180427デフォルトの名無しさん
2012/04/15(日) 19:04:47.51汚いコードだけが「合格」www
勝手に判定してる(コード書けない)バカのセンスが露呈してますな
0428デフォルトの名無しさん
2012/04/15(日) 19:05:21.22perl書いたのオレなんだけれどもさ、その通りなんだよな…
0429デフォルトの名無しさん
2012/04/15(日) 19:08:10.88すげえ無理矢理くさくて笑えるw
関数型がオブジェクト指向を取り入れるのはもっと自然なのに
オブジェクト指向っていうかC系列はもう駄目なんだと思う
0430デフォルトの名無しさん
2012/04/15(日) 19:18:55.29そりゃ無理やりくさくもなるさ
0431デフォルトの名無しさん
2012/04/15(日) 19:28:01.70最近のC#の機能なんてC#以前から概念として存在してたはずなのに。
必要ないという当初の目論見は外れてるわけだ。
というか、資産っていうのはC風の構文そのものなんだよね・・・
C風じゃないとヤダヤダいう人が多すぎてD言語とかいちいち作られてる気がする。
C++、Java、C#、D言語
このへんは全て老害でしょ。
0432デフォルトの名無しさん
2012/04/15(日) 19:30:26.050433デフォルトの名無しさん
2012/04/15(日) 19:41:07.47fizz 3 -- "Fizz"
buzz 5 -- "Buzz"
buzz fizz 15 -- "FizzBuzz"
だったらHaskellでも解ける?
0434デフォルトの名無しさん
2012/04/15(日) 19:45:23.420435デフォルトの名無しさん
2012/04/15(日) 19:50:00.84C系列でまともなのはCだけ
■ このスレッドは過去ログ倉庫に格納されています