[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 2chのread.cgiへ]
Update time : 05/14 13:02 / Filesize : 255 KB / Number-of Response : 780
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

【激突】関数型言語 VS オブジェクト指向言語2



1 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/07(土) 21:26:47.61 ]
一般的には、オブジェクト指向型言語が優勢でが
一部には関数型言語を崇拝している人もいます

どちらが上なのか、この際はっきりさせましょう

前スレ toro.2ch.net/test/read.cgi/tech/1331328955/

301 名前:デフォルトの名無しさん mailto:sage [2012/04/13(金) 20:00:44.98 ]
ここまでJava無し

302 名前:デフォルトの名無しさん mailto:sage [2012/04/13(金) 20:30:30.61 ]
JavaScriptできた。俺の使ってるブラウザ以外で動くかどうかはわからん。

var def_fizz = function (name, m) {
var fun = function () {
var tp = typeof this.valueOf();
var n = (tp === 'number') ? this : this.fizzbuzzval
if (n % m === 0) {
var s = name.charAt(0).toUpperCase() + name.slice(1);
if (tp === 'string') {
s = this + s;
}
s = new String(s);
s.fizzbuzzval = n;
return s;
} else {
return this;
}
} ;
Number.prototype[name] = fun;
String.prototype[name] = fun;
} ;
def_fizz('fizz', 3);
def_fizz('buzz', 5);
for (var i = 1; i <= 30; ++i) {
document.writeln(i.fizz().buzz());
}

303 名前:デフォルトの名無しさん mailto:sage [2012/04/13(金) 20:36:17.98 ]
>>301
toro.2ch.net/test/read.cgi/tech/1313183984/190

‥‥ごめんなさい。

304 名前:デフォルトの名無しさん mailto:sage [2012/04/13(金) 22:09:50.27 ]
あるいはこうかな?
toro.2ch.net/test/read.cgi/tech/1313183984/191

305 名前:デフォルトの名無しさん mailto:sage [2012/04/13(金) 22:25:54.85 ]
newはダメらしい…>>288

306 名前: ◆QZaw55cn4c mailto:sage [2012/04/13(金) 22:40:22.27 ]
>>305
ΟΓΖ

基本データ型のリテラル単独でクラスのインスタンスになり得ない言語である以上、new しないことにははじまらない‥‥。

307 名前:デフォルトの名無しさん mailto:sage [2012/04/13(金) 22:42:51.66 ]
>>306
newを隠蔽すればいいだけ

308 名前:デフォルトの名無しさん mailto:sage [2012/04/13(金) 23:24:10.63 ]
いやいや。基本データ型がオブジェクトでなかったり
組み込みクラスにメソッドを追加できない言語では
普通に関数で実装すればいいと思うよ。gizz( buzz( fizz( n ) ) )みたいに。

309 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 00:02:15.95 ]
>>308
それが一番シンプルだと思う。
速度も早いだろうしね。



310 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 00:25:40.80 ]
>>309
それがね、gizz() buzz() fizz()の三関数をどれも特別扱いせず、
いずれの戻り値もいずれの引数となり得る柔軟さを備える仕様にし、かつ
print gizz( buzz( fizz( n ) ) )で
1
"Fizz"
"Buzz"
"Gizz"
"FizzBuzz"
"FizzGizz"
"BuzzGizz"
"FizzBuzzGizz"
という出力を得るのは、以外とマンドくさいのよ。
gizz()だけは文字列を返すなどそれぞれの関数のIFを個別に制約すれば子供の使いなみに楽。
つかこういう要求仕様でnewは使うなとか制限もうけること自体が仕様策定の段階でミスなんだろ。

311 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 00:32:11.23 ]
その意外と面倒くさいところをどう回避するかがこのクイズの味噌なんだが。(´・ω・`)

312 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 00:51:08.06 ]
>>299
> .演算子使ってるからケチ付けられると思うぜ多分w

志村! HasA! HasA!

313 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 01:11:55.03 ]
>>311
そしたら、こうだな。

sub com {
  my ($mod, $zz, $num, $str) = @_;
  $str .= $zz
    if 0 == $num % $mod;
  $str ? ($num, $str) : $num
}
sub fizz {com(3, 'Fizz', @_)}
sub buzz {com(5, 'Buzz', @_)}
sub gizz {com(7, 'Gizz', @_)}

print "$_: " . gizz(buzz(fizz($_))) . "\n"
  for qw(1 3 5 7 15 21 35 105);

実効例:
$ perl p_FizzBuzzGizzAret.pl
1: 1
3: Fizz
5: Buzz
7: Gizz
15: FizzBuzz
21: FizzGizz
35: BuzzGizz
105: FizzBuzzGizz

perlのscalar context/list contextを巧みに?利用してるんで、
それを知らない人には分かりにくいかもしれず、申し訳ないんだか…

※もうちょっと考えて出題して欲しいな、言っちゃ悪いがこういった仕様策定ミスをcodeでカバーすることに何の意味が…

314 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 01:16:27.94 ]
perlのscalar context/list contextの説明。

関数の引数にフラグを一個追加したもの

つまり、
foo(value, false) ・・・ スカラ呼び出し
foo(value, true) ・・・ リスト呼び出し


foo(value, flag)関数の説明

flagがfalseの場合、スカラタイプの値を返します。
flagがturの場合、リストタイプの値を返します。


まあ、こんなもん。

315 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 01:24:45.45 ]
>>314
志村、ここ、ここ。

  my ($mod, $zz, $num, $str) = @_;
               ↑

  $str ? ($num, $str) : $num

sub xxx {com(3, 'Fizz', @_)}
              ↑

print "$_: " . gizz(buzz(fizz($_))) . "\n"

print "$_: " , gizz(buzz(fizz($_))) , "\n"
の動作の違い

なんか、中途半端に知っている人が出てきたな…
寝るか…。ノシ


316 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 01:45:08.21 ]
核の部分はこれだけか
sub com {
 my ($mod, $zz, $num, $str) = @_;
 $str .= $zz if 0 == $num % $mod;
 $str ? ($num, $str) : $num
}
sub fizz {com(3, 'Fizz', @_)}
sub buzz {com(5, 'Buzz', @_)}
sub gizz {com(7, 'Gizz', @_)}


317 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 02:13:05.47 ]
Perlは良く知らないのだが、
print が ($num, $str) の $num を都合よく読み捨ててくれるのは何故?
print fizz(3) の出力は、3Fizz になりそうに思うんだが。よーわからん。

318 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 02:16:18.43 ]
>>317
そゆ話は質問スレ
ttp://toro.2ch.net/test/read.cgi/tech/1330666216/

319 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 02:40:58.54 ]
>>317
結局 Perl のはこのクイズの要求には到達できてなくて(関数単体では完結できていない)、
出力時の文字列との結合でごまかしているってカラクリ。map とかすればズルが露呈する。



320 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 02:52:04.92 ]
>>319
ズルはしてないよ。返戻contextの何番目を数値、何番目を文字列とし後続を省略時はundefとなる
利用しているだけでこういうやり方は使うときは使う。
でも、こういうズレたクイズはもういいよ。
関数型言語、オブジェクト指向言語の比較としてこの題材がどういう意味を持っているの?
これ単に>>297とか排除して特定の機能を持った言語を有利に導きたかっただったんじゃない?

321 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 03:04:43.03 ]
じゃあ、map版です。

use 5.12.0;
sub com {
  my ($mod, $zz, $num, $str) = @_;
  $str .= $zz ;if 0 == $num % $mod;
  $str ? ($num, $str) : $num
}
sub fizz {com(3, 'Fizz', @_)}
sub buzz {com(5, 'Buzz', @_)}
sub gizz {com(7, 'Gizz', @_)}

map{say "$_: " . gizz(buzz(fizz($_)))} qw(1 3 5 7 15 21 35 105);

322 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 03:07:01.05 ]
>>321
しくったorz、ifの前の;が余計だった。

use 5.12.0;
sub com {
  my ($mod, $zz, $num, $str) = @_;
  $str .= $zz if 0 == $num % $mod;
  $str ? ($num, $str) : $num
}
sub fizz {com(3, 'Fizz', @_)}
sub buzz {com(5, 'Buzz', @_)}
sub gizz {com(7, 'Gizz', @_)}

map {say "$_: " . gizz(buzz(fizz($_)))} qw(1 3 5 7 15 21 35 105);

323 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 03:07:30.38 ]
そっちじゃなくて、print時の文字列連結による$numの読み飛ばしの件についてでしょ。
print "$_: " , gizz(buzz(fizz($_))) , "\n"
だと 3: 3Fizz とかなる。

324 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 03:14:00.28 ]
>>323
「gizz,buzz,fizzの三関数をscalar contexで評価すると判定文字列が得られ
 list contextで評価すると数値と判定文字列のリストが得られる関数である
 ただし数値が3,5,7の倍数でない場合は返戻リストの第二要素の判定文字列は
 undef(文字列として評価すると空文字列)」
という仕様の関数として書いている。

のだよ。code嫁よ。

325 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 03:17:44.46 ]
>>297の主張もじっさい意味不明なんだけど。。。
メソッドチェーンっていうのは関数の入れ子の呼び出し gizz(buzz(fizz(n))) と実質同じだろ?
組み込みの関数合成関数の使用を禁じている訳ではないのだから、要求通り関数で完結できてさえいれば
それらを合成しようがぜんぜん問題ないし、型システムのモデルが足を引っ張っている以外、
なにが不利なのかさっぱり分からん。Perl のズル同様で、関数で完結できてないくせに
合成関数のオーバーロードでつじつまを合わせようとするからなんだかなーとなる。

326 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 03:19:31.46 ]
>>322
"$_: " . ってのを無しでやっみてくんない?

327 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 03:21:01.17 ]
>>325
ずれてないよ。
値と評価文字列をlistdで返戻する。
scalarで評価するかlistで評価するかで
返戻を両方参照するか、そのうちの判定文字列だけを印字出力などのために使うか
選択しているだけだよ。

328 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 03:25:52.86 ]
>>326
sub com {
  my ($mod, $zz, $num, $str) = @_;
  $str .= $zz if 0 == $num % $mod;
  $str ? ($num, $str) : $num
}
sub fizz {com(3, 'Fizz', @_)}
sub buzz {com(5, 'Buzz', @_)}
sub gizz {com(7, 'Gizz', @_)}

map {print gizz(buzz(fizz($_))) . "n"} qw(1 3 5 7 15 21 35 105);

329 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 03:27:01.29 ]
ニヤニヤ



330 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 03:27:10.20 ]
Perlは醜いラクダどころか白鳥だったのか
他の言語の立場がないな

331 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 03:27:54.81 ]
>>328
しくった。

"n" → "\n"

332 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 03:38:24.58 ]
天然?

333 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 03:41:23.69 ]
いや、コピペミスw

334 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 03:43:40.92 ]
多数値の返り値の、主値かそれ以外か、を使う手があるわけか

335 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 03:43:48.91 ]
>scalarで評価するかlistで評価するか

そんなの認めるんなら、C++だと型キャストのオーバーロードがあるから楽勝じゃねーか。
operator const char*();
operator const int();
こんなんすりゃ良いんだろ?
ちなみに当たり前にオーバーロードがあるから、Fizz(3)とFizz(FizzBuzzObj)との区別もつくし。
C++ですら出来るんなら、この話もう終わりになっちまうじゃねーか。

336 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 03:45:12.07 ]
しかし、ruby以外はズル、という結論にしたくて必死らしいが、
むしろrubyやJavaScriptがチートだろw

リフレクション使いまくってるしw

337 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 03:46:02.04 ]
>>335
書け書け。だれもC++をけなしてないぞw
後出しじゃんは、なしね。

338 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 03:59:30.30 ]
>>337
すでに >>261 に書いた。

339 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 04:40:06.83 ]
C++の>>261がありなら
Haskellの>>283もありだよな
ていうか、>>325がズルと言ってるの理由がさっぱり分からん
演算子オーバーロードのある言語でそれ使って何が悪いの?

別にmapもできるぜ?
main = print $ map (fizz.buzz.gizz) [1,3,5,7,15,21,35,105]



340 名前:339 mailto:sage [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]

341 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 05:12:11.99 ]
F#で演算子オーバーロードなし。

let 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"]

342 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 05:26:59.93 ]
さーて、また関数型言語が不利になるルールが追加されるよー

343 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 05:45:13.46 ]
次は関数型言語使いがお題を出したらいいんじゃないか
Rubyじゃこんなの書けないだろ的なのを
スレタイの趣旨にも沿ってる

344 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 05:58:16.50 ]
それ以前に「使える言語機能を恣意的に制限する」アホを
排除しておかないと比較にも議論にもなんねーんだよ

345 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 05:59:25.03 ]
じゃあ、型的に間違ってるプログラムをコンパイルエラーにしてください、という問題はどうだろうか。

fizzbuzzの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))))

346 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 06:40:24.02 ]
ループ禁止で再帰だけで書いてください、とかでも良いな
末尾再帰最適化の無い実装じゃスタックオーバーフロー

347 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 06:51:51.42 ]
>>325
組み込みクラスを弄るのはOK
組み込み演算子を弄るのはNG

何故?

348 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 10:00:34.73 ]
初学者といっても
1.プログラミングを学ぶことが目的
2.作りたいものがあって、その手段としてプログラミングが必要
で違う。

1なら関数型言語は良い選択
2ならオブジェクト指向言語やLLの方が早い

こういうスレの喧嘩は
1の人の多くは、プログラミングを座学として勉強しただけで実は何も作れない
2の人の多くは、作りたいものが動けばいいというだけでプログラミングに対する向上心がない

という現実を反映しているだけ。

349 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 10:10:56.56 ]
そしてモマエは
3向上心のカタマリのオレ様にケンカうってんのかーーー
カワネーゾ



350 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 10:28:07.46 ]
>>343
いまは人工的に作ったお題の信用がなくなってるんだよ
そこでまた中立でない人間がお題を出しても、紙屑のように無視されるんじゃないの

351 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 10:47:19.60 ]
>>306
QZってこんなスレまで見てるんだな

352 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 11:03:19.87 ]
>>350
>>290>>325のような上から目線で変なルール押し付けてくるウザいヤツが
居なければ、言語ごとのアプローチの違いが見れて
遊びとしては面白いんだがなぁ
しかもウザいのに限って口だけでプログラム書けないんだ

あ、もしかして>>290>>325がこのスレに書いたコード在る?だったら謝るけど

353 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 11:31:51.96 ]
すまんけどちょっと確認させてください。これまで出てきた関数型言語の回答で、
関数合成演算子(あるいは関数)を定義が必須な場合でも、関数 fizz だけ用いた
fizz 1 や fizz 3 はちゃんと組み込み型の数値や文字列である 1 や "Fizz" を返せるのでしょうか?
これって一応要件だと思うんですよね。C++ の回答についても同様です。
Ruby や JS 、Smalltalk の回答はすべてこれが出来ているみたいなんだけど。

354 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 11:49:35.83 ]
C++は型キャストをカスタマイズできるからそれで対応したら良いと思う。
FizzBuzzオブジェクトから文字列型と数値型へのキャストをそれぞれ用意すればよし。

355 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 12:28:02.63 ]
>>352
今でも十分おもしろいと思うよ。せっそうのない動的言語(OOといえばOOだけど、
ストラウストラップの抽象データ型OOでなくて、ケイの動的OO寄りの考え方)では
可能だけど、理論的にきっちりした関数型言語では実現不可な境界がはっきりしてきてて。
出来ないと分かっていることを出来ないときちんと理由付きで示せる勇気も見れるし。
他方で、動的言語でもすんなりできるとは限らないから各言語での工夫の仕方も興味深い。

356 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 12:29:01.02 ]
>>353
>>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"]]

357 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 13:02:32.74 ]
あ、すいません。F#さんを見落としていました。
F#以外の関数型言語の回答で、ですね!
わざわざの検証、いたみいります。

358 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 14:04:34.17 ]
スレッドローカルに状態を保持するのはいいアイデアですね。

359 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 14:10:22.10 ]
いいアイデアですねw



360 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 14:42:43.34 ]
>>353
>>340だけどテストしてみた

*Main> [map f [1,3,5,7] | f <- [fizz, buzz, gizz]]
[[1,Fizz,5,7],[1,3,Buzz,7],[1,3,5,Gizz]]

361 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 14:50:32.97 ]
>>353
ついでに>>283もテスト
正しく動かなかったので修正

fizzT f s = (\x -> Left x) . fizzT'
  where
    fizzT' n | f n == 0 = Right s
    fizzT' _ | otherwise = Right []

これで >>360と同じコードが動いた

362 名前:361 mailto:sage [2012/04/14(土) 15:07:31.88 ]
面白かったのは>>283>>360を試して動かなかったとき
ちゃんとコンパイル時に型エラーになったこと
Haskellの型システムやるじゃん、みたいな

363 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 15:54:35.13 ]
ねえねえ、1 から 3 までの fizz n の戻り値に対して、文字列なら全大文字化、整数なら 10 倍にして
map するコードを [1, 2, "Fizz"] に対して同じことをするコードとまったく同様に書いて
問題なく実行できるかどうか試しみててよ! クイズの要件をみたしていればできるよね!
もちろんいうまでもなく追加定義や修正は無しだよ。Ruby や F# のはもちろんできるよ!


364 名前:340 mailto:sage [2012/04/14(土) 16:01:06.17 ]
>>360
fizz (HasA s n) = HasA (s ++ if mod n 3 == 0 then "Fizz" else "") (10 * n)

365 名前:340 mailto:sage [2012/04/14(土) 16:02:40.14 ]
あ、ごめん>>363だった
それはさておき、後だしでルール追加するの本当に好きだね

366 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 16:06:40.84 ]
>>363
じゃあ、組み込みクラスをグローバルに汚染するのも禁止しようぜ
classbox等で一部に制限できるならアリ

367 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 16:07:57.17 ]
というか、ここのHaskellerはどうしてこうも要求仕様を読み取れないくせに
あまつさえ勝手な解釈で適当なコード書いてドヤ顔なの? バカなの? 死ぬの?

368 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 16:11:06.66 ]
>>367
誰もお前の頭の中なんて知らないし興味ないんだから
言わないと分からないっつーの
ここはお前の要求仕様を満たす場じゃねーし
馬鹿はお前

あと、まさかコードも書かずに議論参加してたとか無いよな
書いたコードのレス示せよ
俺は>>340書いたぞ

369 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 16:16:29.12 ]
(defmacro defun-fizz-buzz (name divisor)
`(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)



370 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 16:21:51.37 ]
>>367
> ドヤ顔なの?バカなの? 死ぬの?
w
いまどき、こんな台詞をわざわざ書くやつがいるんだww

371 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 16:23:54.35 ]
勘違いしたふりして頓珍漢なコード出してきて、
言語や自分の発想の限界とかクリティカルなところはなんとか避けようとしているんだよ。
仕様を取り違えてるよってやんわりチェック方法をしめすと、
ルールを増やすな、後出しだ、仕様が欠陥だってなんやかやクレームつけて
相手が根負けして要求仕様のほうが変わるのを粘り強くじっと待つ戦略なんだ。
ある意味、賢いよ。

372 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 16:26:54.36 ]
お題提出者の解答ってもう出てるの?

373 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 16:29:32.45 ]
>>363
> map するコードを [1, 2, "Fizz"] に対して同じことをするコードとまったく同様に書いて

Haskellは静的型付けだから数と文字列を同じリストには入れられないんだ
そんなことも知らずに議論してたんじゃないよね?

374 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 16:32:03.01 ]
>>371

>>368
> あと、まさかコードも書かずに議論参加してたとか無いよな
> 書いたコードのレス示せよ

って書いてるのに示さないってことは、まさか本当にコード書いてなかったの?

375 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 16:33:37.46 ]
まさかの口だけ野郎説浮上www

376 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 16:44:57.11 ]
>>363は問題が頓珍漢だけど(静的型で [1, 2, "Fizz"] はねーよw)
最大限エスパーして書いてみた

>>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]

377 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 17:03:29.49 ]
>> xs = (1..3).map{ |n| n.fizz }
=> [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"]

378 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 17:45:03.77 ]
◆QZaw55cn4c が出てきて有耶無耶になってるけど
「Javaドカタはコード書けない」説はまだ有効

379 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 17:57:01.51 ]
◆QZaw55cn4c はドカタではないとでも



380 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 18:26:18.94 ]
Haskellでコード書くだけで天才になれた気がした15の夜

381 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 18:49:30.59 ]
敵はハスケラだけと思ってるところがウケるw
どんな言語使いから見ても口だけ野郎は最底辺のゴミだぞwww

382 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 18:52:07.05 ]
おまえもなw

383 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 19:54:38.00 ]
コード書けないドカタは「なでしこ」使えば良いんじゃないか?
運が良ければ日本語で書いた戯れ言が
実行されるかもしれないぞ

384 名前:デフォルトの名無しさん mailto:sage [2012/04/14(土) 21:39:02.30 ]
>>383
お前は詳しそうだな、その言語。
興味持って使ってみたのか?w

385 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 10:22:56.77 ]
まだPythonは出てなかったので


class 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]]

386 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 10:31:36.36 ]
F#、さすがだな。

387 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 10:48:20.05 ]
>>385
可能なら、
gizz(buzz(fizz(105))) is "FizzBuzzGizz" となるようなヤツをお願いします。

388 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 10:55:31.60 ]
>>387
理由を聞いても良い?
Pythonでは>>385のほうがデコレータでも使えて良いんだけど……

@fizz
@buzz
def bizz(x):
    if x % 11 == 0: return 'Bizz'
    else: ''

389 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 11:03:37.43 ]
静的型言語にIntを返したりStringを返したりする関数って縛りがそもそも無理



390 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 11:07:14.65 ]
>>388
>>254

391 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 11:08:32.55 ]
PerlとかSchemeの、多値をうまく使ったのが一番エレガントかな。

RubyとかJSは、同じようなコードをStringとNumberの両方に生やすとか、
見事に汚い解だw

392 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 11:13:32.41 ]
関数を返す関数(カリー化されてりゃ普通)にケチがつくとか
スゲーなこのスレ

393 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 11:16:23.31 ]
>>390
ちゃんと「など」って書いてるぞー

> オープンクラス機構やメソッドのない言語では関数(buzz(fizz(3)) #=> "Fizz" など)で。

それとも高階関数は関数じゃないんですかー

394 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 11:20:37.25 ]
>>389
それだけじゃない。
継続の状態如何で関数に振る舞いを変えさせるとか
関数型には無理な事ばかり要求している。
悪意に満ちたクイズだ。

395 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 11:23:20.66 ]
>>394
素直に考えれば、オープンクラスのある言語が良いという
意見に持っていきたい問題だからね

でも出てきた解はRubyが一番汚いという

396 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 11:25:11.88 ]
>>389
型クラスとかってこういう時には使えないの?

397 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 11:30:40.55 ]
要求による。

問題の「#=> "FizzBuzz"」が意味しているものが、REPLでそのように表示されるもの、
という意味なら、Show型クラスでいいんだけど、String型([Char]型)を要求してるなら無理。

398 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 11:32:07.68 ]
静的型 vs 動的型スレ向きの問題だよね

399 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 11:52:01.47 ]
>>391
いやあ俺は>>341のF#(er)が一番エレガントだと思うぞ。
無茶な要求仕様も黙ってすべて満たしつつ、簡潔できれいなコード出してきてるし。



400 名前:デフォルトの名無しさん mailto:sage [2012/04/15(日) 11:57:38.79 ]
>>399
ThreadLocalが一番エレガントって
どういうセンスしてんだよ






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<255KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef