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

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
だから、できない言語の事は聞いてなくて、出来る言語はあるかと聞いてるんですけど。



763 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 20:29:16.10 ]
>>762
スレ違いだし問題としても糞詰まらんから
どっか行けって言ってんだけど?

764 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 20:29:54.03 ]
何か値を返さなきゃならないみたいなので、>>757を修正
nilと値じゃなくてoption型使ってるけど

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

> (0).Execute (fun () -> "zero");;
val it : string option = None
> (1).Execute (fun () -> "one");;
val it : string option = Some "one"
> (1 - 1).Execute (fun () -> 1 - 1);;
val it : int option = None

765 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 20:32:20.89 ]
>>763
NGにしたいんでトリでも付けてもらえます?
スレ違い以前に話が通じないので

766 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 20:42:57.75 ]
>>763
まず日本語の通じないお前がどっか行けよ

767 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 20:44:48.51 ]
>>764
オブジェクトで出来てもあんまり嬉しくないんですが・・・

768 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 20:46:00.83 ]
>>765>>766
型付けの問題だって理解できない自分の低能さを
日本語の問題にすり替えるなよw

769 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 20:52:46.02 ]
>>761
「コンセントの付いている車はありますか?」
「軽トラなら無理です」
お前が言ってるのはこういう事だという自覚は有るのか?
普通は「あります」「ありません」この2択だろ
頭おかしいな

770 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 20:53:58.75 ]
>>767
Int32はラッパークラスとかではなく、プリミティブかつオブジェクトなんだけど。
まぁそれでもダメというならどうしようもない。

771 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 20:55:35.08 ]
>>764 のような Execute 的な関数を使うのってダメじゃね?
これアリなら難しくも何ともないじゃん


(|.) 0 _ = Nothing
(|.) x f = Just $ f ()

main = do
  print $ 0 |. (\_ -> "zero")
  print $ 1 |. (\_ -> "one")
  print $ (1 - 1) |. (\_ -> "zero")
  print $ (1 + 1) |. (\_ -> "two")

772 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 20:57:08.31 ]
>>770
すいません。
関数と互換性をもってて欲しいんですよ。



773 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 21:06:51.99 ]
>>771 >>772
てっきり拡張メソッド的なものを要求してるのかと思ってた。
Scalaなら暗黙型変換あるからできそうな気がする。

774 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 21:08:02.77 ]
>>773
なるほど。Scalaですか、調べてみます。

775 名前:デフォルトの名無しさん mailto:sage [2012/05/13(日) 22:46:41.69 ]
で、Scalaなら出来たの?

776 名前:デフォルトの名無しさん mailto:sage [2012/05/14(月) 00:37:38.04 ]
マイナー言語使い共が
可読性皆無のコード書く御題で
型付けの弱さを競うスレはここですか?

時代に逆行してて笑えるwww

777 名前:デフォルトの名無しさん mailto:sage [2012/05/14(月) 01:46:05.41 ]
誰だって0と1は同じ型だと考えるのに、違った振る舞いをさせたいってのは、
何か前提がおかしいんだろうね。
元々何がしたかったのか聞ければよいんだけど、
彼にそういった振る舞いが出来るとも思えないしなぁ。

778 名前:デフォルトの名無しさん mailto:sage [2012/05/14(月) 07:07:11.76 ]
うーん。一番良く分からんのは、>>767を読むと出題者は>>764を見て
オブジェクトとしてなら「出来ている」認定してるっぽい処だな。

779 名前:デフォルトの名無しさん mailto:sage [2012/05/14(月) 07:40:52.01 ]
出題者がOOP厨だからオブジェクトには甘いだけだろ
別に不思議でもなんでもない

もちろん出題者は底なしのアホだけど






[ 新着レスの取得/表示 (agate) ] / [ 携帯版 ]

前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