1 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/07(土) 21:26:47.61 ] 一般的には、オブジェクト指向型言語が優勢でが 一部には関数型言語を崇拝している人もいます どちらが上なのか、この際はっきりさせましょう 前スレ toro.2ch.net/test/read.cgi/tech/1331328955/
651 名前:デフォルトの名無しさん mailto:sage [2012/05/01(火) 22:36:32.17 ] 型だよ型。
652 名前:デフォルトの名無しさん mailto:sage [2012/05/01(火) 22:37:00.05 ] 型の話しようぜ。
653 名前:uy mailto:sage [2012/05/02(水) 01:30:41.35 ] >>67 class Array def my_permu return [self] if size < 1 inject [] do |r , n| reject{|x| x == n } .my_permu.inject r do |r,ary| r << [n] + ary end end end end p (1..3).to_a.my_permu
654 名前:デフォルトの名無しさん mailto:sage [2012/05/02(水) 03:53:50.68 ] ぶっちゃけ関数型もオブジェクト指向もどうでも良くて 自分が使ってる言語以外をdisりたいだけだよね
655 名前:デフォルトの名無しさん mailto:sage [2012/05/02(水) 11:28:46.31 ] >>653 まだpermutationやってんのかよ、こんなもんがそんな面白いか? perm [] = [[]] perm xs = [x:y | x <- xs, y <- perm $ filter (/=x) xs] main = print $ perm [1,2,3]
656 名前:デフォルトの名無しさん mailto:sage [2012/05/02(水) 11:34:39.78 ] こっちは要素の重複を取り除かないバージョン import Data.List perm' [] = [[]] perm' xs = [x:y | x <- xs, y <- perm $ delete x xs]
657 名前:uy mailto:sage [2012/05/02(水) 13:23:15.71 ] >>655 Rubyのpermutationって誰も知らないのか話題にならないから俺が最初に2chにコード投下したやつじゃん(半年前くらいに) 67の冗長ゴミカスRubyソースコードを添削しただけだよ
658 名前:デフォルトの名無しさん mailto:sage [2012/05/02(水) 13:33:49.06 ] へえー、これ良いね。
659 名前:デフォルトの名無しさん mailto:sage [2012/05/02(水) 15:29:43.37 ] >>658 いやHaskellでもRubyでも標準添付や組み込みのライブラリに入ってますし…
660 名前:デフォルトの名無しさん mailto:sage [2012/05/03(木) 10:07:46.90 ] >>655 要素の重複を取り除くところでバグるかもしれない点は面白い
661 名前:デフォルトの名無しさん mailto:sage [2012/05/03(木) 14:24:19.11 ] >>655 を Squeak Smalltalk で書いてみた。バグもそのまま。 perm := [:xs | xs ifEmpty: [#(())] ifNotEmpty: [ xs gather: [:x | (perm value: (xs copyWithout: x)) collect: [:ys | {x}, ys]]]]. perm value: #(1 2 3) "=> #((1 2 3) (1 3 2) (2 1 3) (2 3 1) (3 1 2) (3 2 1)) "
662 名前:デフォルトの名無しさん mailto:sage [2012/05/03(木) 20:11:32.07 ] >>653 も書いてみた。これも重複要素があるとバグる。 SequenceableCollection >> perm self size < 1 ifTrue: [^Array with: self]. ^self inject: #() into: [:r1 :n | (self reject: [:x | x = n]) perm inject: r1 into: [:r2 :ary | r2 copyWith: (ary copyWithFirst: n)]] #(1 2 3) perm "=> #((1 2 3) (1 3 2) (2 1 3) (2 3 1) (3 1 2) (3 2 1)) " ちなみに、Squeak Smalltalkで組み込みのpermutation相当を見たらこんなふうに 破壊的操作による実装だった。 class Array def perm_each(&block) clone.perm_start_at(0, &block) end def perm_start_at(n, &block) return if n > size-1 return block.call(self) if n == size-1 (n..size-1).each do |i| swap!(n, i) perm_start_at(n+1, &block) swap!(n, i) end end def swap!(a, b); self[a], self[b] = self[b], self[a] end end
663 名前:デフォルトの名無しさん mailto:sage [2012/05/04(金) 12:04:28.46 ] F#で遅延評価 let bind m f = seq {for x in m do yield! (f x)} let ret x = Seq.singleton x let rec perm xs = if Seq.isEmpty xs then ret Seq.empty else bind (seq {0 .. (Seq.length xs - 1)}) (fun n -> bind (perm (Seq.append (Seq.take n xs) (Seq.skip (n+1) xs))) (fun ys -> ret (seq {yield (Seq.nth n xs); yield! ys})))
664 名前:デフォルトの名無しさん mailto:sage [2012/05/05(土) 00:05:09.38 ] ttps://metalab.at/wiki/Lambdaheads こんなひとおる?
665 名前:デフォルトの名無しさん mailto:sage [2012/05/06(日) 08:01:00.40 ] 未だに関数型言語の機能が欲しいと思ったことがない。 俺みたいな奴は案外多いんじゃないかね。 そんなことよりトランザクショナルメモリはよ。
666 名前:デフォルトの名無しさん mailto:sage [2012/05/06(日) 09:25:35.24 ] 欲しいと思う機能はそれほど多くない だが変な機能をゴリ押しされるとそれに対抗するものが欲しくなる ゴリ押しを断るために、先約があるとかいって他のを抜擢するみたいな話は案外多い
667 名前:デフォルトの名無しさん mailto:sage [2012/05/06(日) 11:09:05.44 ] うむ。関数型言語というより コレクションライブラリがあれば 十分だったりするw Guavaおすすめ
668 名前:デフォルトの名無しさん mailto:sage [2012/05/06(日) 12:23:52.01 ] ム板の関数型言語派の大半は「関数型言語派」ではなく「型推論派」だろ
669 名前:デフォルトの名無しさん mailto:sage [2012/05/06(日) 12:33:51.12 ] スレタイが無知だな。 手続型 vs 関数型 構造化設計 vs オブジェクト指向設計
670 名前:デフォルトの名無しさん mailto:sage [2012/05/06(日) 12:34:57.95 ] >666 メタプログラミングなんてどう? LISPのように構文を犠牲にしないMPといえば、OO系が主流だろう。
671 名前:デフォルトの名無しさん mailto:sage [2012/05/06(日) 12:59:41.15 ] コレクションにもpush型とpull型があって push型は一昔前のOO pull型は遅延評価できるので関数型に近い印象がある 最近はpull型も普及したので、まだ売れ残っている型推論の方が関数型らしく見える メタプログラミングは、共通のVMまたはC言語の上に好きな言語を乗せるのが主流
672 名前:デフォルトの名無しさん mailto:sage [2012/05/06(日) 13:07:46.75 ] メタオブジェクトプロトコルみたいな話は最近どうなったのか
673 名前:デフォルトの名無しさん mailto:sage [2012/05/06(日) 16:21:50.38 ] >>671 一昔前がよくわからないのでpull型とpush型の違いがよくわからんです
674 名前:デフォルトの名無しさん mailto:sage [2012/05/06(日) 17:41:19.49 ] >>673 getterを呼び出したり成功か失敗か調べたりするのがpull型 getter反対派はpush型
675 名前:デフォルトの名無しさん mailto:sage [2012/05/06(日) 19:43:30.18 ] 言語はなんでもいいので具体例をプリーズ。
676 名前:デフォルトの名無しさん mailto:sage [2012/05/06(日) 20:31:27.12 ] pushとかpullなんて名前は知らないけどこんな感じなんじゃね? サンプルはJava。上がきっとpushで下がpull www.akirakoyasu.net/2011/01/15/218/ List<B> blist = new ArrayList<B>(alist.size()); for (A a : alist) { blist.add(new B(a)); } Guavaを使う場合は次のように書きます。 List<B> blist = Lists.transform(alist, new Function<A, B>(){ @Override public B apply(A a) { return new B(a); } });
677 名前:デフォルトの名無しさん mailto:sage [2012/05/06(日) 20:34:08.65 ] いまさらだけど、>>671 の pullとpushの言葉の使い方逆じゃね?
678 名前:デフォルトの名無しさん mailto:sage [2012/05/06(日) 20:43:49.33 ] >>677 放置したほうがいい人だと思うがどうか? "Push-Pull Functional Reactive Programming"風に、 pull: demand driven push: data driven ってことでいいかと。
679 名前:デフォルトの名無しさん mailto:sage [2012/05/06(日) 20:45:09.00 ] 言葉のままに捉えればよいんじゃない? pullは引く。 result = hoge( piyo( huga() ) ); pushは押す。 huga( result ); piyo( result ); hoge( result );
680 名前:デフォルトの名無しさん mailto:sage [2012/05/06(日) 20:59:16.39 ] >>678 遅延評価はdemand drivenだから、671は合ってるだろ
681 名前:デフォルトの名無しさん mailto:sage [2012/05/06(日) 21:05:42.54 ] 一箇所だけ取り上げてそんな事言われても困りますよ。
682 名前:デフォルトの名無しさん mailto:sage [2012/05/06(日) 21:16:14.00 ] >>677 は0箇所ですよ 0箇所よりも1箇所の方がいいんじゃないか
683 名前:デフォルトの名無しさん mailto:sage [2012/05/06(日) 21:18:45.89 ] pullとかpushって>>671 が作った言葉だろ? 手続きタイプと、コールバックタイプとかでいいんじゃね?
684 名前:デフォルトの名無しさん mailto:sage [2012/05/06(日) 21:23:25.41 ] なんだ、オレオレ用語かよ
685 名前:デフォルトの名無しさん mailto:sage [2012/05/06(日) 21:44:18.93 ] >>682 まあそりゃそうだねw push/pullは、上に上げたようにFRPでも取り上げられてるし、 他にはWebアプリフレームワークとかXML系APIとか、 いろいろなところでAPIデザインの選択肢として語られてる。 大げさに騒ぐような概念じゃないけど。
686 名前:デフォルトの名無しさん mailto:sage [2012/05/06(日) 21:51:58.49 ] ja.wikipedia.org/wiki 繊維強化プラスチック 繊維強化プラスチック(せんいきょうかプラスチック、Fiber Reinforced Plastics、FRP)は、 ガラス繊維などの繊維をプラスチックの中に入れて強度を向上させた複合材料のこと。 単に FRP と書いて、ガラス繊維強化プラスチックを指すことも多いが、 ガラス繊維であることを明示したい場合は GFRP または GRP (Glass fiber reinforced plastics, Glass-reinforced plastics) と書かれる。
687 名前:デフォルトの名無しさん mailto:sage [2012/05/06(日) 22:02:41.17 ] URL貼れってか conal.net/papers/push-pull-frp/push-pull-frp.pdf
688 名前:デフォルトの名無しさん mailto:sage [2012/05/06(日) 22:14:04.87 ] でも、FRP自体は明らかに関係ない概念だよね? pullとpushの概念引っ張ってくるためだとしても。 それに、Getter/SetterをPull or Pushに分類しようとするのは 独自解釈が過ぎるでしょ
689 名前:デフォルトの名無しさん mailto:sage [2012/05/06(日) 22:15:07.62 ] なんだF#用語か。pro.art55.jp/?eid=1303925
690 名前:デフォルトの名無しさん mailto:sage [2012/05/06(日) 22:19:52.64 ] >>671 はオレオレ定義すぎ。 >>676 の下がpush。上はシラネ。 だろ。普通にpull/pushを考えるなら。
691 名前:デフォルトの名無しさん mailto:sage [2012/05/06(日) 22:23:38.07 ] >>688 > でも、FRP自体は明らかに関係ない概念だよね? ちょっと難しい例でごめんね。
692 名前:デフォルトの名無しさん mailto:sage [2012/05/06(日) 22:28:26.04 ] >>691 難しい例もなにも、普通にFRP関係ない例しかでてないぞ。 関係あるんなら関係ある例になるコードをださんと。
693 名前:デフォルトの名無しさん mailto:sage [2012/05/06(日) 23:30:20.47 ] >>688 つまり、まず質問をして、独自ではない回答が出るまで待っていればいいんですかね 関数型言語がgetterの使用を制限しない理由は何でしょうか
694 名前:デフォルトの名無しさん mailto:sage [2012/05/07(月) 06:32:00.39 ] 関数型ってパターンマッチとか、再帰とか、モナドとか、そんな程度のものなの? もっとすごい秘密兵器があるんじゃないかなぁと期待しているんだけど、イマイチ見えてきません。 型クラスのメリットは、クラスを使った不完全な抽象データ型オブジェクト指向より 定式化され優れているとわかるとしても、両者は必ずしも背反するものではないですよね? 参照透明性にしても抽象度やモジュラリティは上げられる反面、直感的でない回りくどい処理や そのための記述を強いられたりする局面も少なからずあるし、そうしたやり難さと引き換えに 関数型でゴリ押しするメリットってどこら辺にあるのでしょうか?
695 名前:デフォルトの名無しさん mailto:sage [2012/05/07(月) 09:50:54.31 ] 高階プログラミングではないかと昨夜から今朝にかけて思った。 いわゆるメタプログラミングや自己反映計算を実現する方法として、 自己書き換え→テンプレやマクロ→...というように発展してきて、 関数合成とかでプログラミングをするようになった、というか。
696 名前:デフォルトの名無しさん mailto:sage [2012/05/07(月) 10:34:09.89 ] 関数合成はメタプログラミングに入りますか?
697 名前:デフォルトの名無しさん mailto:sage [2012/05/07(月) 11:00:16.79 ] >>694 代入を制限する関数型が、get/setの両方を制限するオブジェクト指向よりも回りくどい と言われるのは何故ですか?
698 名前:デフォルトの名無しさん mailto:sage [2012/05/07(月) 11:08:18.79 ] Smalltalkが普及しなかったようにHaskellは普及しない
699 名前:デフォルトの名無しさん mailto:sage [2012/05/07(月) 11:19:44.93 ] 「get/setの両方を制限」のところがよくわからないので具体的にお願いします。 あとなんでその「get/setの両方を制限」が関数型の再代入制限に対応すると 思われたのでしょうか?
700 名前:デフォルトの名無しさん mailto:sage [2012/05/07(月) 11:50:13.94 ] こうかいかんすう
701 名前:デフォルトの名無しさん mailto:sage [2012/05/07(月) 12:01:35.13 ] 高階関数って関数オブジェクトがファーストクラスなら どうということなく使えますよね。それでもやっぱり 関数型の秘密兵器なんでしょうか? カリー化が自動だったり関数合成演算子が組み込みなのは嬉しいけど、 OOPLであっても関数オブジェクトがそうであればいいだけって気もしますし、 ポイントフリースタイルで書こうとしてパズルみたいになるのも 何だか本末転倒な感も否めません。
702 名前:デフォルトの名無しさん mailto:sage [2012/05/07(月) 12:15:37.81 ] OOPLでもできるって 頑固なOOPLのスタイルを変えさせることができるなら凄い兵器だ
703 名前:デフォルトの名無しさん mailto:sage [2012/05/07(月) 12:35:48.84 ] 頑固なOOPLのスタイルってどんなの?
704 名前:デフォルトの名無しさん mailto:sage [2012/05/07(月) 12:54:07.33 ] >>701 別に秘密兵器でも何でもなく、関数型の思想のうち 手続き型でも適用出来そうな部分は既に受け入れられてるってことさ
705 名前:デフォルトの名無しさん mailto:sage [2012/05/07(月) 15:35:46.86 ] >>694 「ゴリ押しする」ってのは、あなたの心の問題じゃないの?
706 名前:デフォルトの名無しさん mailto:sage [2012/05/07(月) 15:47:21.06 ] 関数型の主力は副作用が無いこと 手続き型の主力は副作用が有ること OOPは副作用の局所化を目指すもの 異論は認める
707 名前:デフォルトの名無しさん mailto:sage [2012/05/07(月) 17:50:02.95 ] 副作用があるのはsetterだけ getterの局所化には副作用以外の目的があるだろう
708 名前:デフォルトの名無しさん mailto:sage [2012/05/07(月) 18:08:27.94 ] そうかしら?
709 名前:デフォルトの名無しさん mailto:sage [2012/05/07(月) 18:09:54.21 ] >>707 一体いつからgetterに副作用が無いと錯覚していた? getで内部キャッシュを生成,保持しても良く 副作用は外から分からずとも、仕様(期待)通り動作すればいい
710 名前:デフォルトの名無しさん mailto:sage [2012/05/07(月) 18:47:24.86 ] しかし実際にはオブジェクトが他のオブジェクトの参照を握ってたりして、 一回のメソッド呼び出しがどんどんたらい回しされてって。 特にオブジェクト指向では多態のためにメソッドのシグネチャを固定化するから、 オブジェクトが他のオブジェクトの参照を握る傾向は強い。 つまり、オブジェクト指向で副作用の局所化はされないし、元々狙っても無い。 オブジェクト指向はオブジェクトに関するコードや変数の依存関係を纏めたってだけ。 これを手続き型で実行すれば、処理がオブジェクトを跨いであちこちに飛び回る。 このとき、副作用は局所化されない。 副作用の局所化するためには、処理がオブジェクトを跨がないように する必要がある。 しかし、それはオブジェクト指向とは関係無く、手続き型一般における、設計のテクニックだ。
711 名前:デフォルトの名無しさん mailto:sage [2012/05/07(月) 19:01:14.42 ] ・シグネチャを固定化 → 他のオブジェクトの参照を握る ・副作用の局所化するため → 跨がないように この辺前後の関連がよく分からないので詳しくお願いします
712 名前:デフォルトの名無しさん mailto:sage [2012/05/07(月) 19:09:28.48 ] どう言えばよいんだろうね。 オブジェクト指向はオブジェクト単位で色々纏めるが、これらは変数やコードといった、 静的な要素を分類したに過ぎない。 言い換えれば、「ソースコード」をオブジェクト単位で分類したに過ぎない。 一方で副作用はソースコード上には現れない。 実行時に「処理」にくっ付いて現れる。 だから、副作用を局所化するためには、処理の流れそのものを 局所化する必要があって、これは手続き型一般の設計の問題で、 OOだからどうこうという話ではない。 OOはあくまでソースコードをオブジェクト単位で局所化するだけで、 それ以上は助けてくれない。
713 名前:デフォルトの名無しさん mailto:sage [2012/05/07(月) 19:26:38.69 ] >>709 それはgetterを作って良いし副作用が有って良いという意見だな そういう自由な考え方が定着すれば、OOに反対する人はいなくなると思う
714 名前:デフォルトの名無しさん mailto:sage [2012/05/07(月) 19:29:05.25 ] そんでついでに言うと、 オブジェクト指向は処理の流れに関して凄く無頓着な一面がある。 というのも、仮想関数だ多態だといってな。 そんで、むしろソースコードみたいな静的なものは怖くねーよ、 こんなの綺麗に分類するより、 処理の流れとその副作用の方がよほど怖えーよ、そっち整理しろよ、 って考え方もあって、OOは使いどころが難しく、2chなんかで議論もこじれる。 だから皆だんだん嫌になってきて、 処理の流れそのものを気にしなくて良い関数型に白羽の矢が立ったってわけ。
715 名前:デフォルトの名無しさん mailto:sage [2012/05/07(月) 19:48:12.05 ] 俺にとっての副作用を局所化というのは 「この変数を触るのはこの処理だけ」といった スコープを小さくしたり責任範囲の壁を作ったりすることなんだけど >>712 にとっての副作用の局所化というのは 何かのメソッド呼んだときに変化するN個のオブジェクトのN個の変数とか その辺りに言及してるのかな? メソッドの中で自身(A)が持ってる別のオブジェクト(B)のメソッドを呼んだとして そこから先でファイルアクセスが発生しようと それはBの範疇なのでAの中での局所化には関係無い というスタンスかな、俺はね >処理の流れに関して凄く無頓着 そうかもね 他のオブジェクトは外面(インターフェイスと仕様)しか見ないので 処理の内容は「あとは任せた」って感じだし
716 名前:デフォルトの名無しさん mailto:sage [2012/05/07(月) 20:17:37.37 ] >>715 これは物凄く悪い例なんだけど、 AがBのメソッドを呼び出して、 そのメソッドの中でBがAのメソッドを呼び出したら、 カプセル化は壊れるんだよね。 そんな設計はするな、と言われそうだが、 これが結構良くあるんよ。 親が子の参照を持ってて、子も親への参照を持ってるとか。
717 名前:デフォルトの名無しさん mailto:sage [2012/05/07(月) 20:22:02.86 ] 循環参照は注意だが、カプセル化は別に崩れてなくね?
718 名前:デフォルトの名無しさん mailto:sage [2012/05/07(月) 20:22:28.51 ] カプセル化は言葉が悪かった。 整合性だね。
719 名前:デフォルトの名無しさん mailto:sage [2012/05/07(月) 20:40:40.96 ] AがcallするならBはreturnすればいいのに、なぜかBもcallしようとするんだな なぜreturnを避ける設計をしてしまうのか
720 名前:デフォルトの名無しさん mailto:sage [2012/05/07(月) 20:46:15.19 ] >719 てめぇ、CPSさんDisってんのか?
721 名前:デフォルトの名無しさん mailto:sage [2012/05/07(月) 20:49:59.90 ] >>716 >これが結構良くあるんよ。 わかる・・・ イベントハンドラとかのインターフェイスの実体として子に自身を渡すとか 木構造で高速化のためAが別のA(親)を持つとかは許容出来るけど 一つずつ順にコンパイル出来ないような定義レベルでの循環参照は俺も嫌い
722 名前:デフォルトの名無しさん mailto:sage [2012/05/07(月) 21:04:21.69 ] >>720 末尾呼出しなら問題なさそうだ 問題は、Aのメソッドの途中でAが参照されること
723 名前:デフォルトの名無しさん mailto:sage [2012/05/07(月) 21:18:02.26 ] >>718 言葉が悪いんじゃない。関係ないんだよ。
724 名前:デフォルトの名無しさん mailto:sage [2012/05/07(月) 21:29:27.23 ] >>722 ACTORさん(以下略
725 名前:デフォルトの名無しさん mailto:sage [2012/05/11(金) 20:23:27.60 ] それぞれのオブジェクトがメッセージを投げ合い、 その結果でたらめな順序で副作用が起こっても問題が無い 仮に問題あっても例外投げときゃ無問題 そういうイイカゲンなシステム開発にオブジェクト指向は最適
726 名前:デフォルトの名無しさん mailto:sage [2012/05/11(金) 21:46:23.18 ] さすがにそこまでいい加減なシステムは品質を確保できないだろ。バカにし過ぎ。 「そのように組むことができる」ことと「実際にそうする」は別問題。 Haskellでも副作用が発生する処理と、そうでない処理をごちゃ混ぜにすることは可能は可能だし。
727 名前:デフォルトの名無しさん mailto:sage [2012/05/12(土) 18:57:50.97 ] ここの人らなら詳しそうだから教えてくれ。 0 :: Integer 0 = 0 みたいな感じで、数値を関数化できる言語ってないの? 0関数にラムダ与えたら、ラムダの実行を無視して、 0以外の数値関数にラムダ与えたらラムダを実行するようにしたい
728 名前:デフォルトの名無しさん mailto:sage [2012/05/12(土) 19:03:59.81 ] は? 関数なら 'a -> 'b みたいな型を持ってるはずだけど。 Integer という型は整数の型であって、関数じゃないよ。
729 名前:デフォルトの名無しさん mailto:sage [2012/05/12(土) 19:09:46.34 ] 別にそこの式は、数値を関数化したいって例であって 関数を返すとかとは関係ないよ
730 名前:デフォルトの名無しさん mailto:sage [2012/05/12(土) 19:21:16.56 ] 「数値を関数化」ってのが、たとえば「文字列を虚数化」みたいに意味不明。 むしろ、 > 0関数にラムダ与えたら、ラムダの実行を無視して、 > 0以外の数値関数にラムダ与えたらラムダを実行するようにしたい こっちをソースコードで表現できたら、少しはなんとかなるかもしれない。
731 名前:デフォルトの名無しさん mailto:sage [2012/05/12(土) 19:41:40.45 ] あ゛?チャーチ数ディスってんのかメーン
732 名前:デフォルトの名無しさん mailto:sage [2012/05/12(土) 23:05:55.96 ] >>727 「0」というシンボルと、何らかの関数を結び付けたいということ? 関数型ならそもそも、既に何かに結び付けられてるシンボルに 別の値を結び付けるのは再代入そのものだろうし 手続き型関数型問わず、特定リテラルの意味だけを変更するのはちとマズくないかな
733 名前:デフォルトの名無しさん mailto:sage [2012/05/12(土) 23:10:21.88 ] common lispに変数としての値と関数としての値を区別するということなのか
734 名前:デフォルトの名無しさん mailto:sage [2012/05/12(土) 23:11:42.30 ] ごめん、脱字した。 common lisp(のよう)に変数としての値と関数としての値を区別するということなのか
735 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 00:06:48.19 ] >>732 Smalltalkなら実現してたべ value := 0. value message. こんな感じで、数値にメッセージを送ると、 数値に紐付いたメソッドを呼ぶ事ができた。 1にメッセージを送れば、1のメソッド。 2にメッセージを送れば、2のメソッドみたいにね。
736 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 01:07:22.66 ] 本のお題がどういうものだが今一歩ピンとこないが、 チャーチ数を計算する型なしラムダ式処理系なら結構転がってる。 数値や真理値は短形表示できるが。
737 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 02:06:34.64 ] >>735 何が言いたいのか分からん value message と function value は語順が違うだけじゃね?
738 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 02:12:38.75 ] >>737 Smalltalkが解らないとなるとlispなら解るかい (0 arg) 0関数を実行 (1 arg) 1関数を実行 別バージョン ( (lambda ( x arg ) ( x arg ) ) 0 arg ) 0関数を実行 ( (lambda ( x arg ) ( x arg ) ) 1 arg ) 1関数を実行
739 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 02:36:28.73 ] >>738 なるほど分かった 0や1といったリテラルに関数を割り当てたいってことだね どっちかというと関数型 vs. オブジェクト指向じゃなくて 静的型 vs. 動的型になりそうな気配
740 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 02:40:45.66 ] ところで>>727 のいう「ラムダ」の引数は何? それは何時渡すの?
741 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 02:44:08.62 ] >>740 値が関数だって事の説明用だから引数はなんでもいいんですが
742 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 02:49:18.06 ] >>741 意味論的には関数型言語の値は「ゼロ引数関数」という関数
743 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 08:04:27.03 ] いずれにしろ 0 :: Integer では、関数になってないから
744 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 10:20:35.18 ] OO信者の俺ですら数値クラスにメソッド追加するような コードは勘弁して頂きたい オープンクラスではしゃぐのは初心者時代で終わらせてほしい
745 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 11:09:32.18 ] >>735 >>738 シングルディスパッチでは第一引数を特別扱いしてるだけで x.foo y z と foo x y z に本質的な差は無い シングルディスパッチ脳には理解出来ないかもしれんけど
746 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 11:16:35.94 ] 難しい問題だね。 func( o1, o2 ) こういった関数は後からいくらでも追加できるけど、 o1.func( o2 ) との本質的な違いはスコープだけだからな。 多態出来る出来ないの違いは有るけど、それは言語上の制約ってだけだからね。 クラスの外のスコープにいくらでも関数が定義できるのに、 クラスの中のスコープにメソッドを追加することは出来ません、 って制約に一体どれほどの意味があるかって言われると、ねぇ。 特に動的言語では。
747 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 11:37:40.06 ] あんたの恣意的な分類で「本質」とか「言語上の制約ってだけ」とか言われても わかりませんわ。
748 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 12:25:07.97 ] 別に恣意的ではないと思うけど。 本来、どこのスコープに何を追加しようが勝手なものなんじゃないの? 静的言語では実行効率の理由で制限がかかってくるのも分かるけどさ。
749 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 12:32:53.64 ] Haskellでやっつけ お題の真意が掴めてないので、たぶん条件を満たしてない ideone.com/pTYEL
750 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 12:39:04.98 ] 0がどうのこうのの話は、まだ続いてたの? 0と1は同じ型だろうから、同じ関数にディスパッチされるのが当たり前だしさ。
751 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 15:59:42.13 ] >>742 そういう形式化もあるという程度の話。