関数型プログラミング言語Haskell Part34 (694レス)
関数型プログラミング言語Haskell Part34 http://mevius.5ch.net/test/read.cgi/tech/1639713446/
上
下
前
次
1-
新
通常表示
512バイト分割
レス栞
382: デフォルトの名無しさん [] 2024/09/30(月) 21:29:13.05 ID:8C0MP56i 一般国民。 λ計算のモデルでモナド作ってなにかいいことあるの?計算効果結局表現できないんじゃ? 拡張してcomputational lambda calculusやるって話? http://mevius.5ch.net/test/read.cgi/tech/1639713446/382
383: デフォルトの名無しさん [sage] 2024/09/30(月) 21:47:09.45 ID:CVtPTYpb ないんじゃないか ただ「具体例を出せば、いいことがある」とは誰も言ってない というファクトをチェックするのは悪いことではない http://mevius.5ch.net/test/read.cgi/tech/1639713446/383
384: デフォルトの名無しさん [] 2024/09/30(月) 21:53:56.34 ID:8C0MP56i いいこと(メリット)があるから具体例が作られると思うんだが。 それは単に具体例の適用が間違ってるって話じゃね? なんとなく作れるから群構造作ってみましたとかとか目的不在で作ったらそら何がいいかわからんし。 モナドだったら、各計算効果を圏(クライスリ圏)の中に閉じ込めることに成功しました(カプセル化)。 計算効果は強モナドの構造を取っているようです(計算効果の研究のとっかかり)。 みたいないいことあるから流行るんでしょ。 http://mevius.5ch.net/test/read.cgi/tech/1639713446/384
385: デフォルトの名無しさん [sage] 2024/10/01(火) 04:04:03.18 ID:PZ96E01/ 別にそれ圏論を持ち出す必要ないよね ハイおしまい http://mevius.5ch.net/test/read.cgi/tech/1639713446/385
386: デフォルトの名無しさん [sage] 2024/10/01(火) 09:39:15.78 ID:KbL1rq/V >なんとなく作れるから群構造作ってみました ルービックキューブのことか http://mevius.5ch.net/test/read.cgi/tech/1639713446/386
387: デフォルトの名無しさん [sage] 2024/10/01(火) 09:46:07.52 ID:y60InQ2q 数学屋さんもね 研究では圏を使うが 学生に教えるときは 圏を記述に使わず教えたりする http://mevius.5ch.net/test/read.cgi/tech/1639713446/387
388: デフォルトの名無しさん [] 2024/10/01(火) 19:23:20.12 ID:7kn4RxVI 圏論の話題になったから振ったのに。まあいいよ。 圏論根拠で(ソフトウェア工学的にじゃなくて)数学的にカプセル化が実現されてるってすごい ことだと思うけどね。 >ルービックキューブのことか ルービックキューブ解くという目的あるんなら構築する意味あるんじゃない。 http://mevius.5ch.net/test/read.cgi/tech/1639713446/388
389: デフォルトの名無しさん [sage] 2024/10/01(火) 19:34:54.43 ID:YZm15ve9 群持ち出したところで解けないよ http://mevius.5ch.net/test/read.cgi/tech/1639713446/389
390: デフォルトの名無しさん [sage] 2024/10/01(火) 20:18:43.32 ID:PZ96E01/ 圏論がプログラミングの問題解決に寄与するわけないのにね ただ当てはめてみたってだけのことを過大評価しすぎ http://mevius.5ch.net/test/read.cgi/tech/1639713446/390
391: デフォルトの名無しさん [sage] 2024/10/01(火) 20:52:10.03 ID:u1x9FxNe 雪田修一の「圏論入門 Haskellで計算する 具体例から」ってどうなん? http://mevius.5ch.net/test/read.cgi/tech/1639713446/391
392: デフォルトの名無しさん [sage] 2024/10/01(火) 21:10:04.55 ID:YpLGkLDy 板チ 目的と手段を混同したら予選敗退 http://mevius.5ch.net/test/read.cgi/tech/1639713446/392
393: デフォルトの名無しさん [] 2024/10/01(火) 21:16:26.45 ID:7kn4RxVI どうなんって何を知るのに?出たときに立ち読みしただけだけど。 http://mevius.5ch.net/test/read.cgi/tech/1639713446/393
394: デフォルトの名無しさん [sage] 2024/10/01(火) 21:16:56.98 ID:Ig6Tf0ue >>391 青本と似てて定義の後に具体例を出すみたいな感じだけど 具体例が数学科の人じゃないとわからない内容ばかりなので 結局個別の分野をやらないと理解できないと思う http://mevius.5ch.net/test/read.cgi/tech/1639713446/394
395: デフォルトの名無しさん [sage] 2024/10/01(火) 21:38:18.13 ID:Ig6Tf0ue 圏論をやりたいならまず代数学をやるべき それだけでだいぶ見通しが違う http://mevius.5ch.net/test/read.cgi/tech/1639713446/395
396: デフォルトの名無しさん [] 2024/10/01(火) 21:42:08.00 ID:4kH314XL >>390 モナドの効用で自分の把握してるのは ・数学やHaskellの様な遅延評価の場合、逐次処理を表現できる (これは変数を使いまわさない場合は、関数合成で十分だが、変数を使いまわすときはモナドじゃないと使いまわせない) ・副作用のある関数を使っても参照透明性は保たれている ・モナドは入れ物前提の概念なので、空の状態を使って例外処理をまとめることができる 正直、普通のプログラミング言語にも役立ちそうな3つ目は実感はしてないけど、ネットで例外処理よりモナドの方が優秀っぽい記事を読んだ 2番目もマルチスレッドとか最適化には役に立ちそうではある (マルチスレッドなら正格評価版HaskellのIdris2やRustだと思うが) http://mevius.5ch.net/test/read.cgi/tech/1639713446/396
397: デフォルトの名無しさん [] 2024/10/01(火) 22:05:17.67 ID:4kH314XL 圏論全体だと…当たり前のことを構造として研究してるだけなので、圏論というよりはHaskellの型クラスとの合わせ技で関手(Functor)の方がfmap的なのを他の言語にも導入すれば役に立つかも 圏論の関手を一言で言えば(関数も含めた)型変換 (Hakellだと入れ物前提にすることで、関数ごと型変換を実現。本来はもっと柔軟) 自然変換は一言で言えば単位変換とか、大文字小文字の変換 http://mevius.5ch.net/test/read.cgi/tech/1639713446/397
398: デフォルトの名無しさん [] 2024/10/01(火) 22:16:21.15 ID:4kH314XL モノイドは条件が結合法則だけなので、ほぼ結合法則そのものがモノイド (その割には繰り返しとか数え上げに現れる構造) そしてモナドも構造はそっくりなので、入れ物前提のモノイドとも考えられる (モナドの再帰はループ処理でスタックを消費しないし、数え上げは逐次処理と考えられる) http://mevius.5ch.net/test/read.cgi/tech/1639713446/398
399: デフォルトの名無しさん [sage] 2024/10/01(火) 23:08:20.75 ID:KbL1rq/V バグを無くすこと自体が目的になりがちなのが数学とプログラムなんだよね 真の目的のため、デバッグを二の次にするやつが正しいと言われても・・・ それって証明とかあるんですか http://mevius.5ch.net/test/read.cgi/tech/1639713446/399
400: デフォルトの名無しさん [sage] 2024/10/01(火) 23:21:35.19 ID:syLuNokt >>397 大文字小文字の変換が自然変換の部分kwsk >>399 目的と手段を区別したら、手段は二の次だと言うのは予選敗退者のポエム http://mevius.5ch.net/test/read.cgi/tech/1639713446/400
401: デフォルトの名無しさん [sage] 2024/10/01(火) 23:25:15.70 ID:syLuNokt >>396 > 2番目もマルチスレッドとか最適化には役に立ちそうではある それもう一人のsimonが取り組んだけどモナドは否定された http://mevius.5ch.net/test/read.cgi/tech/1639713446/401
402: デフォルトの名無しさん [sage] 2024/10/02(水) 05:35:22.65 ID:OAhBXB+m やっぱり数学的に表現してみただけってことか まぁ実際のプログラミングに利益はないわな http://mevius.5ch.net/test/read.cgi/tech/1639713446/402
403: デフォルトの名無しさん [] 2024/10/02(水) 07:50:08.23 ID:AFS53MaU >>400 よくよく考えたら特別な事じゃないんだけど、普通のプログラミング言語でも大文字・小文字の変換関数を自作するってなったら、文字をInt型に変換して処理する。 それって文字の圏で直接大文字小文字の変換するを作れない場合、一旦整数の圏を経由する関数を作る。 A(a) → B(a) ↓ ↓ A(A) → B(A) 可換図のA(a) → B(a)の逆射が作れれば、B(a) → B(A)が作れる。 ほら、分かってみれば「なーんだ。そんなことか」でしょ? http://mevius.5ch.net/test/read.cgi/tech/1639713446/403
404: デフォルトの名無しさん [] 2024/10/02(水) 07:53:32.91 ID:AFS53MaU この場合、整数同士の足し算に対応する、文字同士の足し算が作れる。 (ただし、整数と文字列で集合の大きさを合わせる必要がある。0-25とか1-26とかで循環する集合) http://mevius.5ch.net/test/read.cgi/tech/1639713446/404
405: デフォルトの名無しさん [] 2024/10/02(水) 07:55:35.67 ID:AFS53MaU んで、プログラマーはいちいち集合を合わせないで、エラー処理だったり循環リスト作ったりで対応するわけだぬ。 http://mevius.5ch.net/test/read.cgi/tech/1639713446/405
406: デフォルトの名無しさん [sage] 2024/10/02(水) 08:30:24.33 ID:VSz9kg2E 数学の圏論テキストではカリー化の操作は良く使うが、カリー化の名前を付けて引用することはまず無いね。 http://mevius.5ch.net/test/read.cgi/tech/1639713446/406
407: デフォルトの名無しさん [sage] 2024/10/02(水) 08:47:20.09 ID:wonXK6QE >>403 大文字小文字の変換が自然変換になる事を(Haskellの例で)証明して、と言う話 (自然変換が何かは分かっているで、直感的に違うと思ったから訊いた) http://mevius.5ch.net/test/read.cgi/tech/1639713446/407
408: デフォルトの名無しさん [sage] 2024/10/02(水) 09:21:51.83 ID:ZmuRtoMU 大文字の文字列の型から小文字の文字列の型への変換と考えると簡単 http://mevius.5ch.net/test/read.cgi/tech/1639713446/408
409: デフォルトの名無しさん [sage] 2024/10/02(水) 09:24:29.51 ID:ZmuRtoMU リスト関手から集合関手への自然変換も分かりやすい。 http://mevius.5ch.net/test/read.cgi/tech/1639713446/409
410: デフォルトの名無しさん [sage] 2024/10/02(水) 10:25:28.13 ID:xCLOcr8o すまん嘘を書いた 自然変換では無くリストの圏から集合の圏への関手だった http://mevius.5ch.net/test/read.cgi/tech/1639713446/410
411: デフォルトの名無しさん [sage] 2024/10/02(水) 10:27:20.94 ID:ZmuRtoMU 大文字列、小文字列も同様に間違い http://mevius.5ch.net/test/read.cgi/tech/1639713446/411
412: デフォルトの名無しさん [sage] 2024/10/02(水) 16:24:48.26 ID:H02uk4bf >>402 ただの記号で表現したら「0の逆数」とかいう表現を禁止するのが難しい ただの記号ではない方がベター http://mevius.5ch.net/test/read.cgi/tech/1639713446/412
413: デフォルトの名無しさん [] 2024/10/02(水) 20:27:37.99 ID:AFS53MaU >>407 圏論の自然変換だと文字コード前提じゃないので、[0..25] = ['a'..'z'] = ['A'..'Z']ってする。 んで、大文字と小文字は同じ文字の圏、[0..25]は自然数の圏とする。 lCharToInt c = (length.takeWhile (c /=)) ['a'..'z'] -- 小文字からIntへの変換(関手) uCharToInt c = (length.takeWhile (c /=)) ['A'..'Z'] -- 大文字からIntへの変換(関手) toLChar = (['a'..'z']!!) -- Intから小文字への変換(関手) toUChar = (['A'..'Z']!!) -- Intから大文字への変換(関手) mytoLower = toLChar.uCharToInt -- 大文字から小文字への変換(自然変換) mytoUpper = toUChar.lCharToInt -- 小文字から大文字への変換(自然変換) でも、普通のプログラミング言語のtoLower, toUpperも、Char型を圏とみれば同じ。 可換にするのは面倒くさい上に効率悪いけど、そういう関手を作ろうと思えば作れる。 http://mevius.5ch.net/test/read.cgi/tech/1639713446/413
414: デフォルトの名無しさん [] 2024/10/02(水) 20:45:45.19 ID:AFS53MaU 可換図にすると Char(小文字) ⇗ Int ⇑toL ⇓toU ⇘ Char(大文字) ここで、小文字→Int, 大文字→Intが作れればtoLower, toUpperを直接作らなくても、関手の合成で作れる。 http://mevius.5ch.net/test/read.cgi/tech/1639713446/414
415: デフォルトの名無しさん [sage] 2024/10/02(水) 20:53:28.38 ID:4E8lSXKR 出番ですよ >>399 http://mevius.5ch.net/test/read.cgi/tech/1639713446/415
416: デフォルトの名無しさん [] 2024/10/02(水) 21:03:02.82 ID:AFS53MaU 圏論の地平線でも書かれていたけど、圏論は直接的に役に立つというより、発想の転換の源泉になるそうな。 (なので、別に圏論分かったから偉いとかない) http://mevius.5ch.net/test/read.cgi/tech/1639713446/416
417: デフォルトの名無しさん [sage] 2024/10/02(水) 21:18:36.03 ID:JUMm5MLB 数学の研究には有用かも知れないが プログラミングで 直接役に立つようなことはまず無い http://mevius.5ch.net/test/read.cgi/tech/1639713446/417
418: デフォルトの名無しさん [sage] 2024/10/02(水) 21:42:50.80 ID:Xrjxo4NT どっ白け http://mevius.5ch.net/test/read.cgi/tech/1639713446/418
419: デフォルトの名無しさん [] 2024/10/02(水) 21:51:30.73 ID:OPLMo7z3 プログラミング言語もどんどん数学に寄せているし、上のカキコみたいにプログラムの記述を そのまま数学的対象とみなせるように改造していってると思う。本来は別物と考えるべきだと思う。 数学の研究といってもプログラム意味論の研究で、プログラムを数学の世界に写像したら どう表現できるかということを研究していると言えるんじゃないかと思う。 数学の世界には、式の評価途中に発生する副作用といった概念がないので、現実のプログラムを そのまま数学の世界に移そうと思ってもできないことの方が多い。 計算効果を圏論的に表現できたというのは、そういうプログラミング言語の数学化の一端みたいな もんだと思う。 http://mevius.5ch.net/test/read.cgi/tech/1639713446/419
420: デフォルトの名無しさん [sage] 2024/10/02(水) 22:00:14.12 ID:YWEZQEUD 副作用ってどうでもよくね Haskellとかだとそもそも副作用ないし http://mevius.5ch.net/test/read.cgi/tech/1639713446/420
421: デフォルトの名無しさん [] 2024/10/02(水) 22:12:34.31 ID:OPLMo7z3 現実のプログラムだと式を評価する途中で発生する副作用というのは普通だけれど、 これを表示的意味論、操作的意味論で数学の世界に写そうと思うと途端に難しくなる。 数学で式の途中に文字列をディスプレイに映し出す、みたいな概念はないから。 それを整理して副作用と呼んでも差し支えない概念を提唱してHaskellに実装しているんだよ。 実際、IOモナドの圏論的定式みるとこれが副作用?という表式してる。 全部後回しにしてフラッシュするというアイディアみたい。副作用をプログラムの最終局面で 実行しているから、式の評価途中の参照透明性も壊さない。なるほど、って感じ。 http://mevius.5ch.net/test/read.cgi/tech/1639713446/421
422: デフォルトの名無しさん [sage] 2024/10/02(水) 22:20:07.75 ID:sFAdPyYV ID:OPLMo7z3 = ID:AFS53MaU 本人か同レベル 複おじってレベル http://mevius.5ch.net/test/read.cgi/tech/1639713446/422
423: デフォルトの名無しさん [sage] 2024/10/02(水) 22:24:19.37 ID:YWEZQEUD 途端に難しくなるか? 副作用のない計算に変換する手順が教科書に書いてあるはずだが? http://mevius.5ch.net/test/read.cgi/tech/1639713446/423
424: デフォルトの名無しさん [] 2024/10/02(水) 22:29:49.51 ID:OPLMo7z3 >>422 別の人。自分ならプログラムの記述を一回数学の世界に写すし。 >>423 副作用のある数学的関数ってある? プログラム→数学 に変換するんだぜ。 副作用のない計算に変換する手順が数学の本に書いてあんの? http://mevius.5ch.net/test/read.cgi/tech/1639713446/424
425: デフォルトの名無しさん [sage] 2024/10/02(水) 22:43:26.42 ID:+kVmY7U4 >>424 別人とのことなので便乗 ID:OPLMo7z3 は ID:AFS53MaU が > 大文字小文字の変換が自然変換になる事を(Haskellの例で)証明して と問われて >>413,414 を出してきたのは数学的証明だと思ってるの? http://mevius.5ch.net/test/read.cgi/tech/1639713446/425
426: デフォルトの名無しさん [sage] 2024/10/02(水) 22:46:45.28 ID:+kVmY7U4 >>424 或いはもっと直接的に、>>424は「大文字小文字の変換が自然変換」の真偽をどう考えているの? http://mevius.5ch.net/test/read.cgi/tech/1639713446/426
427: デフォルトの名無しさん [] 2024/10/02(水) 22:51:00.95 ID:OPLMo7z3 定義が何もないのに何も言えるわけないじゃん。 数学でこういうものを定義します、これをプログラムのこれこれと対応付けます。 てプロセスないじゃん。 http://mevius.5ch.net/test/read.cgi/tech/1639713446/427
428: デフォルトの名無しさん [sage] 2024/10/02(水) 22:52:03.28 ID:YWEZQEUD >>424 先に副作用のないプログラムに変換するって言ってるんですけど Haskellなら最初から副作用がないからそのままでいいけど プログラミング言語の理論の本ならどれにでも書いてないか? http://mevius.5ch.net/test/read.cgi/tech/1639713446/428
429: デフォルトの名無しさん [sage] 2024/10/02(水) 22:55:13.15 ID:+kVmY7U4 >>427 了解 >>422の指摘通りだと納得しました http://mevius.5ch.net/test/read.cgi/tech/1639713446/429
430: デフォルトの名無しさん [] 2024/10/02(水) 22:56:24.21 ID:OPLMo7z3 いや。プログラム意味論の本結構探し回ったけど副作用の記述は漠然としてて 扱えないわけじゃないらしいけど、具体的な変換なんて見たことない。 ちょうど伝統的なプログラム意味論で副作用どう扱われているか調べているんだ。 なんて本に書いてありましたか? http://mevius.5ch.net/test/read.cgi/tech/1639713446/430
431: デフォルトの名無しさん [sage] 2024/10/02(水) 23:02:49.62 ID:YWEZQEUD どれにでも書いてあるだろ、whileプログラムをラムダ計算に変換する手順とか書いてないなんてことがあるわけがない http://mevius.5ch.net/test/read.cgi/tech/1639713446/431
432: デフォルトの名無しさん [] 2024/10/02(水) 23:06:08.21 ID:OPLMo7z3 なんだ。いや聞きたいのは入出力とかの副作用だよ。 http://mevius.5ch.net/test/read.cgi/tech/1639713446/432
433: デフォルトの名無しさん [sage] 2024/10/02(水) 23:17:44.98 ID:YWEZQEUD 入出力なんて代入に比べたら自明だろ… そんなのいちいち教科書に書くかよ http://mevius.5ch.net/test/read.cgi/tech/1639713446/433
434: デフォルトの名無しさん [] 2024/10/02(水) 23:26:30.50 ID:OPLMo7z3 書いてないのは自明だからではなくて、研究の方向性がどう転ぶかわからないからだと思う。 表示的意味論も出た当時の文献では副作用について語ってることが多い。 現代的な本になるほどD∞モデルつくってはいおしまいで数学的にきれいなところしかやらない。 http://mevius.5ch.net/test/read.cgi/tech/1639713446/434
435: デフォルトの名無しさん [sage] 2024/10/02(水) 23:36:01.67 ID:JUMm5MLB プログラムの仕様とその証明を数学で記述する本にあるだろうね。 http://mevius.5ch.net/test/read.cgi/tech/1639713446/435
436: デフォルトの名無しさん [sage] 2024/10/02(水) 23:37:10.87 ID:YWEZQEUD どこが非自明なのかさっぱりわからん 代入と違って入出力は垂れ流しだし、入出力は代入の特別な場合だろ http://mevius.5ch.net/test/read.cgi/tech/1639713446/436
437: デフォルトの名無しさん [] 2024/10/02(水) 23:46:11.64 ID:OPLMo7z3 >>435 ホーア論理とか公理的意味論か。いやそれはないな。あっても一般に適用できないし。 >>436 関数型プログラミングだとプログラムをλ式に対応させて、プログラムの実行をそのλ式の簡約に 対応させるというのが理想的なモデルとして想定されることが多いと思う。 でもλ式はλ項からλ項への対応でしかないから、λ項を値(value)と呼ぶとすると value から valueへの数学的関数でしかない。これには入出力とかの副作用を表現する余地がない。 つまり、 入出力があるプログラム→value から valueへの数学的関数 という対応付けをすると、入出力という特徴が数学世界では失われてしまう。 という難問があった、けどモナドで一つ解答が出た。 http://mevius.5ch.net/test/read.cgi/tech/1639713446/437
438: デフォルトの名無しさん [sage] 2024/10/02(水) 23:54:51.93 ID:YWEZQEUD 代入が書けるんだから、入出力なんて自明だろ… こいつ何いってんだ… http://mevius.5ch.net/test/read.cgi/tech/1639713446/438
439: デフォルトの名無しさん [] 2024/10/03(木) 00:02:36.12 ID:B2Xmf+Xl だから、入出力がある数学的関数なんてないだろって言ってんの。 数学的関数で入出力は非自明だと思うんだが。 http://mevius.5ch.net/test/read.cgi/tech/1639713446/439
440: デフォルトの名無しさん [] 2024/10/03(木) 00:09:13.65 ID:B2Xmf+Xl Haskellでいうと、 純粋関数は、λ式(valueからvalueへの数学的関数) に対応付けられるけど、 IOモナド使ったプログラムは、その現実のプログラムが持つ特徴を表現できるλ式がないので対応付けられない って言ってんの。 http://mevius.5ch.net/test/read.cgi/tech/1639713446/440
441: デフォルトの名無しさん [sage] 2024/10/03(木) 00:21:32.37 ID:omgk7HiD 入出力なんてただの値のリストだろ… http://mevius.5ch.net/test/read.cgi/tech/1639713446/441
442: デフォルトの名無しさん [sage] 2024/10/03(木) 03:50:19.64 ID:KCHr29fD 圏論持ち出して愚にもつかないことをグダグダと… それで何か効率良くなるならいいんだけど,何のメリットもないんだよね http://mevius.5ch.net/test/read.cgi/tech/1639713446/442
443: デフォルトの名無しさん [sage] 2024/10/03(木) 04:21:38.74 ID:zyXzLypu 圏論なんかより、遅延評価ならIOがwhnfの先頭に出てきたら実行すればいいって人類が気づいたのが本質なんじゃねーの http://mevius.5ch.net/test/read.cgi/tech/1639713446/443
444: デフォルトの名無しさん [sage] 2024/10/03(木) 08:29:58.17 ID:LNI2TnSo 最近の人類はseqのメリットを直接的に利用するコツに気づいとるんか 順調に進化しとるな http://mevius.5ch.net/test/read.cgi/tech/1639713446/444
445: デフォルトの名無しさん [sage] 2024/10/03(木) 14:31:37.97 ID:1wv2Oz28 コンパクトな言語仕様だが表現力は強力 数学をプログラミングに取り入れるメリットってまぁこんなもんでしかないでしょ 一方で静的に性質を決定しようとするやり方は一般的な人間の能力を簡単に超えてしまう http://mevius.5ch.net/test/read.cgi/tech/1639713446/445
446: デフォルトの名無しさん [sage] 2024/10/03(木) 16:46:40.39 ID:TkNlnb1D 急にポエマーだらけw http://mevius.5ch.net/test/read.cgi/tech/1639713446/446
447: デフォルトの名無しさん [] 2024/10/03(木) 19:56:29.70 ID:B2Xmf+Xl 入出力があるプログラムをどう数学的に整合する概念に対応させるかについて書いてみる。 こういう説明が通るものなのか興味があるし。 まず、仮想的なシェルスクリプト風の行番号付き手続き型言語を想定して、 その言語で入出力があるプログラムを定義するとする。 000 procedure prog1(int n) { 001 double res 002 (なにか込み入った計算) .... 020 echo "hogehoge" 021 (なにか込み入った計算) .... 050 echo "fugafuga" 051 (なにか込み入った計算) ... 100 return res } このプログラムは実行 $(prog1) すると、行番号001版から順に評価していって複雑な計算をしつつ途中 hogehoge ← 行番号020の命令を評価 fugafuga ← 行番号050の命令を評価 と表示した上で、返り値 res を返す、という動作をする。 http://mevius.5ch.net/test/read.cgi/tech/1639713446/447
448: デフォルトの名無しさん [] 2024/10/03(木) 19:57:08.78 ID:B2Xmf+Xl 現実のよくあるプログラムとはこういう感じのものだけれども、実行 $(prog1) をしてその結果が返ってくるという現実的に 必要な点だけを考えると、途中の行番号020を評価したとかそういう情報はいらなくて、結局 $(prog1) して hogehoge fugafuga を表示して、複雑な計算の結果 res が返ってくれさえすればいいともいえる。 だったら、数学的に取り扱いがしづらい、式の評価途中で入出力が発生するみたいな部分を取っ払って 000 procedure prog2(int n) { 001 double res 002 (なにか込み入った計算) .... 020 ## echo "hogehoge" #コメントアウト 021 (なにか込み入った計算) .... 050 ## echo "fugafuga" #コメントアウト 051 (なにか込み入った計算) ... 100 return ("hogehoge"を表示する予約1、"fugafuga"を表示する予約2、返り値 res) } というように、返り値の部分に全部まとめるということをするということが考えられる。こうしても、プログラムのユーザー側からすると 実行すると$(prog2) hogehoge fugafuga と表示されて複雑な計算した結果 res が返ってくるということは変わらない。 http://mevius.5ch.net/test/read.cgi/tech/1639713446/448
449: デフォルトの名無しさん [] 2024/10/03(木) 19:57:34.71 ID:B2Xmf+Xl というわけで、入出力があるプログラムというのは、こういう返り値の部分というか評価の最終段階の部分に「入出力の予約情報と返り値の情報がまとめられたもの」だったんだ、と整理しよう。 ただ、こういう「入出力の予約情報と返り値の情報がまとめられたもの」と長い文で表すのはよろしくないので、何か名前を与えた方がいいということで computationと呼ぶことにする。 そうすると、Haskellでいえば、 純粋関数は、valueからvalueへの数学的関数 に割り当てることができたけれど、 入出力付きのプログラムについては、valueからcomputationへの対応 に割り当てるということが数学的に正当化できそうだ、ということになるわけだ。 http://mevius.5ch.net/test/read.cgi/tech/1639713446/449
450: デフォルトの名無しさん [] 2024/10/03(木) 20:00:39.07 ID:B2Xmf+Xl 訂正 computationというか、今でいう「入出力の予約情報と返り値の情報がまとめられたもの」を 数学的にうまく正当化するということが達成することができるのであれば、 入出力つきのプログラムを、valueからcomputationへの対応 に割り当てるということが正当化できるはずだ、と考えられる。 http://mevius.5ch.net/test/read.cgi/tech/1639713446/450
451: デフォルトの名無しさん [sage] 2024/10/03(木) 20:23:28.46 ID:zyXzLypu 何言ってるのか全然わからん ぶっちゃけ入力は関数の引数にして、出力は返り値にするように変換するだけでいいだろ 読み出し位置のカーソル管理が必要なら代入を使えばできるじゃん http://mevius.5ch.net/test/read.cgi/tech/1639713446/451
452: デフォルトの名無しさん [] 2024/10/03(木) 20:39:38.40 ID:B2Xmf+Xl よくわかんないけど、そういう入出力プログラムがあったとする。 そしてそれを引数付きで実行することを考えると $(prog n) こうなる。ここで、引数の部分の n はプログラムの記述に属さないといけない。 なぜかというと現実世界の「入力」部分をそのまま引数のところには持ってこれないから。 引数部分を入力にするにしても、別途入力されたものをプログラムの変数に割り当てる概念 みたいなのが必要になるし、それは関数の引数だからということでは説明にならないと思う。 だから、少なくともprogの引数部分はvalueじゃないといけない。 http://mevius.5ch.net/test/read.cgi/tech/1639713446/452
453: デフォルトの名無しさん [sage] 2024/10/03(木) 20:45:47.19 ID:zyXzLypu ポエムすぎて意味わからん。値のリストはvalueじゃないと? http://mevius.5ch.net/test/read.cgi/tech/1639713446/453
454: デフォルトの名無しさん [] 2024/10/03(木) 20:59:58.72 ID:B2Xmf+Xl 値のリスト自体をそのまま持ってくればvalueということになるんだろうけれど、 $(prog n) の実行結果として出てくるもので、計算効果の説明になるものであって、返り値の型を包含するもの であればcomputationと判断せざるを得ないとかそういうことしか言えないです。 http://mevius.5ch.net/test/read.cgi/tech/1639713446/454
455: デフォルトの名無しさん [sage] 2024/10/03(木) 21:11:15.46 ID:zyXzLypu 判断するって何言ってるの? computationって定義は何なの? ラムダ項を書き換えていく手続きが計算じゃないの? http://mevius.5ch.net/test/read.cgi/tech/1639713446/455
456: デフォルトの名無しさん [] 2024/10/03(木) 21:22:37.64 ID:B2Xmf+Xl valueとcomputationの違いは微妙で$(prog n)の実行結果として出てくるかどうかとか 計算効果が発露しているかというところで見極めるしかない、と理解している。判断する というのは専門用語としては使ってない。 computationの定義はまた微妙だけれど、$(prog n)の計算効果込みの実行結果みたいな概念。 最後は超個人的見解だけど、「λ項を書き換えていく行為」というのは、どういう方法で表現して どういう方法で簡約していくか?というところが決まってない。λ計算じゃないけれど、 1+1=2 という計算を暗算でやるか、電卓でやるか、そろばんでやるかという違いを出しても計算することに 変わりない。 暗算でやると、脳内物質の分量が変わるし、電卓だと電位が変わる。そして、そろばんでやると 「ぱちぱち」という音が出る。 http://mevius.5ch.net/test/read.cgi/tech/1639713446/456
457: デフォルトの名無しさん [sage] 2024/10/03(木) 21:30:24.72 ID:zyXzLypu ❌決まってない ⭕知らない 間違えるなよ http://mevius.5ch.net/test/read.cgi/tech/1639713446/457
458: デフォルトの名無しさん [sage] 2024/10/03(木) 21:31:19.82 ID:zyXzLypu お前の脳内にしかないお花畑に巻き込むのやめてもらっていいですか? http://mevius.5ch.net/test/read.cgi/tech/1639713446/458
459: デフォルトの名無しさん [sage] 2024/10/03(木) 22:10:04.42 ID:/brOvmjG おそらくメンタルヘルスに問題がある方なのかな? 自分の頭の中の映像をそのまま言葉にしたような感じを受ける http://mevius.5ch.net/test/read.cgi/tech/1639713446/459
460: デフォルトの名無しさん [] 2024/10/04(金) 05:46:29.14 ID:vLDssEdm >>428 Haskellの副作用については2つの解釈がある。 1.副作用も含めてアクションという単位で値としてみる。 (アクションを受け取って、アクションを返す関数) 2.Haskellは指示書を発行しているだけで、実際に実行するのは数学(Hakell)の外だから、Haskellそのものには副作用が無い。 ((末尾にHaskellに値を返す形の)マシン語を返して、ハードウェアに実行してもらうと考えるアウトソーシング方式) http://mevius.5ch.net/test/read.cgi/tech/1639713446/460
461: デフォルトの名無しさん [sage] 2024/10/04(金) 05:52:21.21 ID:EogKDI3R >>460 ようするに副作用はないってことじゃん http://mevius.5ch.net/test/read.cgi/tech/1639713446/461
462: デフォルトの名無しさん [] 2024/10/04(金) 05:57:16.46 ID:vLDssEdm >>461 Javaは変数をクラスの外で作れないから、グローバル変数は存在しない。 けど、事実上のグローバル変数は作れてしまう。 ってのと、同じ。 アクションの中に副作用があろうが、マシン語を返していると解釈しようが、事実として副作用はある。 ただ、重要なのは副作用を伴っても参照透明性が保たれているってこと。 http://mevius.5ch.net/test/read.cgi/tech/1639713446/462
メモ帳
(0/65535文字)
上
下
前
次
1-
新
書
関
写
板
覧
索
設
栞
歴
あと 232 レスあります
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
AAサムネイル
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.016s