1 名前:営利利用に関するLR審議中@詳細は自治スレへ mailto:sage [2012/04/07(土) 21:26:47.61 ] 一般的には、オブジェクト指向型言語が優勢でが 一部には関数型言語を崇拝している人もいます どちらが上なのか、この際はっきりさせましょう 前スレ toro.2ch.net/test/read.cgi/tech/1331328955/
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 だから、できない言語の事は聞いてなくて、出来る言語はあるかと聞いてるんですけど。
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厨だからオブジェクトには甘いだけだろ 別に不思議でもなんでもない もちろん出題者は底なしのアホだけど