1 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/07(土) 21:26:47.61 ] 一般的には、オブジェクト指向型言語が優勢でが 一部には関数型言語を崇拝している人もいます どちらが上なのか、この際はっきりさせましょう 前スレ toro.2ch.net/test/read.cgi/tech/1331328955/
35 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 09:55:37.49 ] >>34 具体的に言って下さい。
36 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 10:00:13.98 ] >>33 functional (programming)
37 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 10:35:21.46 ] 一口にパッチと言っても ・ソースコード自体を書き換える方法 ・ソースコードはそのままに静的に書き換える方法(マクロ、テンプレート) ・ソースコードはそのままに実行時に書き換える方法(モンキーパッチ) などがあるのですが
38 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 11:01:10.34 ] >>37 文字列自体を操作する方法と、文字列に代わるものを操作する方法があるよね
39 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 11:13:21.18 ] >>33 個人的に、関数型言語は「型指向」だと思う どう言う型受け取って、どう言う型を変えしたいのか考えると、自然と答えが出て来る
40 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 11:22:39.91 ] >>37 それらの区別はたいして何も変わらんw
41 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 11:25:46.31 ] 個人的には、OOPLだと設計がしっかりしてないと拡張するとき困ること多いけど、関数型言語だと、設計を意識しなくても(行き当たりばったりでも)拡張しやすい感触がある 納期に迫られ、ろくに設計できる環境も、人材も無い現場では関数型言語の方が向いてると思うんだが・・・ checkPermu ns = and.concat $ check ns where check [] = [[]] check (x:xs) = map (x/=) xs : check xs allPattern 0 _ = [[]] allPattern _ [] = [[]] allPattern n (ns:nss) = [x:xs | x <- ns, xs <- allPattern (n-1) nss] -- 普通に作ったpermutations(使用例:permutations [1..3]) permutations ns = permutations' (length ns) ns where permutations' 0 _ = [[]] permutations' _ [] = [[]] permutations' n ns = [x:xs | x <- ns, xs <- permutations' (n-1) ns, checkPermu (x:xs)] -- 汎用的なallPatternを作って、それに差し替えたpermutations permutations2 ns= filter checkPermu $ allPattern (length ns) (replicate (length ns) ns) -- allPatternを使った拡張版permutations(使用例:permutationsEx 3 [[1..3],[1..3],[1..3]]) permutationsEx n ns= filter checkPermu $ allPattern n ns
42 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 11:45:02.42 ] >>40 全然違うだろアホか
43 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 12:11:04.47 ] >>39 節子、動的・動的…
44 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 12:22:28.84 ] >>18 の方針でJavaで実装したら100行超えた…… やっぱOOPはウンコだわ……
45 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 12:33:46.77 ] でも関数型でも50歩100歩だったよ・・・
46 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 12:34:12.65 ] >>41 俺は 「設計を意識しないとそもそも書けない」のが関数型言語で 手続き型言語やOOPLはメチャクチャな設計でも書けるor書けてしまうが ちゃんと意識すると関数型言語にも通ずるようなコードが出来上がる …と感じる
47 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 12:34:19.20 ] じゃあRubyで実装しましょうよw
48 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 12:37:13.94 ] 俺は 設計・・・オブジェクト指向 実装・・・関数型言語 って感じるな。
49 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 12:47:10.04 ] UMLがアップを始めました
50 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 13:16:53.33 ] 単なる型スイッチに夢おいもとめんなって。 OOだって実装の道具にすぎん。ハンマーやカンナの類だ。
51 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 13:29:13.33 ] 実装の道具は、OOPLだよ。 OOにはOOA(分析)やOOD(設計)があって 開発プロセス全体をカバーするものなんだ。 OOPLはOOによる開発プロセスを素直に実装するための言語 分析や設計がなぜOOなのかというと、それが一番 システム開発に適しているから。 そしてその分析、設計に一番適している実装がOOPL 関数型による分析や設計が出てこないことには 関数型は実装のみにしか適用されずに終わるよ。
52 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 13:33:38.15 ] OOPLが先にあって、それを生かす形でOOAやOODが生まれたわけで。 夢見ちゃったって感じだね。
53 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 13:36:27.78 ] >分析や設計がなぜOOなのかというと、それが一番 >システム開発に適しているから。 正しくはこうだね。 分析や設計がなぜOOなのかというと、使う言語がOOPLだから。
54 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 13:40:00.97 ] 結局無記名で議論すると個人の感想の叫びあいなんだよね
55 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 13:51:51.24 ] 関数型における分析と設計が出ない時点で 実装のみの技術ってことだろうね。
56 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 13:53:30.17 ] >>47 何を?
57 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 14:02:15.98 ] 関数と述語による形式的仕様記述やZ言語は?
58 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 14:49:46.34 ] OOP より FPのほうが響きがいい よってFPの勝ち。
59 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 15:50:29.78 ] >>56 流れ的に>>41
60 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 16:36:57.37 ] >>59 今Haskell版読みながらRuby版書いてみてるんだけど、やっぱ適当に書かれてる印象はないなあ 発想自体がよく練らないと出てこないというか 「自分が手作業でやるならこう」を素直にコード化する手続き脳ではいきなりは出てこないコードだと思う
61 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 16:49:51.49 ] ああ、適当っつーか原文に倣えば「行き当たりばったり」か どちらにしても行き当たりばったりにも見えないんだよ、それがサクッと出て来る時点でもう設計できてんじゃん、みたいな
62 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 17:02:45.73 ] >>55 そうは言っても関数型言語での記述は、仕様をそのまま記述してるだけだしな・・・ クイックソートの記述が有名だけど、マージソートはもっと仕様そのまま書いてるだけなのがハッキリする -- ソート済みのリストの小さい方をリストに追加して、他方を元のリストに戻して、リストのどちらかが空になるまで比較とリストへの追加、他方のさし戻しを繰り返す merge xs [] = xs merge [] ys = ys merge (x:xs) (y:ys) | x < y = x:merge xs (y:ys) merge (x:xs) (y:ys) = y:merge (x:xs) ys -- 1要素または空になるまで半分に分割を繰り返してからmergeによる結合(1要素のリスト、または空リストはソート済みのリスト) mergesort [] = [] mergesort [z] = [z] mergesort zs = merge (mergesort xs) (mergesort ys) where (xs,ys) = splitAt (length zs `div` 2) zs 分析については、プログラミングHaskellの最後の方に書いてるプログラムの論証を読むと参考になると思う >>41 も、設計もへったくれも無く、こうしたいなと言う脳内仕様をそのまま書いたし、checkPermuを外に追い出して差し替えられるようにしたいな。とか、長さの異なるリストも扱えるようにしたいな。という気まぐれでどんどん変更してた (そもそも設計が必要な規模じゃないが)
63 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 17:07:38.47 ] ちなみに数分で、行き当たりばったりで書いてみたRubyのコードはこんな感じ 手作業でやる場合の手順をそのままコードに書いた、非常に手続き的な思考回路だと思う class Array def my_permu return [] if empty? return [ns] if size == 1 result = [] each do |n| without_n = reject{|x| x == n } without_n.my_permu.each do |ary| result.push( [n] + ary ) end end return result end end p (1..3).to_a.my_permu
64 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 17:08:07.37 ] >>60-61 ruby挫折したりプログラマとしても挫折した(半年で才能無いと悟って辞職)私が褒められてる・・・ 設計経験Zeroですよ^^;
65 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 17:08:33.41 ] ごめんテストしてからレスすべきだった…
66 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 17:12:31.25 ] >>64 手続き的なやり方が合わなかったんじゃね? 俺は逆に、そういう式的というか関数的というか…そういう発想が出てこない まず最初に「それをやるなら、あれをやって、これをやってから…こうかな」と考えて、それをコード化してしまう その例で言えば俺の脳内ではまず「数字の書かれたカードを並べていき、並べたらメモる」という作業が行われる いきなりリストを組み合わせ分増やし、フィルタを掛けるなんて発想が出てこない
67 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 17:14:26.36 ] >>63 を修正 class Array def my_permu return [] if empty? return [self] if size == 1 result = [] each do |n| without_n = reject{|x| x == n } without_n.my_permu.each do |ary| result.push( [n] + ary ) end end return result end end p (1..3).to_a.my_permu
68 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 17:55:38.95 ] 褒められてイイナァ… オレのコードは誰も褒めてくれなかった。それどころかオセロの難解コートと同列扱いされる始末…orz
69 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 17:59:46.60 ] でもまあ、この程度の規模ではオブジェクト指向が 出てこないのはやっぱりって感じ オブジェクト指向・・・設計部分の実装 関数型 or 手続き型 ・・・ 一処理の実装 といわれるのはこういうとことか
70 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 18:18:58.67 ] >>66 発想の基点は恐らく、リスト内包表記でしょうね 勝手に全ての組み合わせを生成してくれますし、条件で生成される組み合わせを絞り込める それを柔軟に扱えるようにしない手は無いな。と じつは、昔、別のスレでリスト内包表記と再帰の合わせ技は見掛けてたんですよ 発想だけ貰って、自分で自作しました 関数脳の作り方は今も昔も、どう言う関数?どう動くべき?です このメソッドを使ってとか、ここはポインタで・・・とかの発想は無いです 最初にベタな発想があって、流用できる関数があれば、流用する Q:lengthは何をする関数? A:リストを受け取って、長さを返す関数 Q:lengthはどう動くべき? A:先頭から、1ずつ足して行くべき Q:リストが空っぽになったら? A:足しても変わらない0を返す length [] = 0 length (_:xs) = 1 + length xs 流用版 length xs = sum [1 | _ <- xs] -- 上のQ&Aと、要素数と同じ数だけ1が入ったリストを生成して足し合わせるのは等価 多分、手続き脳ですでにプログラミング出来てる人は、最初から抽象的に考える素養はあると思うので、仕様をそのまま書いてる感覚さえ分かれば、一気に関数脳になると思います
71 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 18:35:37.90 ] 昔Smalltalkという言語があったけど普及しなかった。 これは局所的なコードは手続き型のほうが恩恵あることを示している。 C++やJavaが受け入れられたのは局所的でないところでは OOの援用が有効だということを示している。 関数型と対峙するのは手続き型。 受け入れられるとしたらOOと手続き型の中間地点なんじゃないかな。
72 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 18:46:14.25 ] >>70 俺の場合、まず >>67 のように書いてから、それを発展させて初めて関数的コードになる感じになる 実は前スレの >>172 を書いたのも俺なんだが、同じようなコードをまず書いて、それを inject に直した そこから更に発展させると関数型言語のコードとして成り立つようには出来ると思うが(inject→foldlの変換は難しくないし) 本当に関数型な人のアプローチとはやはり違う形になってしまうんじゃないかなと思う
73 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 19:03:33.53 ] >>70 関数に焦点があたってるけどさ、 それより大きな範囲のオブジェクトはどうするのさ?
74 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 19:06:22.94 ] >>71 昔は、手続き型とか関数型とかの選択肢より、切実にメモリやCPU速度が足りなくて、Cが選択されて、速度を損なわずOOP出来るC++が選択されてきた(OOPも最初はメモリの無駄が多いと敬遠されてきた) PCの進化とともにLLが選択される場面が増えて来たのと同様に、関数型言語が選択される場面が増えても不思議ではない ・・・けど、C系列の言語が多く選ばれるんだろうな do記法も、モナドが何となく分かってくると順番が重要な処理をこれまた仕様通りに書いてるだけって気付くし、手続き型を見事に矛盾無く関数型言語でエミュレートしてる事に気付いて鳥肌立つんだが 順序の無い関数の世界で順序の概念をエミュレートしてるって凄い!って 前スレの「テキストファイル読み込んで、行番号つけて表示せよ」ってのを読みやすく?書いてみた import System.Environment numbering xs = unlines $ map (\(x,y) -> show x ++ y) (zip [1..] (lines xs)) main = do fnames <- getArgs fstrings <- mapM readFile fnames let numfstrings = map numbering fstrings putStr $ unlines numfstrings
75 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 19:17:21.85 ] 速度やメモリの問題はJavaやJavascriptが普及した時点で終わってる。 とくにJavascriptは関数型風にも書けるけどただの趣味の範囲で終わってる。
76 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 19:18:44.83 ] 何を持って趣味なのかわからんけど、 ブラウザで動く言語はJavaScriptで決まりだよ。
77 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 19:22:04.44 ] 副作用なしラムダ計算だけで記述するJavascriptって意味なんだが
78 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 19:24:17.12 ] 順序をリストにしてるだけだと思うんだが
79 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 19:57:11.75 ] 速度やメモリからすれば 関数型言語は無駄が多いからね。
80 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 20:42:28.52 ] >>71 Objective-CとC#は局所的であることを怖れないが、そういうのは受け入れられにくい C++とJavaが受け入れられたのは、局所化でないところが実在するのではなく 漠然と、どこかそういうところに行きたいという願望があっただけだろう
81 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 20:43:30.86 ] 何言ってるかさっぱりわからんw
82 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 21:27:01.14 ] >>73 意味が分からない 親が動物クラスで子が犬クラス・猫クラスとかのあれ? 型の性質を引き継ぐと言うのは型クラスとか有るけど・・・ ええと・・・で、そのオブジェクトで何をしたいの?どう拡張したいの?それって、オブジェクトである必要あるの? 犬か猫かに合わせて泣き声変えるんなら data Animals = Dog | Cat deriving (Eq,Show) voice a | a == Dog = "wan wan!" voice a | a == Cat = "nya- nya-!" これで十分なんだけど・・・そして、どっちもanimals型 犬は猫じゃないし、猫も犬じゃない taroは犬で、taroという名前で、7歳 taro = (Dog,"taro",7) miiは猫で、miiと言う名前で、3歳 mii = (Cat,"mii",3) taroは猫じゃないし、miiは犬じゃない let animalCategory (x,_,_) (y,_,_) = x == y animalCategory taro mii >False
83 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 21:30:52.01 ] >>80 全部受け入れられている言語だと思うが・・・ 言語なんて金になるかどうかで受け入れるかどうかが決まるもんだよ 関数型言語で金になる話が無いだけ と言うわけで関数型言語でスマフォアプリ作れる環境を(ry
84 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 21:32:33.29 ] >>82 犬とか猫を どうやって関数型言語で表現するの?
85 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 21:35:40.55 ] >>83 これを本気でいうからなぁ
86 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 21:54:02.37 ] >>84 犬とか猫を どうやってオブジェクト指向言語で表現するの? まさか class Dog のインスタンスが犬なの?www
87 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 21:54:21.43 ] >>83 言いたい事は分かったが、なんでUMLで分析しないの? 金銭の概念をオブジェクト指向分析すればいいのに、なぜ犬と猫なんだ?
88 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 21:57:00.90 ] >>86 型と値の区別ついてるかな?
89 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 21:58:20.34 ] >>88 もちろん だからクラスではなくインスタンスだって言ってるだろ
90 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 22:08:10.34 ] >>84 え、表現できてるでしょ? むしろ、DogもCatもAnimalsに属してるのであって、オブジェクト指向のDogとCatがAnimalの子って言う関係の方が不自然だよ そして、SnakeやLionが増えても、Animals型である限り、同じ関数が使えるし、せいぜい1つの機能に付き、一つの関数書き換えで済む(泣き声変えるために、いちいちクラスごとにvoiceメソッドを書く必要も無い) OOPLでもジェネリックやテンプレートで型ごとにメソッド書くでしょ? でもそれって、OOPLの利点じゃないと言うか、むしろ関数型言語の方が強力 voiceメソッドがAnimalクラスや、その子クラスにあるのは良いけど、animalCategoryメソッドをAnimalクラスが保持するのは不自然。そうなると、関数型では存在しない第3のクラスを作る必要が出てくる(Categoryクラスみたいな?) 関数型言語のデータはデータ。関数は関数。という関係の方が、シンプルに思える
91 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 22:08:18.46 ] 争いは、同じレベルの者同士でしか発生しないのAA
92 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 22:12:10.32 ] >>90 それって、関数型言語でオブジェクト指向やってるだけですよね?
93 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 22:19:51.16 ] >>82 一応さ、型クラス使った方が良いと思うので貼っとくね Animalに動物足すたびに代数データ型を変更するのはアレなんで class Animal a where voice :: a -> String data Dog = Dog deriving (Eq, Show) instance Animal Dog where voice _ = "wan wan!" data Cat = Cat deriving (Eq, Show) instance Animal Cat where voice _ = "nya- nya-!" taro = (Dog, "taro", 7) mii = (Cat, "mii", 3)
94 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 22:35:52.14 ] >>87 いや、プロじゃないんでUML触ったこと無い 名前しか知らん プロの視点で関数型言語とオブジェクト指向言語の生産性の比較とかやって欲しいところ 素人視点(=感覚的)では、LLとの比較でも、rubyやpythonは記憶力勝負(多くのメソッドを記憶してれば効率的。むしろ、何もメソッド知らない状態だとほぼ何も出来ない) Haskellは少ない知識で割と素人でも何とかなる(既存の関数知ってる方が効率的なのはLLと変わらないが、何も知らない状態での開発効率に雲泥の差がある) 初学者へのモチベーション維持と言う意味では、関数型言語の方が向いてると思う そして、最終的な生産効率はLLと変わらないか若干劣る(読みやすさ重視だとほぼ差がなくなる) 昔、length関数をrubyでどう書くの?と言う質問に対して、メソッドとクロージャ駆使して短いコードが返ってきた 素人じゃとても書けないと思った Haskellなら基本的な再帰関数の作り方覚えるだけで作れるものが、LLだとそれなりの知識を必要とするのだと感じた瞬間だった
95 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 22:43:11.49 ] >>73 Haskellばかり話題に登るのでMLに触れておくと、 MLにはモジュール(関数とデータの集合)というものがあり、 さらにモジュールを引数に取ってモジュールを返す関数(Functor)がある これはOOPでいうとクラスからクラスへの関数を定義できるようなもの カプセル化?差分プログラミング?全部余裕ですよ
96 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 22:48:52.63 ] 別に完全否定してるわけじゃないのにできますよって 余計なこと考えるだけのメリットが聞きたいのに
97 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 22:56:12.60 ] メソッドをどのクラスに入れるか迷うようなことは無くなるね 例えば文字列のリストのjoinを ",".join(strlist) とするか strlist.join(",") にするかみたいなね
98 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 23:05:31.47 ] >>92 ・・・・え? オブジェクト指向設計って事? 意識したこと無いけど、これがそうなのか・・・ まあ、関数型言語は色んな角度の視点を許容する感覚はあるかな 何だろう。破壊的な代入が出来ない分、そのものの性質を見ようとする体質に自然となるような・・・ Haskell でリストの要素を swap する 9 つの方法 jutememo.blogspot.jp/2011/04/haskell-swap-9.html >>70 のlengthも視点の角度が違うだけで等価なものだしプログラミングHaskellの付録Aに書いてるlengthの定義もまた違う視点 length = foldl (\n _ -> n + 1) 0 -- 初期値0とリストの先頭要素を受け取るが、初期値に+1を繰り返すだけ、リストが空になったら蓄積変数(初期値0のもので、リストが空になるまでひたすら+1されてた変数)を返す 仕様の表現の仕方に色んな表現があるけど、OOPLや手続き型は表現自体を制限されてる感じ だから、そのまま仕様をコードに落とせないと感じるのかも・・・
99 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 23:08:49.08 ] OOも知らないで語ってたのかw
100 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 23:11:21.47 ] ライムゲームを関数型で設計したら間違いなく不便
101 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 23:16:53.03 ] すっぱそうだな
102 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 23:23:09.41 ] >>99 でも、ぶっちゃけOOの定義定まってないだろ、このスレで 下手すりゃデータと関数を一纏めにしたらOO、くらいの勢いだぞ
103 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 23:32:16.09 ] >>95 HaskellでもFancterやArrow使うと表現が広がるってのは良く見かけます 自分もMonadoやFancter・Arrowを自作できると楽しみが広がりそうで楽しみに学習続けてます (でも現時点でさえ、Rubyでどう書くの?って処理もHaskellで書けてるのですでに関数型言語マンセーですが) 短く書けても、そもそも知識がないんじゃ書けないなら意味がない(と言うのは言い過ぎだが、学習コストが高い) と言うのが私の持論です
104 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 23:42:25.23 ] >>100 んなこたー無い そもそも、ライフゲームはプログラミングHaskellで載ってる 入門書でライフゲーム書かせるOOPLの入門書って何があるよ ちゃんと読めばdo表記やIOモナドの洗練されてる事が分かる
105 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 23:42:42.99 ] 最小公倍数は間違いなくあるだろ。 OOはオブジェクトを起点としたプログラミング(設計) 関数型ならλ計算を起点としたプログラミング OO側は最小公倍数を前提してるものが多いのに対し 関数型は言語サポートでそれもできるというレスが多い(Haskeller以外のことね) 俺は関数型のメリットは副作用の排除の明示にあると思ってるから OOベースの言語に相当の機能追加すればいいんじゃないのっていうスタンス 状態をベースにしないということはモナドで状態を表現して状態を引数 実際D言語はpureキーワードあるけどね 細部の状態を追い出すのは本末転倒(メリットが少ない)だと思うし GUIやOSを見れば分かるように大枠から状態ベースをやめるのは直感的じゃないと思う。 状態を排除する方向じゃなくコーディングレベルで状態を追い出せる記述力を持たせる。
106 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 23:44:50.01 ] >>104 もちろん読んでるから知ってるし自分で書いたよ あれ書いててあれば作りやすいというならば完全に平行線だし おれの感想は「うそつき」だね ちなみにライフゲームはOOで書く必要ない。 「状態」をオブジェクト分割する必要性がほぼ無いから
107 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/08(日) 23:51:09.92 ] ちなみに>>104 が言ってるのはこれね www.cs.nott.ac.uk/~gmh/life.lhs
108 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/09(月) 00:02:29.16 ] しかも「無理があると思える対話型プログラムを自然に書く」 というお題の章に乗ってるんだけどな。 つまり書けますよといっているだけでよりメリットがあるとは言っていない。
109 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/09(月) 00:06:55.06 ] 「無理がある」がかかってるのは「対話的プログラミング」の 部分であってライフゲームじゃない そしてHaskellでもIO使えば無理じゃないことを学ぼう、という 内容になってるのはちゃんと読んだなら知ってるな
110 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/09(月) 00:08:26.13 ] いやだからメリットが無いでしょって言ってるんだがなぜそこに触れないw 間違いなく手続きでシンプルにかけるんだが
111 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/09(月) 00:11:56.68 ] >>105 それを言うなら、手続き型ベースに、OOと関数型が乗っかる、だ。 だって、関数型OO言語は嫌なんだろ?
112 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/09(月) 00:13:17.49 ] ちなみに関数型でメリットがまったく無いとは思ってない。 状態を引数に追い出すことにより副作用がなくなるというのは 分かりやすくなる場面が必ずある。 ただ今のところD言語のpureキーワード以上のメリットはあまり感じられない。
113 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/09(月) 00:17:31.33 ] >>105 オブジェクトを起点としたプログラミングって何? ていうか、オブジェクトって何? 関数型言語では関数は第一級オブジェクトなんですが、その場合 関数を起点にしたらその時点でオブジェクト指向なんですかね? それとも「第一級オブジェクト」でいうところのオブジェクトとは違う 別のオブジェクトの定義があるんですかね?
114 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/09(月) 00:17:48.26 ] >>111 うーん別にそれでもいいが、 歴史的にはC言語のグローバル連発からC++のオブジェクト分割って流れだし 設計の面でもフローチャートよりオブジェクト指向分析のほうが大枠だし。 粒度で見ればオブジェクト指向>手続き/関数型が自然な解釈だと思うよ。
115 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/09(月) 00:28:37.22 ] >>113 そこの見分け方は「メモリ」です。 >関数を起点にしたらその時点でオブジェクト指向なんですかね? オブジェクト指向として捉えれば正しいとみることもできるけど (関数オブジェクトや関数ポインタをオブジェクトとして解釈する) それは関数型の視点ではない。 関数型特有の視点は一級オブジェクトを「引数」にできるという視点であって ここでの関数を起点というのはそういう意味。 これが納得いかないのならOOPLにも関数型言語にも両方のフレーバーはあるねというだけ。 別にオブジェクト指向のメリットを取り入れている関数型言語を全否定しないし 関数型の考え方を利用しているOOPも否定しない。
116 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/09(月) 00:32:33.68 ] >>113 あーはいはい。俺が変わりに答えるよ。 オブジェクトは日本語で「対象」とか「目的語」とかに訳されるね。 そんで何に対しての「対象/目的」かというと、それは述語、つまり、関数。 だから、 func1( a, b ); の func1 はオブジェクトとして扱われてない。 func2( func1 ); のfunc1 はオブジェクトはオブジェクトとして扱われてる。 つーわけで、引数に取れる=第一級オブジェクトってわけ。 >関数型言語では関数は第一級オブジェクトなんですが 引数に取れる訳だから、第一級オブジェクトで間違いないが、「指向」はしてない。 引数によって関数の呼び出し先がスイッチして始めてOO。 な、OOってつまらねーだろ。
117 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/09(月) 00:38:32.38 ] >>116 それでは f x を x の型で(型クラスで)スイッチしたらOOなんですね ただ型を集合で括っただけでオブジェクトを指向した記憶は無いんですが 確かにつまらないというか、ただの多態ですね
118 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/09(月) 00:40:07.49 ] 今北。前スレの行番号+カンマ化のやつ、SmalltalkのリクエストがあったのでSqueakで。 | fs | fs := { [| n | n := 0. [:str | (n := n +1) asString, ' ', str]] value. [:str | str, ','] }. FileStream fileNamed: 'text.txt' do: [:file | [file atEnd] whileFalse: [ Transcript show: (fs inject: file nextLine into: [:line :f | f value: line])]]
119 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/09(月) 00:41:46.80 ] OO=多態のレッテル貼りで話題ずらし
120 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/09(月) 00:43:14.06 ] >>117 そそ。 関数型言語でも、型システムがあったりして、 引数の型によって呼び出し先がスイッチするんなら、OOってことになるな。 だから、関数型言語のOOってのも普通にあるわな。(知ってるだろうけど)
121 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/09(月) 00:47:13.80 ] >>119 違うのですか? 違うなら説明してもらわないと分かりませんよ
122 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/09(月) 00:48:34.65 ] >>121 すでにループだと思うんだけど>>105
123 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/09(月) 00:50:51.79 ] あ、それと f x y z で x と y と z の型でスイッチするときに OOPで良くある x.f y z という表記は分かり難くないですか? なんで x だけ f の前に来てるんですか?
124 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/09(月) 00:54:44.64 ] >>122 だからオブジェクトを起点にしてるとだけ言われても分かりませんよ なんとなくの気分の問題なんですか?
125 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/09(月) 00:56:04.83 ] >>124 正直それで分からないときついと思うんだけど。 オブジェクト指向分析とかイメージできる?
126 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/09(月) 01:01:54.50 ] オブジェクトを起点にしたか否かなんて 設計者の心の中にしか無いのではないですか? 設計/分析されたものだけを見てオブジェクト指向か否か判定できるのですか?
127 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/09(月) 01:03:10.45 ] いや、>>92 を見ると判定はできるようですね その基準を教えてください
128 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/09(月) 01:06:40.85 ] >>126 それは正しいとも言えるし正しく無いとも言える。 設計者本人がどう設計したかを100%証明することはできないという意味では正しいが OOPLで書かれたコードをみてどう設計したかったを推測することは可能。 正直君のレスは哲学レベルの話でソフトウェア工学の話じゃない。
129 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/09(月) 01:09:01.03 ] >>128 ソフトウェア工学の話じゃないのは>>115 の説明ですよ >>116 の話は分かりますよ?ソフトウェアの機能について言及してますからね
130 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/09(月) 01:10:37.96 ] >>129 じゃあどこが理解できないか説明してもらえるかな あまりに共通言語なさそうだから説明は無理かもしれないけど。
131 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/09(月) 01:11:06.70 ] >正直君のレスは哲学レベルの話でソフトウェア工学の話じゃない。 お前のことだろw 自分で >>105 読み直してみろよw
132 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/09(月) 01:11:39.42 ] >>131 どこがか指摘してね
133 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/09(月) 01:18:56.56 ] >>130 「起点にする」を正しく定義してください それはソフトウェアの機能として定義できますか? プログラマの心理状態として定義するのですか? それとも哲学的な何かとして定義するのですか?
134 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/09(月) 01:20:45.64 ] >>133 えーと正直あほらしいです。 Wikipediaで気分に近い文章を引用してみます。 >ソフトウェア工学において、ソフトウェア (システム) を相互作用するオブジェクトの集まりとしてモデル化 (オブジェクト指向モデリング) する、オブジェクト指向に基づくソフトウェア開発の方法である。 ja.wikipedia.org/wiki/%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E6%8C%87%E5%90%91%E5%88%86%E6%9E%90%E8%A8%AD%E8%A8%88
135 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/09(月) 01:24:59.21 ] >>134 その定義は大分>>105 や>>115 と違いませんか? それはともかく、それでは関数がオブジェクトの関数型言語では 関数が相互作用してるのでオブジェクト指向ですね