トップページ⇒tech
1001コメント388KB

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

■ このスレッドは過去ログ倉庫に格納されています
0001営利利用に関するLR審議中@詳細は自治スレへ2012/04/07(土) 21:26:47.61
一般的には、オブジェクト指向型言語が優勢でが
一部には関数型言語を崇拝している人もいます

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

前スレ http://toro.2ch.net/test/read.cgi/tech/1331328955/
0406デフォルトの名無しさん2012/04/15(日) 13:29:07.47
>>405
あれ?まだこのスレに居たの?
派遣仕事で使い慣れたJavaを使って良いから
早くエレガントな解を出してくださいよwww
0407デフォルトの名無しさん2012/04/15(日) 13:32:57.13
くやしいんだねw
0408デフォルトの名無しさん2012/04/15(日) 13:55:54.00
仕事しろ。言語の勉強はするだけ無駄。

求められているのは動くアプリだ。
0409デフォルトの名無しさん2012/04/15(日) 14:23:06.70
そもそも関数としての体をなしてないのだから、
副作用を使わずにこのクイズは解けない。
よって純粋な関数型パラダイムでは対応不可。終了。
0410デフォルトの名無しさん2012/04/15(日) 14:32:35.61
Scalaならいろいろ駆使して書けそうだけどな
0411デフォルトの名無しさん2012/04/15(日) 14:38:59.15
>>393
この場合の「など」は、関数呼び出しにもいろいろありますよね、
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
>>409
副作用なしに解いたSchemeさんが涙目です
0414デフォルトの名無しさん2012/04/15(日) 15:35:03.47
>>411
三つ目が>>385だね(カリー化されてれば)
それとも見た目だけの問題?
0415デフォルトの名無しさん2012/04/15(日) 16:42:00.03
F#でThreadLocal等の副作用もないバージョン。

type 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.23
新ルール「カリー化禁止」
0417デフォルトの名無しさん2012/04/15(日) 17:53:43.12
>>415
mainがダウト、なんじゃないか?
0418デフォルトの名無しさん2012/04/15(日) 18:08:11.82
>>417
main { return ... } 部分をただのコードブロックとみせかけて
実は戻り値を変換しているという作戦だったのに、バレたか。
0419デフォルトの名無しさん2012/04/15(日) 18:31:37.86
Smalltalkが流行らないように関数型メインは流行らないよ
0420デフォルトの名無しさん2012/04/15(日) 18:34:04.58
ついに「流行らない」以外に縋るものがなくなっちゃったか
0421デフォルトの名無しさん2012/04/15(日) 18:34:51.92
副作用ありとは言え、唯一まともな解出しててF#△だったのに
この期に及んで汚ないチートとかなにこのものすごい残尿感。
0422デフォルトの名無しさん2012/04/15(日) 18:40:05.54
.NET発表時のHaskell.NETはどこに行ったんだよ?
0423デフォルトの名無しさん2012/04/15(日) 18:43:46.95
マクロ使っていいならそもそも多値なんぞ使わんでも楽勝だろ。
0424デフォルトの名無しさん2012/04/15(日) 18:47:39.47
FizzBuzzって流行ってるけど何が面白いの?
0425デフォルトの名無しさん2012/04/15(日) 18:52:45.85
低能はFizzBuzzすら書けないという事実が面白い
0426デフォルトの名無しさん2012/04/15(日) 18:53:02.18
>>423 具体的にドーゾ
0427デフォルトの名無しさん2012/04/15(日) 19:04:47.51
オープンクラスとか副作用有り等の
汚いコードだけが「合格」www

勝手に判定してる(コード書けない)バカのセンスが露呈してますな
0428デフォルトの名無しさん2012/04/15(日) 19:05:21.22
>>423
perl書いたのオレなんだけれどもさ、その通りなんだよな…
0429デフォルトの名無しさん2012/04/15(日) 19:08:10.88
C#とかも関数型言語のエッセンスを取り入れるけど
すげえ無理矢理くさくて笑える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.05
C#、D言語は設計に一貫した思想がないからアホっぽくなるのは仕方ない。
0433デフォルトの名無しさん2012/04/15(日) 19:41:07.47
fizz 1 -- "1"
fizz 3 -- "Fizz"
buzz 5 -- "Buzz"
buzz fizz 15 -- "FizzBuzz"
だったらHaskellでも解ける?
0434デフォルトの名無しさん2012/04/15(日) 19:45:23.42
可変長引数とかさーー
0435デフォルトの名無しさん2012/04/15(日) 19:50:00.84
>>431
C系列でまともなのはCだけ
0436デフォルトの名無しさん2012/04/15(日) 19:50:26.06
>>433
型の不整合が生じるから無理
0437デフォルトの名無しさん2012/04/15(日) 19:52:02.10
>>432
C#はどんどんダメな方向に向かってる気はするわー。
0438デフォルトの名無しさん2012/04/15(日) 20:01:50.15
Javascriptは結構好きなのよん > C系文法族
0439デフォルトの名無しさん2012/04/15(日) 20:11:47.98
>>406
>>303-304
0440デフォルトの名無しさん2012/04/15(日) 20:19:32.18
>>431
後付で入れてもらったのがScala、Clojure、F#でしょ
なんで後付を悪く言うのかな
0441デフォルトの名無しさん2012/04/15(日) 20:41:24.35
C#は言語設計に一貫性がなく節操のないところが最大の魅力
偉い人にはそれがわからんのです
0442デフォルトの名無しさん2012/04/15(日) 21:08:30.57
>>440
アホか
それらは最初から関数型言語として作られてるでしょ。
関数型は糞、オブジェクト指向最高ってスタンスで作ってたはずのもんが
なんで今更関数型の要素を入れようとするんだよ。
0443デフォルトの名無しさん2012/04/15(日) 21:16:51.80
>>439
オーバーライドした toString() を println() に暗黙に呼ばせるとかいう
使い古されたチートをキメ顔で出してこられても…。
new myInteger(3).fizz() が "Fizz" を返せるとか少しは挑戦しようよ。
0444デフォルトの名無しさん2012/04/15(日) 21:17:08.32
「.Netファミリーに関数型言語入ったからC#でも使えるようにすっか!」
くらいのノリだろ。たぶん
dynamic型導入したときもそんな感じだったし
0445デフォルトの名無しさん2012/04/15(日) 21:18:37.55
いやC#の場合は「C#で〜が出来ないと言わせない」という一貫した姿勢があると思う。
もともとJavaへの嫉妬から始まった言語だし。
0446デフォルトの名無しさん2012/04/15(日) 21:21:52.66
>>442
手続き型言語がまずあって、
そこへOOの機能を取り入れた。
こんどはさらに関数型の機能も取り入れようとしているだけ。
0447デフォルトの名無しさん2012/04/15(日) 21:40:30.50
C#厨ってVB.NETをVB厨のための言語って馬鹿にしてたけど
C#だってCっぽくないとヤダヤダっていう老害のために
無理矢理作ってるんだから全然人のこといえねーわ。
ラムダとかそんなに良いんならなんで最初から関数型言語使わないんだよw
0448デフォルトの名無しさん2012/04/15(日) 21:46:15.09
>>442
> 関数型は糞、オブジェクト指向最高ってスタンスで作ってたはずのもんが
> なんで今更関数型の要素を入れようとするんだよ。

オブジェクト指向最高はそうかもしれないが、
関数型は糞なんて言ってないだろ。

現実世界における物質(オブジェクト)に対応づけやすい
自然な発想に基づくオブジェクト指向。
そこに便利な関数型を取り入れただけ。

りんごの方程式とは何か?を考えれば
オブジェクト指向と関数型の関係がわかるだろう。
0449デフォルトの名無しさん2012/04/15(日) 21:48:54.81
C#作った奴らはvoidを型と思っていなかった。
だから、C#じゃクロージャ作るのに引数や戻り値にvoidがあると作れないw
やるには予めデリゲートを定義しなきゃならん。
クロージャを使うのを考えさせられる。
ありえん。手軽さが全然ない。

F#はローカル変数(厳密には違うが)を定義するのもクロージャを定義するのも同じ手間しかかからない。
クロージャをバンバン使っていけるのでクロージャの応用もどんどん閃ける。
F#やった方がC#が上手くなるという現実。
C#はやればやるほど馬鹿になる言語。
0450デフォルトの名無しさん2012/04/15(日) 21:50:04.90
速度やメモリ・言語ごとの風習で最適かどうかは変わるのだろうけれど、
関数型でOOPをするときは、返り値として変更したオブジェクトを返すより、新たなオブジェクトを返したほうが関数型ぽいのかね?
0451 ◆QZaw55cn4c 2012/04/15(日) 21:51:05.55
>>447
F#のことも思い出してあげてください
0452デフォルトの名無しさん2012/04/15(日) 21:59:08.45
関数型言語でWindowsアプリを開発したいっつー需要がどれだけあるかだな
0453デフォルトの名無しさん2012/04/15(日) 22:00:17.15
>>442
どちらが糞でどちらが最高かなんて、問い詰められても答えなくていいと思うんだが
沈黙が正解って小学生でも知ってる奴は知ってるだろ
0454デフォルトの名無しさん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 をオーバーライドする、ってこういうときには普通にすることだと思っていたんですが、何かまずい問題でもあるのでしょうか?
0455デフォルトの名無しさん2012/04/15(日) 23:40:26.22
トイプログラムしか書かない奴は言語なんて何でもいいだろw
0456デフォルトの名無しさん2012/04/15(日) 23:47:29.56
>>443
>>303 の方針でがんばってみました。gizz() は最後に置かなければならない、と決めうちすることにしました。
http://toro.2ch.net/test/read.cgi/tech/1313183984/194
0457デフォルトの名無しさん2012/04/15(日) 23:49:17.32
苦しいねぇ
0458デフォルトの名無しさん2012/04/15(日) 23:50:41.61
>>454
> fizz() が "Fizz" を返してしまうと、もとの String("3") を忘れてしまい、buzz(), gizz() が処理できない

その一見回避不可能な問題を解決する方法を考えるのがこのクイズがクイズたるゆえんです。
言語によっては型システムの制約によりどうやっても実現できないこともあります。
0459デフォルトの名無しさん2012/04/16(月) 00:02:21.18
>>450
関数型に限らず、GCのあるOOPLだと
属性変更をせずに新規オブジェクトをサクサク作るやり方も結構使うね
0460デフォルトの名無しさん2012/04/16(月) 00:45:51.08
>>454
>>341の方法(元の数値をどこかにメモしておいて適宜参照)はJavaでも使えます。
0461デフォルトの名無しさん2012/04/16(月) 01:11:55.59
>>458
OOとPFの言語比較としてこのようなクイズを出したのは、
どのような観点からこれら両者のパラダイムの優劣を比較しようとしたのか
聞きたい
0462デフォルトの名無しさん2012/04/16(月) 01:13:44.79
もうこのお題はcloseでいいんじゃないの?
このクイズではせっかくの労力を生産的でないことに費やしている
0463デフォルトの名無しさん2012/04/16(月) 01:30:58.12
>>462
クイズなんかそんなもんだろ。しょせん暇つぶし。
つーか、こんな程度のクイズ解くのに「労力」なんか大仰なもん必要か?
0464デフォルトの名無しさん2012/04/16(月) 01:38:59.77
このクイズのくだらなさはかなり問題。
0465デフォルトの名無しさん2012/04/16(月) 01:48:07.75
くやしいのうw
0466デフォルトの名無しさん2012/04/16(月) 02:07:04.82
全然くやしくないぜよ。perlでobjectのnew版も多値版もさらりと書いた。
tieとマクロ使ったのも書こうと思ったけれど手間がもったいなくなってやめた。
パラダイム比較としてもうすこし書く値打ちのあるテーマ出せよ、
このクイズじゃ再帰は使いどころないし
javaのnewだめ静的型システムダメ
何を有利に誘導したいんだか
せめて前スレのpermutationレベルのテーマを出題の下限レベルとしてクレヨ
04674662012/04/16(月) 02:18:35.03
大体fizz buzzってのが下らないんだよ
プログラムプロムナード、ナノピコ教室、Cマガ課題、オイラー4、AIアルゴリズム、OR最適化、
パーサ、マッチング、グラフ問題あたりの
小問題で再帰・高階/部分適用、遅延・カーリー化vsOOの比較できる題材が妥当かもな
step数は2chの1レスに収まるくらいの小問題でいいからサ
04684662012/04/16(月) 02:26:58.99
最悪、基本アルゴリズムの再実装でもいいや
たとえばqsortはperlやhaskellでpivotを適当に選択して再帰した短いコードと
pivot選択くどくど頑張ったCやjavaの長いコード比較してファンクショナルの再帰はマンセーみたいな
サイトがあちこちにあるだろ、
あのレベルでも今回のFizzBuzzGizzよりましだろ
04694662012/04/16(月) 02:35:35.13
あと、言い出しっぺの法則はナシだぞw
04704662012/04/16(月) 02:44:04.67
つか、OOとPFの単純比較って何か意味あるのか?
どのみち記述する言語の特徴または弱点、癖の比較レベルの議論に落ちがちな稀ガス
ズット前スレでヨンだが、意味論的にはOOとPFは相容れない物らしい
しかし生々しい実装レベルではいまんとこ清濁併せ呑んで実現するし
まあいいや寝るか。ノシ
0471デフォルトの名無しさん2012/04/16(月) 02:46:25.77
多値使うアイデアはイケてたはずなのに、仕上げの文字列との結合やprintとの併用で
ズル呼ばわりされるわ、Rubyの>>377の挙動も再現できなかったしで散々だったしね。
0472デフォルトの名無しさん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;
}
04734662012/04/16(月) 02:54:29.65
>>471
あれはね最初に書いたnewはだめって言われて仕方なくの面はあるのよ

$scalar = 関数(関数

と明示的にscalarで主値だけを受けとるように明示するのがホントは作法なんだ。

Rubyの>>377に関しては読んでなかったから挙動の再現にそもそも着手してないよ。
rubyは文法がかなりカオスになって来ちゃって残念だね
04744662012/04/16(月) 02:59:22.51
fizzbuzzgizzはいいんだどうでも。
それより前スレのpermutaion perl版はwebなど参照せず一から考えて書いて
オレなりに結構な自信作だったのに
なんの反応もなかったことの方が寂しかったな
0475デフォルトの名無しさん2012/04/16(月) 03:19:21.92
何このスレ
0476デフォルトの名無しさん2012/04/16(月) 06:20:08.75
ruby無双をしたかった奴が、もっとエレガントな解を他言語で出されて、
涙目でdisるスレです
0477デフォルトの名無しさん2012/04/16(月) 06:53:26.91
Rubyと違う解法が出る度に
必死に難癖付けてて笑ったわww
0478デフォルトの名無しさん2012/04/16(月) 08:13:17.85
頭が固くて馬鹿だから
数や文字列に状態持たせる以外の方法が
理解できないんだろう
0479デフォルトの名無しさん2012/04/16(月) 08:32:48.03
頭が固くて馬鹿だから
数や文字列に状態持たせる方法が
許容できないんだろう
0480デフォルトの名無しさん2012/04/16(月) 08:38:53.99
世の中は状態がある世界なのにねw
0481デフォルトの名無しさん2012/04/16(月) 08:50:48.96
じゃあFixnumのインスタンスに特異メソッド定義してみろRuby厨
0482デフォルトの名無しさん2012/04/16(月) 09:44:46.42
元ネタのCLのEQLスペシャライザならそういうことできたよな。

Haskellとかでコンストラクタ無しで1以外の引数をとるとコンパイル時に
型エラーになる関数って定義できたっけ?
0483デフォルトの名無しさん2012/04/16(月) 10:00:08.87
template< int n > void func(){int i="";}
template<> void func<1>(){}
・・・
func<2>();//エラー
0484デフォルトの名無しさん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 に変えるとコンパイルエラー
0485デフォルトの名無しさん2012/04/16(月) 12:50:08.98
>>474
あれ覚えてるよ、実は感心してた
ていうか、このスレでPerlの評価が結構変わったよ(もちろん高い方へ)

でも、読み易さ優先で書いてあれとは
Perl使いとは分かり合えないな...と思ったけどw
0486デフォルトの名無しさん2012/04/16(月) 20:25:48.62
>>479
許容はしてるだろう
エレガントさから程遠いと言ってるだけで
0487デフォルトの名無しさん2012/04/16(月) 22:19:41.52
俺の基準における
エレガントってやつかw
04882852012/04/17(火) 00:46:48.85
正直、あの問題は無いと思うよ
問題があれだし書き捨てだからやったが、実際には絶対にやりたくないな
0489デフォルトの名無しさん2012/04/17(火) 00:47:44.00
>>487
FizzBuzzすら書けない口だけ野郎の基準よりマシだろwww
お前はこのスレでは最底辺のカスなんだから敬語使えw
0490デフォルトの名無しさん2012/04/17(火) 00:53:04.36
>>481
ぶっちゃけ>>479のバカが理解できたのが
たまたまRubyのコードだっただけでRuby厨ですらねーと思うぜ
むしろバカにクソコード褒められてRuby可哀想ってなもんだ
0491デフォルトの名無しさん2012/04/17(火) 00:59:54.74
あの問題出したのぶっちゃけPython使いだと思う(陰謀説)
04924662012/04/17(火) 01:35:17.45
>>491
アレは学部・卒研レベルの課題をここに投げたのかなーと
オレは感じた。(真相はシラネ)
もしかしてオレ様はボクちゃんに利用されたのかなとww
0493デフォルトの名無しさん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'.
0494デフォルトの名無しさん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"
0495デフォルトの名無しさん2012/04/18(水) 13:10:30.34
っていうか問題どこだよ
0496デフォルトの名無しさん2012/04/18(水) 13:31:40.56
スレタイに惹かれて開いたけどゴミスレだった・・・
0497デフォルトの名無しさん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";
0498デフォルトの名無しさん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
0499デフォルトの名無しさん2012/04/19(木) 09:53:30.31
リフレクションやらスレッドローカルやら組み込みクラス汚染やら使った
クソみたいな実装が出てくる出題だったけど
言語比較に役立つ何かは得られましたか?
0500デフォルトの名無しさん2012/04/19(木) 10:07:54.14
あるときは数値またあるときは文字列を返すような関数は
動的型であれ作るもんじゃないという幼稚園児並みの洞察が得られました
0501デフォルトの名無しさん2012/04/19(木) 10:43:06.55
>>499
「数値と文字列の組」と「数値または文字列」の違いが不明瞭だった。
リフレクションや継承で二つのクラスを一組にしたいのか、
それとも一つのクラスを数種類に分けたいのか明示されていなかった。
0502デフォルトの名無しさん2012/04/19(木) 10:53:45.22
どうしてもスレッドローカル変数が必要になったとき
関数的にはどう記述したらいいのかよかったら教えてください。
0503デフォルトの名無しさん2012/04/19(木) 11:37:33.00
そもそもスレッド自体が処理系に依存した、言語パラダイムとは関係ない概念だから、
関数型的にもオブジェクト指向的にも、どう記述したらいいかとか答えようがない。
0504デフォルトの名無しさん2012/04/19(木) 12:23:49.22
Readerモナドでグローバル変数っぽいことをするには
どうすればいいのでしょうか。たとえば、状態をfizzとかbuzzから
(引数として渡すことなしに)参照したり更新したりしたいのです。
0505デフォルトの名無しさん2012/04/19(木) 12:50:34.08
ttp://www.haskell.org/haskellwiki/Thread-local_storage
いまんとこHaskellからTLSを使う、「これ」といった定番はないようだ
■ このスレッドは過去ログ倉庫に格納されています