[表示 : 全て 最新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/

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
そういう形式化もあるという程度の話。

752 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 18:30:14.35 ]
このスレには時代遅れのSmalltalkを使ってる
奇特な人が居るから質問するんだけど、
あのIDEモドキを立ち上げずにプログラム実行する方法無いの?

それと動的型付けで実行が遅いから、せめてボトルネックだけでも
C/C++で書いて実行できないとトイプログラムでしか
使いモノにならないと思うけど、簡単にC/C++のライブラリとリンクできるの?

753 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 19:25:11.00 ]
たとえばVisualWorksやPharoといったSmalltalk処理系には
headlessといって、サーバーなどの用途に使う目的でIDE抜きで起動したり、
その際に指定した.stファイルを読み込んだり実行できる機能があります。

またGNU Smalltalkのように、標準入出力から使うことに特化して開発された
特殊な処理系もあるのでこういう処理系を最初から選ぶのもよいでしょう。

ただIDE抜きの使い方は他の言語と同様の使い方ができるというメリットがあると反面、
Smalltalkの独自の機能や優位性をかなりスポイルする使い方ということにもなるので
他の言語が選択できる状況であるならば、よほどSmalltalkを使い慣れた人でもなければ
そこまでしてSmalltalkを使うメリットはあまりないような気もします。
GNU SmalltalkやAmber Smalltalkといった特殊なSmalltalk処理系を使っての
Smalltalk入門があまり推奨されないのも同様の理由です。

SmalltalkからC/C++で書いた関数をコールするにはいくつか方法がありますが、
たとえば、商用のSmalltalkであるVisualWorksにはDLL and C Connectという方法が使えます。
www.cincomsmalltalk.com/pdf/DLLandCConnectGuide.pdf

PharoやSqueakではVMプラグインを書いてバイトコードを拡張したり、FFIが使えます。
wiki.squeak.org/squeak/1448
wiki.squeak.org/squeak/1414

754 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 19:48:37.96 ]
727です。
なぜかOOの話がでてますが関数型の話でOOは関係ありません。
OOPLでも同じ表現ができるというだけです。

で、本題ですが、最終的な目的としては下のようなラムダ演算ができる言語は
存在しないのかという話です。

( 0 (lambda () "true" ) ) 0関数はlambdaを評価せず、nilを返す
( 1 (lambda () "true" ) ) 1関数はlambdaを評価し"true"を返す
( 2 (lambda () "true" ) ) 1関数はlambdaを評価し"true"を返す

( (- 1 1 ) (lambda () "true" ) ) 0関数を評価する事になるのでlambda

755 名前:727 mailto:sage [2012/05/13(日) 19:54:33.33 ]
間違えて途中で書き込んでしまいました。すみません。

( 0 (lambda () "true" ) ) 0関数はlambdaを評価せず、nilを返す
( 1 (lambda () "true" ) ) 1関数はlambdaを評価し"true"を返す
( 2 (lambda () "true" ) ) 1関数はlambdaを評価し"true"を返す

( (- 1 1 ) (lambda () "true" ) ) 0関数を評価する事になるのでlambdaを評価しない
( (+ 1 1 ) (lambda () "true" ) ) 2関数を評価する事になるのでlambdaを評価しない

数値を関数化できないかというのは、数値を評価したとき、このような
振る舞いをするように数値を定義できなる言語は無いかという事でした。
尤も、言語レベルで最初から数値をチャーチ数と同じように評価できるなら
新たに関数として数値を再定義できる必要は無いんですが。

756 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 20:00:39.51 ]
>>752
時代遅れってアホか、通信・製造・金融・保険・政府。
お前がしらんだけで第一線で新規開発されとるわ。
国内企業なら、東洋ビジネスエンジニアリングとかが導入してんだぞ。

757 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 20:17:42.17 ]
F#でやってみた。
拡張メソッド定義してるだけなので、実質「Execute(0, fun () -> printnf "zero")」と同じ

type System.Int32 with
    member x.Execute func = match x with 0 -> () | n -> func()

> (0).Execute (fun () -> printfn "zero");;
val it : unit = ()
> (1).Execute (fun () -> printfn "one");;
one
val it : unit = ()
> (1 - 1).Execute (fun () -> printfn "zero");;
val it : unit = ()

758 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 20:19:29.56 ]
>>755
Integer と () -> Bool は違う型なので、
同じ数値(関数)の型が文脈に応じて変化する言語でなければ不可能。

759 名前:727 mailto:sage [2012/05/13(日) 20:19:44.31 ]
むちゃくちゃになっていたので直します。何度もすいません。
( 0 (lambda () "true" ) ) 0関数はlambdaを評価せず、nilを返す
( 1 (lambda () "true" ) ) 1関数はlambdaを評価し"true"を返す
( 2 (lambda () "true" ) ) 2関数はlambdaを評価し"true"を返す

( (- 1 1 ) (lambda () "true" ) ) 0関数を評価する事になるのでlambdaを評価しない
( (+ 1 1 ) (lambda () "true" ) ) 2関数を評価する事になるのでlambdaを評価する

760 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 20:20:46.22 ]
>>758
できる言語はあるかと聞いているのですが?
あとboolは関係ないですよね



761 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 20:24:09.03 ]
>>760
じゃあ Integer と (() -> a) -> a

それはともかく、関数型とか全然関係なくって
まともな静的型なら無理って言ってるんだけど、
動的型しか使った事無い馬鹿には分からないかな?

762 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 20:25:17.06 ]
>>761
だから、できない言語の事は聞いてなくて、出来る言語はあるかと聞いてるんですけど。






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

前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