24/08/28 21:41:00.96 HNkudrYA.net
Youtubeでしばらくの間丁寧にHaskellを解説していた人が
ある日「やってらんね、俺はもうHaskellでプログラミングしない」と宣言してHaskellから離れたのを見て
所詮その程度の言語なんだなとガッカリした
333:デフォルトの名無しさん
24/08/28 23:56:40.97 FNkSebMV.net
>>332
Haskellはモナドの実証言語という側面が強いから、モナドは結局よくわからないものという結論に達した今では話題もないし、Haskellで視聴回数稼げないんじゃない。
334:デフォルトの名無しさん
24/08/29 12:50:10.24 D5XAFbVY.net
自作ライブラリの(+)とPrelude.+が被って、Prelude.+使いたい時一々修飾するの面倒くさいしコードも汚くなります
被った時はデフォルトでPrelude.+を使うよって指定することはできないのですか?
335:デフォルトの名無しさん
24/08/29 12:53:31.30 1jszJs3n.net
>>332
+1
336:デフォルトの名無しさん
24/08/29 12:54:42.14 1jszJs3n.net
>>334
自作の方を修飾
337:デフォルトの名無しさん
24/08/29 14:06:11.00 gtm/5H5m.net
>>334
両方使う予定があるのに、何故わざわざ同じ記号にしたのか…。
自分は自作の方を(.+)とか、微妙に変えてる。
338:デフォルトの名無しさん
24/08/29 14:06:50.30 gtm/5H5m.net
使用例:
1 .+ 1
>2
339:デフォルトの名無しさん
24/08/29 16:27:15.59 Nq0HdWD9.net
やだやだ!修飾したくない!
どっちの+か特定して自動的に選択してよう!
340:デフォルトの名無しさん
24/08/29 16:57:49.70 YXIyrRhD.net
何の自作型だか知らんがSemigroup実装して(<>)にでもすれば
341:デフォルトの名無しさん
24/08/29 17:40:12.63 aIGVGYPU.net
就職しろよ
342:デフォルトの名無しさん
24/08/29 20:48:46.38 gtm/5H5m.net
>>339
独自の(+)を自動で使い分けてもらうにはNum型クラスのインスタンスにする必要があるけど、それでも見分けるには型が違わないといけない。
独自の(+)は、独自の型を受け取りますか?
そうじゃないとPreludeの(+)と判別する術がないけど。
343:デフォルトの名無しさん
24/08/29 20:51:12.20 gtm/5H5m.net
あ、できれば型宣言を見せて貰えるとアドバイスしやすい。
344:デフォルトの名無しさん
24/08/31 21:17:53.38 XbdVGeAf.net
ワカランドとして .+. と .-. と .*. を定義することにしました。しかし本質的に解決するにはNumクラスのインスタンス宣言するらしいですね。
しかし独自型同士の+と-、Rationalとの*、Rationalとの/はできますが、
独自型同士の*、独自型同士の/は定義不可能です。
従ってNumクラスになることはできませんでした。
結局どうしていいか判らんどからのワカランドで落ち着きました。
345:デフォルトの名無しさん
24/09/03 18:48:39.95 yXFMfbtr.net
もしかしてData.Mapって遅い?
一日中検索かけてるような処理なら、もうMapを卒業するべきときか・・・
346:デフォルトの名無しさん
24/09/04 00:16:15.77 r/FGXedG.net
Data.Mapというより、リストが遅い。
とりあえずコンパイルの際にghc -O2とかghc -O3とかの最適化掛けてみる。
それでもなお速さを求めるなら、ByteStringとか使うと良い。
もしくは、正格評価版HaskellことIdris 2やRustに乗り換える。
(Idris1と2で互換性が無いらしく、別言語扱いされてる)
Haskellで速さを求めるとバッドノウハウが増えて本末転倒になる。
(そこまで苦労するなら素直に速い言語覚えた方が楽。それでも9.10.1はC#並みにはなった?かな?)
347:デフォルトの名無しさん
24/09/04 15:29:34.52 ZA+d8/X/.net
リストが遅い、しかし多くのデータ構造の構築はリストから(fromList)。
つまりコンストラクション回数をいかに減らすか、一度コンストラクトした物を使いまわすか、ということですか
348:デフォルトの名無しさん
24/09/04 16:12:14.21 LSV34QaC.net
lisp系言語はリストの操作が速いのに…
349:デフォルトの名無しさん
24/09/04 22:00:37.92 r/FGXedG.net
>>347
そういう事。
そして、そういう事を考えさせる時点でどうなの?ってのもある。
文法好きだし、普段使いで困らないけど、速さ求めるなら他の言語使うよねって。
350:デフォルトの名無しさん
24/09/04 22:22:04.95 r/FGXedG.net
>>348
遅延評価だからってのも地味に大きい。
自分はプログラミング言語「数学」の(未完全な)実装として見てるので、遅延評価じゃないと困るが。
351:デフォルトの名無しさん
24/09/05 00:27:39.10 mpd8c2G1.net
普段使いって何してんの
エロ画像収集とか?
352:デフォルトの名無しさん
24/09/05 04:50:37.33 l0HQxOqp.net
PythonやPerlの代わりにテキスト処理に使ってる。
353:デフォルトの名無しさん
24/09/05 18:56:54.85 k3Tfomjz.net
>>351
それ面白いと思って書き込んでんの?
354:デフォルトの名無しさん
24/09/06 09:50:34.80 zzPaKLb6.net
ブラウザでリンク画像が URLリンク(host)
みたいになってて最終的に jpg が表示されてるんだけど
URLリンク(host) をブラウザで開いても
jpg じゃなくて jpg ファイルのイメージがテキストファイルみたく表示される
こういうのは hoge.php の造りが悪い(たぶんhttpヘッダーが可笑しい)んだろうけど
じゃあなんで元頁では画像が表示されてたのかとか疑問は残る
それはともかく欲しいのは jpg ファイルなので
ブラウザに頼らずダウンローダーを描いた
355:デフォルトの名無しさん
24/09/06 09:52:13.17 zzPaKLb6.net
補足
修正前: jpg ファイルのイメージ
正: jpg ファイルのバイナリデータ
356:デフォルトの名無しさん
24/09/07 19:33:25.03 9PXNQc4Q.net
長大な処理となる関数を実行途中にRAM使用量が嵩んでいくとします
中には解放できる部分もある場合について、
このままガベコレせずに進んでいったらいずれOSが『君にはもうRAM貸せないよ』と言ってくるでしょうが、ランタイムシステムは
①その時になってようやく解放できる場所がないか探し出す
①-i 今必要な最低限の確保ができたら即そこに記録して終わり
①-ii 強制的にminorGCを発動して、即そこに記録して終わり
①-iii 強制的にMajorGCを発動して、即そこに記録して終わり
①-iv 強制的にBlockingMajorGCを発動して、即そこに記録して終わり
①-v もはや解放できる場所は見つからないと判断したら例外終了
②何もせず例外終了する
③その他
どれですか?
357:デフォルトの名無しさん
24/09/07 19:35:13.52 9PXNQc4Q.net
文字化けしちゃいました。文字化けした?は1、2,3だと思ってください
358:デフォルトの名無しさん
24/09/08 00:17:59.58 m7MeNrY2.net
loop s なんちゃらかんちゃら
= do
let final_score = long_thunk_score + s
s' = sをなんちゃらかんちゃら
modify' $ Data.Map.Strict.insert key final_score
unsafePerformIO ( evaluate $ rnf final_score ) `seq` loop s' なんちゃらかんちゃら
このStateモナドは、final_scoreは状態Mapへ挿入される時はWHNFでしょうが、直後の行で完全に評価されています
この事はマップに挿入されたfinal_scoreへ影響を与えますか?
つまりマップへ挿入済みのサンクとしての値を後からUnsafePerformIOとevaluateとrnfを組み合わせて狙ったタイミングでRNF化できますか?
359:デフォルトの名無しさん
24/09/09 11:45:42.71 CQiqzRbc.net
>>356
黙って動いてるフリをする
360:デフォルトの名無しさん
24/09/26 23:16:42.97 eAiUCVhs.net
この言語まだ息してるのか?
361:デフォルトの名無しさん
24/09/27 00:41:23.43 ppX7mFe8.net
おまいらは圏論はちゃんとマスターしたか?
最近圏論のお勉強流行ってないみたいだが
362:デフォルトの名無しさん
24/09/28 08:56:06.97 boijaUwp.net
そもそもHaskellに圏論必要ないよ
363:デフォルトの名無しさん
24/09/28 11:20:55.86 szplrxFB.net
背景の理論を理解してないとbrainf*ckと同列のクソパズル言語にしか見えない
364:デフォルトの名無しさん
24/09/28 11:30:45.96 D4fCa7Ze.net
米田の何ちゃらの辺りで心が折れて終了
365:デフォルトの名無しさん
24/09/28 11:48:20.49 M6f6jLKS.net
>>363
> brainf*ckと同列のクソパズル言語
話がそれるけどbrainf*ckがパズル言語なのは100%その通りだよ
しかし構文パーサー、インタープリターやトランスレーター、JITエンジンの実践入門として
丁度良いからこれだけ根強い人気なんだぜ
366:デフォルトの名無しさん
24/09/28 20:40:40.54 SDDTPU1M.net
>>361
流行ってないのか…。
個人的にはHaskellよりも圏論の方に関心が移ってるのに…。
んでも、圏論はHaskellでなくても、全てのプログラミング言語の裏側でも動いてるし、それこそ算数の裏側でも動いてる。
モナドが表に出てきてるからHaskellには圏論が必要って思うかもだけど、モナドって言わないで do形式だけ教えて知れっとしてても良いし、「こういう動きの演算子」としてモナドを紹介するだけでも良い。
受験数学とちゃんと向き合う数学みたいなものだけど、変にモナドを理解しようとすると深みにはまる。
(それはそれで楽しいけど、楽しめる人だけだよね…)
367:デフォルトの名無しさん
24/09/29 07:33:19.55 bBvJfaeS.net
ラムダと束縛変数をマスターしなければdo記法もマスターできないのを
すっかり忘れるぐらいポイントフリーが普及してるでしょ
368:デフォルトの名無しさん
24/09/29 08:45:10.72 3/NLN/+f.net
コーダーが数学の学習に使える時間なんて限られている
時間や基礎知識が足らないので、難解な数学を攻略するのはほぼ不可能
大学生時CSや数学の講義で身に付けておくしかない
369:デフォルトの名無しさん
24/09/29 09:32:49.44 twIz68VA.net
難解な数学を攻略できるなら
日本ではコーダーにはならないよな
370:デフォルトの名無しさん
24/09/29 10:15:01.09 AteoOTMZ.net
業界入るのに難解数学不要
プログラミングにも不要
数学分からんのでgoogle入るのは無理だけど
371:デフォルトの名無しさん
24/09/29 11:01:25.51 bBvJfaeS.net
人工的なルールに依存するのがクソパズルだが
自然界でなおかつ野生のマウンティング的なルールにも依存しないことが数学の目的のひとつだね
372:デフォルトの名無しさん
24/09/29 20:36:16.00 JU2vTa1F.net
圏論が全てのプログラミング言語の裏で動いてるとか適当なこと書くなよ
373:デフォルトの名無しさん
24/09/30 00:30:17.34 Kh4w53R0.net
>>368
高卒の自分でも理解できるんだから、難しいわけではないんだけど。
何度も出てる通り、必ずしもモナドを理解する必要はないし。
そもそも自分がプログラマーの頃だって、12-13時間働いた後も新しいプログラミング言語や数学勉強してたぞ。
(新しい仕事のために学びたくない言語に時間使う事も)
高卒が圏論みたいな大学数学学ぶには専門用語がそもそも分らんから、用語が分かるまで遡った。
(アーベル圏のアーベルが分からないレベルからのスタート)
自分に投資できないと淘汰されるぞ。
374:デフォルトの名無しさん
24/09/30 00:59:39.85 Kh4w53R0.net
>>372
適当じゃない。
モナドは(主に)逐次処理に現れる構造なので、Haskellのような遅延評価で逐次処理自体を作らないといけない(逐次処理をエミュレートするためのモナド)言語でない限り、意識することすらない。
(だからC言語で言う i = 0; の「;」とか言われる)
375:デフォルトの名無しさん
24/09/30 03:08:44.15 g+sPZSfB.net
>>372
沈黙させる努力をするよりも(全ての)人の話を聞くのをサボる方が良い
努力は時間がかかる
一瞬で報われるものは努力ではない
376:デフォルトの名無しさん
24/09/30 12:40:29.07 +8KmLjt4.net
圏論の極々一部のモナドを主語をデカくして圏論ガーとか言ってる人は何も分かってないんだなと思うけどね
俺みたいに数学かじってた人からすると
圏論を勉強すると「あ、この概念はこの分野のこれのことか」ってわかるけど
そうじゃない人は何のことを言ってるのかわからんと思う
専門家でも自分の担当外の圏なんて知らないのに
圏論という括りで語ろうとする人はそういうのすら理解してない
377:デフォルトの名無しさん
24/09/30 13:52:28.73 CD9F70e/.net
やっと普通の人が出てきて安心した
378:デフォルトの名無しさん
24/09/30 13:59:18.70 pkON+G7q.net
>>376
数学者向けの圏論の教科書の応用、具体例は全て数学。
数学知らない人が読んでも分かるわけがない。
応用、具体例、演習をCSの分野から採った教科書が望まれるが、書くのが難しい上に面白くするのも困難。
大体CSすらちゃんと修めてないエンジニアはやはり読めない。
CS自体ベースに位相、代数、グラフ理論と数学使うし。
379:デフォルトの名無しさん
24/09/30 14:09:03.81 rwCIuc1C.net
趣味でやる人に良くいるんだよね。
応用各分野に囚われずに、圏論そのものを学習したい、一般圏論を研究したいって人。
これは数学で言うと、集合論と同じく数学基礎論の分野。
380:デフォルトの名無しさん
24/09/30 19:05:45.94 8C0MP56i.net
操作的意味論とか表示的意味論でプログラムを数学の話にして、その数学を圏論で整理するって話
だからアーベル圏とか具体的な圏はあんま出てこない。
やるとすれば
デカルト閉圏:ランベックがλ計算のモデルになると発見して関数型プログラミング的に重要
クライスリ圏:Moggiが計算効果をカプセル化したときの根拠の圏
ローベア理論:代数的効果をちゃんと理解するときは必要らしい。操作的意味論と表示的意味論と同じようにモナドの理論と妥当性が成り立つようだ。
ぐらいじゃね。
381:デフォルトの名無しさん
24/09/30 21:09:21.28 CVtPTYpb.net
じゃあラムダ計算(のモデル)だけを考えよう
タプルや代数的データ型は使わない
それでもモナドの具体例を作れるのを知ってるのが専門バカ
知らないのが一般国民だ
382:デフォルトの名無しさん
24/09/30 21:29:13.05 8C0MP56i.net
一般国民。
λ計算のモデルでモナド作ってなにかいいことあるの?計算効果結局表現できないんじゃ?
拡張してcomputational lambda calculusやるって話?
383:デフォルトの名無しさん
24/09/30 21:47:09.45 CVtPTYpb.net
ないんじゃないか
ただ「具体例を出せば、いいことがある」とは誰も言ってない
というファクトをチェックするのは悪いことではない
384:デフォルトの名無しさん
24/09/30 21:53:56.34 8C0MP56i.net
いいこと(メリット)があるから具体例が作られると思うんだが。
それは単に具体例の適用が間違ってるって話じゃね?
なんとなく作れるから群構造作ってみましたとかとか目的不在で作ったらそら何がいいかわからんし。
モナドだったら、各計算効果を圏(クライスリ圏)の中に閉じ込めることに成功しました(カプセル化)。
計算効果は強モナドの構造を取っているようです(計算効果の研究のとっかかり)。
みたいないいことあるから流行るんでしょ。
385:デフォルトの名無しさん
24/10/01 04:04:03.18 PZ96E01/.net
別にそれ圏論を持ち出す必要ないよね
ハイおしまい
386:デフォルトの名無しさん
24/10/01 09:39:15.78 KbL1rq/V.net
>なんとなく作れるから群構造作ってみました
ルービックキューブのことか
387:デフォルトの名無しさん
24/10/01 09:46:07.52 y60InQ2q.net
数学屋さんもね
研究では圏を使うが
学生に教えるときは
圏を記述に使わず教えたりする
388:デフォルトの名無しさん
24/10/01 19:23:20.12 7kn4RxVI.net
圏論の話題になったから振ったのに。まあいいよ。
圏論根拠で(ソフトウェア工学的にじゃなくて)数学的にカプセル化が実現されてるってすごい
ことだと思うけどね。
>ルービックキューブのことか
ルービックキューブ解くという目的あるんなら構築する意味あるんじゃない。
389:デフォルトの名無しさん
24/10/01 19:34:54.43 YZm15ve9.net
群持ち出したところで解けないよ
390:デフォルトの名無しさん
24/10/01 20:18:43.32 PZ96E01/.net
圏論がプログラミングの問題解決に寄与するわけないのにね
ただ当てはめてみたってだけのことを過大評価しすぎ
391:デフォルトの名無しさん
24/10/01 20:52:10.03 u1x9FxNe.net
雪田修一の「圏論入門 Haskellで計算する 具体例から」ってどうなん?
392:デフォルトの名無しさん
24/10/01 21:10:04.55 YpLGkLDy.net
板チ
目的と手段を混同したら予選敗退
393:デフォルトの名無しさん
24/10/01 21:16:26.45 7kn4RxVI.net
どうなんって何を知るのに?出たときに立ち読みしただけだけど。
394:デフォルトの名無しさん
24/10/01 21:16:56.98 Ig6Tf0ue.net
>>391
青本と似てて定義の後に具体例を出すみたいな感じだけど
具体例が数学科の人じゃないとわからない内容ばかりなので
結局個別の分野をやらないと理解できないと思う
395:デフォルトの名無しさん
24/10/01 21:38:18.13 Ig6Tf0ue.net
圏論をやりたいならまず代数学をやるべき
それだけでだいぶ見通しが違う
396:デフォルトの名無しさん
24/10/01 21:42:08.00 4kH314XL.net
>>390
モナドの効用で自分の把握してるのは
・数学やHaskellの様な遅延評価の場合、逐次処理を表現できる
(これは変数を使いまわさない場合は、関数合成で十分だが、変数を使いまわすときはモナドじゃないと使いまわせない)
・副作用のある関数を使っても参照透明性は保たれている
・モナドは入れ物前提の概念なので、空の状態を使って例外処理をまとめることができる
正直、普通のプログラミング言語にも役立ちそうな3つ目は実感はしてないけど、ネットで例外処理よりモナドの方が優秀っぽい記事を読んだ
2番目もマルチスレッドとか最適化には役に立ちそうではある
(マルチスレッドなら正格評価版HaskellのIdris2やRustだと思うが)
397:デフォルトの名無しさん
24/10/01 22:05:17.67 4kH314XL.net
圏論全体だと…当たり前のことを構造として研究してるだけなので、圏論というよりはHaskellの型クラスとの合わせ技で関手(Functor)の方がfmap的なのを他の言語にも導入すれば役に立つかも
圏論の関手を一言で言えば(関数も含めた)型変換
(Hakellだと入れ物前提にすることで、関数ごと型変換を実現。本来はもっと柔軟)
自然変換は一言で言えば単位変換とか、大文字小文字の変換
398:デフォルトの名無しさん
24/10/01 22:16:21.15 4kH314XL.net
モノイドは条件が結合法則だけなので、ほぼ結合法則そのものがモノイド
(その割には繰り返しとか数え上げに現れる構造)
そしてモナドも構造はそっくりなので、入れ物前提のモノイドとも考えられる
(モナドの再帰はループ処理でスタックを消費しないし、数え上げは逐次処理と考えられる)
399:デフォルトの名無しさん
24/10/01 23:08:20.75 KbL1rq/V.net
バグを無くすこと自体が目的になりがちなのが数学とプログラムなんだよね
真の目的のため、デバッグを二の次にするやつが正しいと言われても・・・
それって証明とかあるんですか
400:デフォルトの名無しさん
24/10/01 23:21:35.19 syLuNokt.net
>>397
大文字小文字の変換が自然変換の部分kwsk
>>399
目的と手段を区別したら、手段は二の次だと言うのは予選敗退者のポエム
401:デフォルトの名無しさん
24/10/01 23:25:15.70 syLuNokt.net
>>396
> 2番目もマルチスレッドとか最適化には役に立ちそうではある
それもう一人のsimonが取り組んだけどモナドは否定された
402:デフォルトの名無しさん
24/10/02 05:35:22.65 OAhBXB+m.net
やっぱり数学的に表現してみただけってことか
まぁ実際のプログラミングに利益はないわな
403:デフォルトの名無しさん
24/10/02 07:50:08.23 AFS53MaU.net
>>400
よくよく考えたら特別な事じゃないんだけど、普通のプログラミング言語でも大文字・小文字の変換関数を自作するってなったら、文字をInt型に変換して処理する。
それって文字の圏で直接大文字小文字の変換するを作れない場合、一旦整数の圏を経由する関数を作る。
A(a) → B(a)
↓ ↓
A(A) → B(A)
可換図のA(a) → B(a)の逆射が作れれば、B(a) → B(A)が作れる。
ほら、分かってみれば「なーんだ。そんなことか」でしょ?
404:デフォルトの名無しさん
24/10/02 07:53:32.91 AFS53MaU.net
この場合、整数同士の足し算に対応する、文字同士の足し算が作れる。
(ただし、整数と文字列で集合の大きさを合わせる必要がある。0-25とか1-26とかで循環する集合)
405:デフォルトの名無しさん
24/10/02 07:55:35.67 AFS53MaU.net
んで、プログラマーはいちいち集合を合わせないで、エラー処理だったり循環リスト作ったりで対応するわけだぬ。
406:デフォルトの名無しさん
24/10/02 08:30:24.33 VSz9kg2E.net
数学の圏論テキストではカリー化の操作は良く使うが、カリー化の名前を付けて引用することはまず無いね。
407:デフォルトの名無しさん
24/10/02 08:47:20.09 wonXK6QE.net
>>403
大文字小文字の変換が自然変換になる事を(Haskellの例で)証明して、と言う話
(自然変換が何かは分かっているで、直感的に違うと思ったから訊いた)
408:デフォルトの名無しさん
24/10/02 09:21:51.83 ZmuRtoMU.net
大文字の文字列の型から小文字の文字列の型への変換と考えると簡単
409:デフォルトの名無しさん
24/10/02 09:24:29.51 ZmuRtoMU.net
リスト関手から集合関手への自然変換も分かりやすい。
410:デフォルトの名無しさん
24/10/02 10:25:28.13 xCLOcr8o.net
すまん嘘を書いた
自然変換では無くリストの圏から集合の圏への関手だった
411:デフォルトの名無しさん
24/10/02 10:27:20.94 ZmuRtoMU.net
大文字列、小文字列も同様に間違い
412:デフォルトの名無しさん
24/10/02 16:24:48.26 H02uk4bf.net
>>402
ただの記号で表現したら「0の逆数」とかいう表現を禁止するのが難しい
ただの記号ではない方がベター
413:デフォルトの名無しさん
24/10/02 20:27:37.99 AFS53MaU.net
>>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型を圏とみれば同じ。
可換にするのは面倒くさい上に効率悪いけど、そういう関手を作ろうと思えば作れる。
414:デフォルトの名無しさん
24/10/02 20:45:45.19 AFS53MaU.net
可換図にすると
Char(小文字)
⇗
Int ⇑toL ⇓toU
⇘
Char(大文字)
ここで、小文字→Int, 大文字→Intが作れればtoLower, toUpperを直接作らなくても、関手の合成で作れる。
415:デフォルトの名無しさん
24/10/02 20:53:28.38 4E8lSXKR.net
出番ですよ >>399
416:デフォルトの名無しさん
24/10/02 21:03:02.82 AFS53MaU.net
圏論の地平線でも書かれていたけど、圏論は直接的に役に立つというより、発想の転換の源泉になるそうな。
(なので、別に圏論分かったから偉いとかない)
417:デフォルトの名無しさん
24/10/02 21:18:36.03 JUMm5MLB.net
数学の研究には有用かも知れないが
プログラミングで
直接役に立つようなことはまず無い
418:デフォルトの名無しさん
24/10/02 21:42:50.80 Xrjxo4NT.net
どっ白け
419:デフォルトの名無しさん
24/10/02 21:51:30.73 OPLMo7z3.net
プログラミング言語もどんどん数学に寄せているし、上のカキコみたいにプログラムの記述を
そのまま数学的対象とみなせるように改造していってると思う。本来は別物と考えるべきだと思う。
数学の研究といってもプログラム意味論の研究で、プログラムを数学の世界に写像したら
どう表現できるかということを研究していると言えるんじゃないかと思う。
数学の世界には、式の評価途中に発生する副作用といった概念がないので、現実のプログラムを
そのまま数学の世界に移そうと思ってもできないことの方が多い。
計算効果を圏論的に表現できたというのは、そういうプログラミング言語の数学化の一端みたいな
もんだと思う。
420:デフォルトの名無しさん
24/10/02 22:00:14.12 YWEZQEUD.net
副作用ってどうでもよくね
Haskellとかだとそもそも副作用ないし
421:デフォルトの名無しさん
24/10/02 22:12:34.31 OPLMo7z3.net
現実のプログラムだと式を評価する途中で発生する副作用というのは普通だけれど、
これを表示的意味論、操作的意味論で数学の世界に写そうと思うと途端に難しくなる。
数学で式の途中に文字列をディスプレイに映し出す、みたいな概念はないから。
それを整理して副作用と呼んでも差し支えない概念を提唱してHaskellに実装しているんだよ。
実際、IOモナドの圏論的定式みるとこれが副作用?という表式してる。
全部後回しにしてフラッシュするというアイディアみたい。副作用をプログラムの最終局面で
実行しているから、式の評価途中の参照透明性も壊さない。なるほど、って感じ。
422:デフォルトの名無しさん
24/10/02 22:20:07.75 sFAdPyYV.net
ID:OPLMo7z3 = ID:AFS53MaU 本人か同レベル
複おじってレベル
423:デフォルトの名無しさん
24/10/02 22:24:19.37 YWEZQEUD.net
途端に難しくなるか?
副作用のない計算に変換する手順が教科書に書いてあるはずだが?
424:デフォルトの名無しさん
24/10/02 22:29:49.51 OPLMo7z3.net
>>422
別の人。自分ならプログラムの記述を一回数学の世界に写すし。
>>423
副作用のある数学的関数ってある?
プログラム→数学
に変換するんだぜ。
副作用のない計算に変換する手順が数学の本に書いてあんの?
425:デフォルトの名無しさん
24/10/02 22:43:26.42 +kVmY7U4.net
>>424
別人とのことなので便乗
ID:OPLMo7z3 は ID:AFS53MaU が
> 大文字小文字の変換が自然変換になる事を(Haskellの例で)証明して
と問われて
>>413,414 を出してきたのは数学的証明だと思ってるの?
426:デフォルトの名無しさん
24/10/02 22:46:45.28 +kVmY7U4.net
>>424
或いはもっと直接的に、>>424は「大文字小文字の変換が自然変換」の真偽をどう考えているの?
427:デフォルトの名無しさん
24/10/02 22:51:00.95 OPLMo7z3.net
定義が何もないのに何も言えるわけないじゃん。
数学でこういうものを定義します、これをプログラムのこれこれと対応付けます。
てプロセスないじゃん。
428:デフォルトの名無しさん
24/10/02 22:52:03.28 YWEZQEUD.net
>>424
先に副作用のないプログラムに変換するって言ってるんですけど
Haskellなら最初から副作用がないからそのままでいいけど
プログラミング言語の理論の本ならどれにでも書いてないか?
429:デフォルトの名無しさん
24/10/02 22:55:13.15 +kVmY7U4.net
>>427
了解
>>422の指摘通りだと納得しました
430:デフォルトの名無しさん
24/10/02 22:56:24.21 OPLMo7z3.net
いや。プログラム意味論の本結構探し回ったけど副作用の記述は漠然としてて
扱えないわけじゃないらしいけど、具体的な変換なんて見たことない。
ちょうど伝統的なプログラム意味論で副作用どう扱われているか調べているんだ。
なんて本に書いてありましたか?
431:デフォルトの名無しさん
24/10/02 23:02:49.62 YWEZQEUD.net
どれにでも書いてあるだろ、whileプログラムをラムダ計算に変換する手順とか書いてないなんてことがあるわけがない
432:デフォルトの名無しさん
24/10/02 23:06:08.21 OPLMo7z3.net
なんだ。いや聞きたいのは入出力とかの副作用だよ。
433:デフォルトの名無しさん
24/10/02 23:17:44.98 YWEZQEUD.net
入出力なんて代入に比べたら自明だろ…
そんなのいちいち教科書に書くかよ
434:デフォルトの名無しさん
24/10/02 23:26:30.50 OPLMo7z3.net
書いてないのは自明だからではなくて、研究の方向性がどう転ぶかわからないからだと思う。
表示的意味論も出た当時の文献では副作用について語ってることが多い。
現代的な本になるほどD∞モデルつくってはいおしまいで数学的にきれいなところしかやらない。
435:デフォルトの名無しさん
24/10/02 23:36:01.67 JUMm5MLB.net
プログラムの仕様とその証明を数学で記述する本にあるだろうね。
436:デフォルトの名無しさん
24/10/02 23:37:10.87 YWEZQEUD.net
どこが非自明なのかさっぱりわからん
代入と違って入出力は垂れ流しだし、入出力は代入の特別な場合だろ
437:デフォルトの名無しさん
24/10/02 23:46:11.64 OPLMo7z3.net
>>435
ホーア論理とか公理的意味論か。いやそれはないな。あっても一般に適用できないし。
>>436
関数型プログラミングだとプログラムをλ式に対応させて、プログラムの実行をそのλ式の簡約に
対応させるというのが理想的なモデルとして想定されることが多いと思う。
でもλ式はλ項からλ項への対応でしかないから、λ項を値(value)と呼ぶとすると
value から valueへの数学的関数でしかない。これには入出力とかの副作用を表現する余地がない。
つまり、
入出力があるプログラム→value から valueへの数学的関数
という対応付けをすると、入出力という特徴が数学世界では失われてしまう。
という難問があった、けどモナドで一つ解答が出た。
438:デフォルトの名無しさん
24/10/02 23:54:51.93 YWEZQEUD.net
代入が書けるんだから、入出力なんて自明だろ…
こいつ何いってんだ…
439:デフォルトの名無しさん
24/10/03 00:02:36.12 B2Xmf+Xl.net
だから、入出力がある数学的関数なんてないだろって言ってんの。
数学的関数で入出力は非自明だと思うんだが。
440:デフォルトの名無しさん
24/10/03 00:09:13.65 B2Xmf+Xl.net
Haskellでいうと、
純粋関数は、λ式(valueからvalueへの数学的関数)
に対応付けられるけど、
IOモナド使ったプログラムは、その現実のプログラムが持つ特徴を表現できるλ式がないので対応付けられない
って言ってんの。
441:デフォルトの名無しさん
24/10/03 00:21:32.37 omgk7HiD.net
入出力なんてただの値のリストだろ…
442:デフォルトの名無しさん
24/10/03 03:50:19.64 KCHr29fD.net
圏論持ち出して愚にもつかないことをグダグダと…
それで何か効率良くなるならいいんだけど,何のメリットもないんだよね
443:デフォルトの名無しさん
24/10/03 04:21:38.74 zyXzLypu.net
圏論なんかより、遅延評価ならIOがwhnfの先頭に出てきたら実行すればいいって人類が気づいたのが本質なんじゃねーの
444:デフォルトの名無しさん
24/10/03 08:29:58.17 LNI2TnSo.net
最近の人類はseqのメリットを直接的に利用するコツに気づいとるんか
順調に進化しとるな
445:デフォルトの名無しさん
24/10/03 14:31:37.97 1wv2Oz28.net
コンパクトな言語仕様だが表現力は強力
数学をプログラミングに取り入れるメリットってまぁこんなもんでしかないでしょ
一方で静的に性質を決定しようとするやり方は一般的な人間の能力を簡単に超えてしまう
446:デフォルトの名無しさん
24/10/03 16:46:40.39 TkNlnb1D.net
急にポエマーだらけw
447:デフォルトの名無しさん
24/10/03 19:56:29.70 B2Xmf+Xl.net
入出力があるプログラムをどう数学的に整合する概念に対応させるかについて書いてみる。
こういう説明が通るものなのか興味があるし。
まず、仮想的なシェルスクリプト風の行番号付き手続き型言語を想定して、
その言語で入出力があるプログラムを定義するとする。
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 を返す、という動作をする。
448:デフォルトの名無しさん
24/10/03 19:57:08.78 B2Xmf+Xl.net
現実のよくあるプログラムとはこういう感じのものだけれども、実行 $(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 が返ってくるということは変わらない。
449:デフォルトの名無しさん
24/10/03 19:57:34.71 B2Xmf+Xl.net
というわけで、入出力があるプログラムというのは、こういう返り値の部分というか評価の最終段階の部分に「入出力の予約情報と返り値の情報がまとめられたもの」だったんだ、と整理しよう。
ただ、こういう「入出力の予約情報と返り値の情報がまとめられたもの」と長い文で表すのはよろしくないので、何か名前を与えた方がいいということで
computationと呼ぶことにする。
そうすると、Haskellでいえば、
純粋関数は、valueからvalueへの数学的関数
に割り当てることができたけれど、
入出力付きのプログラムについては、valueからcomputationへの対応
に割り当てるということが数学的に正当化できそうだ、ということになるわけだ。
450:デフォルトの名無しさん
24/10/03 20:00:39.07 B2Xmf+Xl.net
訂正
computationというか、今でいう「入出力の予約情報と返り値の情報がまとめられたもの」を
数学的にうまく正当化するということが達成することができるのであれば、
入出力つきのプログラムを、valueからcomputationへの対応
に割り当てるということが正当化できるはずだ、と考えられる。
451:デフォルトの名無しさん
24/10/03 20:23:28.46 zyXzLypu.net
何言ってるのか全然わからん
ぶっちゃけ入力は関数の引数にして、出力は返り値にするように変換するだけでいいだろ
読み出し位置のカーソル管理が必要なら代入を使えばできるじゃん
452:デフォルトの名無しさん
24/10/03 20:39:38.40 B2Xmf+Xl.net
よくわかんないけど、そういう入出力プログラムがあったとする。
そしてそれを引数付きで実行することを考えると
$(prog n)
こうなる。ここで、引数の部分の n はプログラムの記述に属さないといけない。
なぜかというと現実世界の「入力」部分をそのまま引数のところには持ってこれないから。
引数部分を入力にするにしても、別途入力されたものをプログラムの変数に割り当てる概念
みたいなのが必要になるし、それは関数の引数だからということでは説明にならないと思う。
だから、少なくともprogの引数部分はvalueじゃないといけない。
453:デフォルトの名無しさん
24/10/03 20:45:47.19 zyXzLypu.net
ポエムすぎて意味わからん。値のリストはvalueじゃないと?
454:デフォルトの名無しさん
24/10/03 20:59:58.72 B2Xmf+Xl.net
値のリスト自体をそのまま持ってくればvalueということになるんだろうけれど、
$(prog n)
の実行結果として出てくるもので、計算効果の説明になるものであって、返り値の型を包含するもの
であればcomputationと判断せざるを得ないとかそういうことしか言えないです。
455:デフォルトの名無しさん
24/10/03 21:11:15.46 zyXzLypu.net
判断するって何言ってるの?
computationって定義は何なの?
ラムダ項を書き換えていく手続きが計算じゃないの?
456:デフォルトの名無しさん
24/10/03 21:22:37.64 B2Xmf+Xl.net
valueとcomputationの違いは微妙で$(prog n)の実行結果として出てくるかどうかとか
計算効果が発露しているかというところで見極めるしかない、と理解している。判断する
というのは専門用語としては使ってない。
computationの定義はまた微妙だけれど、$(prog n)の計算効果込みの実行結果みたいな概念。
最後は超個人的見解だけど、「λ項を書き換えていく行為」というのは、どういう方法で表現して
どういう方法で簡約していくか?というところが決まってない。λ計算じゃないけれど、
1+1=2
という計算を暗算でやるか、電卓でやるか、そろばんでやるかという違いを出しても計算することに
変わりない。
暗算でやると、脳内物質の分量が変わるし、電卓だと電位が変わる。そして、そろばんでやると
「ぱちぱち」という音が出る。
457:デフォルトの名無しさん
24/10/03 21:30:24.72 zyXzLypu.net
❌決まってない
⭕知らない
間違えるなよ
458:デフォルトの名無しさん
24/10/03 21:31:19.82 zyXzLypu.net
お前の脳内にしかないお花畑に巻き込むのやめてもらっていいですか?
459:デフォルトの名無しさん
24/10/03 22:10:04.42 /brOvmjG.net
おそらくメンタルヘルスに問題がある方なのかな?
自分の頭の中の映像をそのまま言葉にしたような感じを受ける
460:デフォルトの名無しさん
24/10/04 05:46:29.14 vLDssEdm.net
>>428
Haskellの副作用については2つの解釈がある。
1.副作用も含めてアクションという単位で値としてみる。
(アクションを受け取って、アクションを返す関数)
2.Haskellは指示書を発行しているだけで、実際に実行するのは数学(Hakell)の外だから、Haskellそのものには副作用が無い。
((末尾にHaskellに値を返す形の)マシン語を返して、ハードウェアに実行してもらうと考えるアウトソーシング方式)
461:デフォルトの名無しさん
24/10/04 05:52:21.21 EogKDI3R.net
>>460
ようするに副作用はないってことじゃん
462:デフォルトの名無しさん
24/10/04 05:57:16.46 vLDssEdm.net
>>461
Javaは変数をクラスの外で作れないから、グローバル変数は存在しない。
けど、事実上のグローバル変数は作れてしまう。
ってのと、同じ。
アクションの中に副作用があろうが、マシン語を返していると解釈しようが、事実として副作用はある。
ただ、重要なのは副作用を伴っても参照透明性が保たれているってこと。
463:デフォルトの名無しさん
24/10/04 06:07:02.79 4jD3Hbcp.net
副作用が隔離できていることが大切
スレの基地外の隔離スレのように
464:デフォルトの名無しさん
24/10/04 06:24:04.70 EogKDI3R.net
>>462
それは例えばwhileプログラムから副作用のない言語に変換したあとの形式と同じ状態にすでになってるってことで、計算のルール上はもう副作用はないでしょ
465:デフォルトの名無しさん
24/10/04 07:22:19.19 vLDssEdm.net
>>464
そうなんだけど、結局普通のプログラミング言語を使ってる人にしてみれば屁理屈でしかない。
見た目そのままで伝えるなら、純粋関数型言語の定義のまんま、「副作用を伴っても参照透明性が保たれている」でいい。
466:デフォルトの名無しさん
24/10/04 07:38:19.23 EogKDI3R.net
>>465
まあそのほうがいいか
上の方にいた彼はなんか脳内にこだわりがあって、普通の型付きラムダ計算以上のことをやってると思ってるフシがあったね
467:デフォルトの名無しさん
24/10/04 07:48:51.79 vLDssEdm.net
>>466
そうそう。
副作用は無い!って、こっちが必死になって弁を述べれば述べるほど、屁理屈感が出てくる。
それよりは副作用を認めて、「副作用を分離」「副作用を伴っても参照透明性が保たれている」って言った方が、納得感がある。
468:デフォルトの名無しさん
24/10/04 19:23:08.02 tixO3LDq.net
とりあえず続きを書いてみる。
Haskellでいうところの
純粋関数は、valueからvalueへの数学的関数
入出力プログラムは、valueから(入出力)computationへの対応
に割り当てることで、数学上にプログラミング行為を写し出せそうだ、というところまで書いた。
ただ、やっぱり(入出力)computationって何?とか、valueと形式的にどう違うの?という疑問は拭い去ることができない。
そこでMoggiは、次のようなアイディアを2つ出して(結構ムリヤリに)疑問を解決した。
ただし、ここで入出力プログラム prog は A型の引数を取って(computationの整理をする前は)B型の返り値を返すとする。
469:デフォルトの名無しさん
24/10/04 19:23:42.06 tixO3LDq.net
Moggiのアイディア1
・返り値の型がBのcomputationは、何か型構築子をIOとすると、その型構築子を適用した型 IO B のvalueに対応する。
※Moggiの原理ともいう。
つまり、上で挙げた入出力プログラム prog の型は、具体的に A → IO B になると言っている。
IO B 型の実装で、入出力の予約だか、値のリストだか指示書だか表現はいろいろあるが、そういう機構を実装すれば、
prog :: A → IO B
は参照透過性を保ったまま入出力を行うプログラムになる。
もっと広がりが出そうなcomputation概念なのに、急に狭窄な感じがするアイディアだけれど、
実装と折り合いをつけるという観点からすると仕方ないともいえる。
なお、代数的効果のPlotkinとPowerが批判しているのはこのMoggiのアイディア1である感じがする(あんまわかってない)。
470:デフォルトの名無しさん
24/10/04 19:24:13.18 tixO3LDq.net
Moggiのアイディア2
・入出力プログラム(に対応する数学的概念)は、圏をなすはずだ。
Moggiのアイディア1の段階でもprog :: A → IO Bは参照透過性を保ったまま入出力を行うプログラムになるはずだが、
入出力プログラム同士の合成が考えられていない。入出力プログラム prog1、prog2と開発したら、できるだけ再利用するというのが
現実のプログラミングだと思う。わざわざprog1とprog2の合成として定義できそうなプログラムを得るために、イチイチいちから
開発するということを理論的に要請されるというのは不合理。
純粋関数は、λ式に割り当てられることになって、当然、圏をなすだろうに、
プログラムに割り当てられるものが圏を成さないというのはおかしい。
でも、入出力プログラムはMoggiのアイディア1から、
prog :: A → IO B
という特殊な返り値の型を持っているため単純な合成ができない。
471:デフォルトの名無しさん
24/10/04 19:29:03.13 tixO3LDq.net
Moggiのアイディア1の段階でcomputationの概念というのは解消してしまう。
PlotokinとPowerはそこが不満なんだろうか?
472:デフォルトの名無しさん
24/10/04 20:18:31.78 WSIC8Xt5.net
だから、副作用を隠してラムダ計算に変換する手続きは、世界をステートにする変換をした時点で達成されてるわけで、そんなの太古の昔から分かってたことだろ
IO aの定義読んでから出直せよ
473:デフォルトの名無しさん
24/10/04 20:30:15.44 SclsbEZF.net
日を跨ぐつもりならコテハンでも付けてくれんか
追えん
474:デフォルトの名無しさん
24/10/04 20:44:30.01 tixO3LDq.net
>>472
だからそれはわかっているって。評価途中では実際の入出力はせず指示書だか値のリストだけ作成して
参照透過性を保証して、参照透過性が要求されなくなったプログラムの最終段階でリストに従って
入出力を実行するような仕組みがあれば、参照透過性を保ったまま入出力はできるという話でしょ。
それを数学的にどう正当化するかという話を書いているんだって。
>>473
水曜日あたりからだからそんな分量ないよ。
475:デフォルトの名無しさん
24/10/04 20:49:17.68 WSIC8Xt5.net
>>474
どこが正当化されてないのか意味不明なんだけど
ていうか正当化って何?
476:デフォルトの名無しさん
24/10/04 20:51:48.70 tixO3LDq.net
だから、入出力がある数学的関数なんてないじゃん。
入出力があるプログラムを数学的に表現しようと思っても詰むからどうしようって話。
477:デフォルトの名無しさん
24/10/04 20:57:28.69 6lZW+X9H.net
こんなところで長文書くのはやめてもろて
読む価値があるものならzennとかnoteに書けば?
関数型言語界隈の人たちがクソミソにレビューしてくれるよ
478:デフォルトの名無しさん
24/10/04 20:58:08.93 WSIC8Xt5.net
>>476
型付きラムダ計算の時点で数学的に表現されてるだろ…
意味不明すぎる
479:デフォルトの名無しさん
24/10/04 21:00:48.64 qBjLuAvO.net
メインの入力とメインの出力は数学にもある
主じゃないやつを副作用といってる
480:デフォルトの名無しさん
24/10/04 21:11:30.04 tixO3LDq.net
>>478
なるほどそう考えていたのか。全部λ計算でアセンブルすりゃ数学的に還元できるだろうってわけね。
でもそうだとすると文字列を表示するハードウェアの部分はどう還元するの?
>>479
よくわかんない。具体的に言うとどういうのある?
481:デフォルトの名無しさん
24/10/04 21:11:31.21 tixO3LDq.net
>>478
なるほどそう考えていたのか。全部λ計算でアセンブルすりゃ数学的に還元できるだろうってわけね。
でもそうだとすると文字列を表示するハードウェアの部分はどう還元するの?
>>479
よくわかんない。具体的に言うとどういうのある?
482:デフォルトの名無しさん
24/10/04 21:18:24.66 WSIC8Xt5.net
>>480
アセンブルって何?
後半も何言ってるのかちゃんと分かるように書いて
483:デフォルトの名無しさん
24/10/04 21:25:06.50 WSIC8Xt5.net
そうだよ、こんなとこじゃなくてzennとかに煽った感じのタイトルつけて炎上する記事書いてコメントもらって来いよ
484:デフォルトの名無しさん
24/10/04 21:28:05.10 tixO3LDq.net
λ計算を機械語とかアセンブラと見立てて、λ計算ですべて数学世界を組み立てれば、
入出力がある数学的関数も定義できるだろうから、あえて数学的正当性なんて与えようとする
理由がわからない、ということだろうと思った。
プログラムの部分は全てλ計算で組み立てれば完全に同じものが作れると思っているということ
だけれども、じゃあ文字列をディスプレイに表示するというプログラムの構成要素である
ディスプレイはハードウェア部分だけれども、それはλ計算で組み立てるという範疇にはいるんですか?
入らないなら、なにか数学的概念を持ち出してきてそれに対応付けるということをしないといけないんじゃ
ないですか?
という趣旨のことを書いた。
485:デフォルトの名無しさん
24/10/04 21:33:15.17 tixO3LDq.net
これ読んだらわかるけどMoggi論文の読書感想文。いまさらの。
匿名以外でいまさら突っ込んでくるわけないじゃん。
486:デフォルトの名無しさん
24/10/04 21:33:16.29 tixO3LDq.net
これ読んだらわかるけどMoggi論文の読書感想文。いまさらの。
匿名以外でいまさら突っ込んでくるわけないじゃん。
487:デフォルトの名無しさん
24/10/04 21:34:24.07 qBjLuAvO.net
関数の「型」を見ろ
入力が何で出力が何かが宣言されている
488:デフォルトの名無しさん
24/10/04 21:39:26.17 tixO3LDq.net
>>484
ディスプレイに表示するまでの概念はよく考えたら既存の例でもなかったわ。
焦って変なこといったスマン。
ちょっと説明を考える。
489:デフォルトの名無しさん
24/10/04 21:39:59.29 WSIC8Xt5.net
>>484
意味不明すぎる
ラムダ計算は数学的に正当化されてるだろ
例えば合流性があるとか数学的に証明されてる
これのどこに非数学的要素があるんだって言ってるんだよ
すでに数学的な説明がされてるものに対して、数学的に正当化されてないとか言うのやめろよ
490:デフォルトの名無しさん
24/10/04 21:48:55.49 tixO3LDq.net
λ計算が数学的に正当化されてないというような話はしてなくて、
現実のプログラムをλ計算に反映させようと思っても入出力とか非決定計算の部分は表現しきれない
そのλ計算からはみ出す部分をどう正当化させようかという話。
491:デフォルトの名無しさん
24/10/04 21:52:13.21 WSIC8Xt5.net
>>490
じゃあHaskellは純粋にただの型付きラムダ計算なんだから、数学的に正当化されてない部分などない
おしまい
492:デフォルトの名無しさん
24/10/04 22:03:12.33 tixO3LDq.net
>>491
うーん。例えば、数学は集合論上で展開されているから、集合論があればその上で展開される
解析学とか、線形代数学とかいらない、みたいな論法じゃない?
この現象は、解析学でモデル化できるけれども、解析学は集合論上で展開できるから、
そんなモデル化はいらなくていちいち集合論の言葉で書けばいいじゃん的な。
みんなそこに興味あるわけじゃないと思いますよ。
493:デフォルトの名無しさん
24/10/04 22:08:30.14 vLDssEdm.net
>>484
横からというか >460 書いた者だけど、あなたの疑問は解釈1の「アクションを受け取ってアクションを返す関数」だとざっくりし過ぎて納得いかないって感じでしょうか?
でしたら、解釈2では納得出来ませんでしょうか?
解釈2は、モナドの効能の一つに追加して「数学の世界にアウトソーシングという概念を持ち込む」というものです。
モナドの例えとして、床下配線というのがありますが、MaybeやListの様な通常のモナドも、>>=の中に関数適用部分を押し込んで、表から見えないようにしています。
(これも、見ようによってはアウトソーシングです。同じ数学の世界なので、隣の席に頼んだ感じですが)
IOモナドは、>>=の中すら見えない状態で関数適用しているわけですが、 >460 でも書いたとおり、「数学の外(ハードウェア)」で関数適用されていると考えるわけです。
IOモナドの>>= は、外の世界と遣り取りする受付窓口というわけですね。
(実際、バッファの様な振る舞いをします)
main = do x <- return 0
_________x <- return (x + 1)
_________print x
494:デフォルトの名無しさん
24/10/04 22:14:36.08 WSIC8Xt5.net
>>492
ラムダ計算も集合論上で展開されてるだろ
だから、Haskellも集合論の言葉で書かれてるじゃん
そんな誰もが分かってるけど、いちいち書いても何の得もないことを話したかったの?
495:デフォルトの名無しさん
24/10/04 22:16:42.74 vLDssEdm.net
この場合、IOモナドを使って変数xを書き換えているのではなく、シャドーイングによって同じxという名前の変数を新しく作って、古い x に +1 した値を束縛しています。
496:デフォルトの名無しさん
24/10/04 22:21:54.69 tixO3LDq.net
>>493
ごめんなさい。全然違う。入出力を題材にしているのはあくまで例で別に疑問はないです(実装をちゃんと知っているわけではないですが)。
モナドを導入する動機はMoggi論文読んだ読書感想文なので途中まで書いてますが、圏をなすかどうかです。
497:デフォルトの名無しさん
24/10/04 22:27:08.92 vLDssEdm.net
無理やりハードウェアも数学と言い張るなら、ハードウェアもチューリングマシンという計算モデルなので数学が元と言えなくはない?
そういうこじつけは置いておいても、IOモナドをアウトソーシングと考えると、じゃあ外の世界はめちゃくちゃか?と考えて、そうではないと気付く。
ハードウェアも一定の秩序がある。
数学だけが全てではないのかもしれない。
何かしらの秩序というか、法則性を持った世界(数学、数学以外含む)どうしのやり取りにモナドが橋渡しとして働いているのでは?とか、考えたりする。
498:デフォルトの名無しさん
24/10/04 22:28:17.05 tixO3LDq.net
>>494
モナドの原論文(Moggiの論文)の読書感想文を入出力の計算効果を題材に解説してみているんだって。
ブログに書いても今更突っ込むなんて恥ずかしいことができる人はいるわけないので、ここに書いている。
499:デフォルトの名無しさん
24/10/04 22:32:08.56 WSIC8Xt5.net
>>498
その人はHaskellは数学的に正当化されてないけしからんって言ってたの?
500:デフォルトの名無しさん
24/10/04 22:34:04.82 WSIC8Xt5.net
最低限、論文に書いてある正しいこととお前の妄想がはっきり区別できるように感想文を書けよ
501:デフォルトの名無しさん
24/10/04 22:44:05.60 tixO3LDq.net
>>499
はっきりそうは言ってない。
プログラムをλ項に対応させて単純化させると、valueからvalueへの全域関数となるけれど、
そう考えると、非停止性とか非決定性、副作用といった現実のプログラムにある特徴が失われる(だからそれを何とかしようと読める)。
>>500
そんなことできるほど力量ないです。
502:デフォルトの名無しさん
24/10/04 22:46:51.98 vLDssEdm.net
>>496
少なくともコマンド系のプログラムは圏をなしますね。
Haskellで作ると実感しますが、Haskellに限らず、
(ユーザーから見て)プログラムそのものが関数になります。
Linuxでコマンドをパイプライン処理するのは関数(射の)合成に相当しますし。
id相当のプログラムは作れますし。
・・・と考えると圏をなすと思うのですが。
(GUIプログラムもボタン単位とかで関数と言えますが、合成は…押した順序?)
例えば
{(x,2x+1) | x ∈ R} と 2x+1のグラフは同型だと直感的に分かりますが、その関数(射)は数式で表せません。
圏論では、可換図を受け取って可換図を返すとか出てきますので、{(x,2x+1) | x ∈ R} と 2x+1のグラフを結ぶ関数(射)が人間って言うのも有かな?とか、考えます。
(圏論では同型と分かれば(証明できれば)よくて、射の中身には言及しない)
503:デフォルトの名無しさん
24/10/04 22:50:56.01 WSIC8Xt5.net
>>501
なんでラムダ項に対応させると全域関数になるわけ?ラムダ計算は停止しない計算も表現できるモデルでしょ
言ってることが意味不明なんだよ
504:デフォルトの名無しさん
24/10/04 22:52:29.23 tixO3LDq.net
ただの圏じゃなくてクライスリ圏じゃないといけない(Moggiのアイディア1から)。
そして、クライスリ圏を定義するためにはクライスリ・トリプル(モナド)がいる
505:デフォルトの名無しさん
24/10/04 22:52:30.15 tixO3LDq.net
ただの圏じゃなくてクライスリ圏じゃないといけない(Moggiのアイディア1から)。
そして、クライスリ圏を定義するためにはクライスリ・トリプル(モナド)がいる
506:デフォルトの名無しさん
24/10/04 22:54:07.35 WSIC8Xt5.net
そもそもラムダ項は関数ではないし、集合ではあるということはできるけど、それは自然数1は集合であるみたいな話でそれに意義なんてないよ
507:デフォルトの名無しさん
24/10/04 23:02:32.42 vLDssEdm.net
>>504
>398 じゃ答えにならない?
508:デフォルトの名無しさん
24/10/04 23:02:43.19 6lZW+X9H.net
流石にこれじゃ関数型界隈の人達にボコボコにされて終わるね
やめといた方がいい
509:デフォルトの名無しさん
24/10/04 23:04:12.66 tixO3LDq.net
βη簡約するとλ項が別の簡約されたλ項になる。この対応関係を数学的関数とみなせると言ってると解釈してる。
510:デフォルトの名無しさん
24/10/04 23:12:30.87 WSIC8Xt5.net
>>509
みなせるって何?
ようするにラムダ項は関数じゃないってことでしょ当たり前だけど
511:デフォルトの名無しさん
24/10/04 23:14:09.18 tixO3LDq.net
全域関数となる理由はわからん。全域関数=数学的関数ということを言いたいんだろうと思ってたけどそこから詰めてなかった。
512:デフォルトの名無しさん
24/10/04 23:22:52.03 WSIC8Xt5.net
>>511
お前が言い出したんだろ
513:デフォルトの名無しさん
24/10/04 23:30:08.11 6lZW+X9H.net
これがワードサラダか
514:デフォルトの名無しさん
24/10/04 23:41:03.02 tixO3LDq.net
すまんね。準備不足だったわ。詰めるところわかったし、
詰めるところ詰めることができたらひっそりどっかに書くことにするわ。
いろいろコメント参考になったわ。
515:デフォルトの名無しさん
24/10/05 00:27:27.96 aeHKoAMv.net
集合と写像の区別がついてないんだから、何を準備しようが時間の無駄
516:デフォルトの名無しさん
24/10/05 07:57:53.70 jwoAd9Km.net
ZFでは集合しか無いから。写像だろうが、自然数だろうが何でも集合。全てを集合で実装する世界。
517:デフォルトの名無しさん
24/10/05 08:14:37.65 JByJwyk5.net
圏論は逆で、対象(集合で言う元)を恒等写像と同一視して全てを射(写像)として扱うね。
518:デフォルトの名無しさん
24/10/05 08:53:09.61 jwoAd9Km.net
対象Aに対しA=id_Aとする圏の定義は、射のクラスの上での全域的で無い結合的2項演算⚪︎を持つ代数系としての簡潔な定式化。この定義では圏には射しかなくて、対象とは恒等射の別名に過ぎない。
ただ、この圏の実装は入門者には分かり難い。
Aが圏Cの対象であることを古い文献はA in Ob(C)と書くことが多いけど、最近の文献はA in Cと書いてしまう。fが圏Cの射f:A --> Bなことはf in Hom_C(A,B)かf in Mor_C(A,B)。
519:デフォルトの名無しさん
24/10/05 10:51:32.56 KE+ltgGd.net
普通のλはどの順序で適用しても同じ計算結果になる(Church-Rosserの定理)けど
副作用を伴うλは適用順序が入れ替わると副作用の順序も変わって同じ結果とは言えなくなるから
順序を保証する仕組みとしてモナドが応用されてるはず
IO a >>= (a -> IO b) -> IO b
は(a -> IO b)が(IO a)を受け取れないから
(IO a)からaを取り出せるところまで計算しないと(a -> IO b)を適用できない
仮に
IO a -> (IO a -> IO b) -> IO b
みたいな形だと(IO a)の計算を保留したまま(IO a -> IO b)を適用できる
圏論はよく分からないけど
圏Aに便宜的な時間軸をつけたA_t0, A_t1, A_t2, …を用意して関手
A_t0 → A_t1, A_t1 → A_t2, …
を作るとA_t0, A_t1…は全部AのクローンだからA_t0 → A_t1, …は自己関手になって
その自己関手の集合がなんやかんやでモナドに相当するみたいなイメージ
520:デフォルトの名無しさん
24/10/05 11:23:42.68 KE+ltgGd.net
どうでもいいけど計算科学のside effect→副作用は誤訳だと思う
薬学のside effectは「随伴作用」(副作用)だけど計算科学のside effectは「側面作用」って感じ
521:デフォルトの名無しさん
24/10/05 11:40:17.86 gdCH0E84.net
圏論のコンコルド効果について。
Haskellのコーティングの質をあげようと、
一生懸命頑張って勉強したのに実はほとんど役に立たない…
「大量の時間と労力を学習したのに悔しい!」
そのことを認めることができず、懸命に圏論のプログラミングでの有用性を力説し、学習布教に努める。
522:デフォルトの名無しさん
24/10/05 13:16:57.88 AoKf42Y0.net
>>519
異なる順序でreductionする方法がある場合は、どの順序でreductionしても同じ結果になるだろ?
IO a >>= (a -> IO b) -> IO bなら当たり前だけど(a -> IO b) -> IO bをa -> IO bに先にreduction可能
523:デフォルトの名無しさん
24/10/05 13:51:21.32 2BBo/yBe.net
数日程度で成果を出す戦略を採用したにもかかわらず何年も戦争が続く
こういうのは圏論に限定されない現象だ
順序を入れかえたら結果が変わる
数日後の情報が今ここに伝わるならそれは時間軸とは言えないぞ
524:デフォルトの名無しさん
24/10/05 14:41:11.81 hOtauQiF.net
>>522
IO a >>= (a -> IO b) -> IO b
は
(IO a >>= (a -> IO b)) -> IO b
であって
IO a >>= ((a -> IO b) -> IO b)
にはならないよ
(>>=)は演算子
525:デフォルトの名無しさん
24/10/05 15:10:26.09 u1hwkRNd.net
圏論の話題出すなよ
Haskellで何か書くにあたって利益があるわけじゃないんだから
526:デフォルトの名無しさん
24/10/05 15:30:46.49 2BBo/yBe.net
利益は道徳よりも軽い
これも、未来予知ができなければ利益を計算できないことに原因がある
527:デフォルトの名無しさん
24/10/05 17:25:54.13 JByJwyk5.net
>>521
役に立つなら、もっと色々入ってるかと…。
私はむしろHaskellより圏論そのものに興味の対象が移って、Haskellは圏論の概念を実際に動かしてみるための道具に成り下がってますね^^;
とはいえ、数学の知識不足なので群論やらトポロジーやらあっちこっち読み漁りながらなので、歩みは遅いですが…。
528:デフォルトの名無しさん
24/10/05 20:22:21.95 J2mQEu2j.net
>>527
面倒でも一般位相の基本、ホモロジーの初歩…と地道にやるのをおすすめします
529:デフォルトの名無しさん
24/10/05 20:30:18.78 aeHKoAMv.net
集合と写像の区別もついてないんだから、集合と位相からやらないとだめ
530:デフォルトの名無しさん
24/10/05 22:07:16.25 JByJwyk5.net
>>528
ありがとうございます。
手探りだったので、助かります。
重点的に勉強してみます。
(高卒にどこまで理解できるか…)
>>529
一応、区別付いてるつもりなのですが…。
指摘していただければ調べてみます。
531:デフォルトの名無しさん
24/10/05 22:16:56.83 aeHKoAMv.net
>>530
あー上で暴れてた人とは別人だったのね
でも、集合と位相は何をやるにしても必要だから頑張ってね
532:デフォルトの名無しさん
24/10/05 23:30:55.73 bPGp2ASj.net
>>373=396=530 っぽいから言うと、(数学に関して)「分かった」「理解した」の自己基準が不安しかない
> ほら、分かってみれば「なーんだ。そんなことか」でしょ?
> なるほど、って感じ。
と自分に言い聞かせていても、ポピュラーサイエンス書感覚で読んだってダメ
他人との議論では、逆に「こいつ分かってないな」と思われるだけだからな
533:デフォルトの名無しさん
24/10/05 23:50:06.63 JByJwyk5.net
>>532
独学ですしね^^;
こいつ分かってないなと思われても良いですよ?
それで指摘されたものも新しい知識になるので。
どうも定義を読むだけじゃイメージ湧かないので、ネット上や数学書の複数の例え話が全て真だと仮定して、共通の特徴からイメージを掴むパターンが多いんです。
534:デフォルトの名無しさん
24/10/06 01:53:03.98 6zQjUfx4.net
いま正常性バイアスを理解した
全て正常だと仮定する
なるほど
535:デフォルトの名無しさん
24/10/06 10:54:18.58 jCq2z3ec.net
本来Haskell使う上で必要のない数学の知識をかじらされるのかわいそう
こうやって無駄に間口狭めてなんの意味があるんだか
536:デフォルトの名無しさん
24/10/06 11:09:45.81 y6HCCYtz.net
>>530に関しては同情すんな
>>373前後で煽っておいて炎上勉強法してる
537:デフォルトの名無しさん
24/10/06 12:50:07.74 6zQjUfx4.net
>>535
だから、具体例をかじることなく一般圏論でやめておこうって言ってるじゃないか
バランスを考えて妥協するとはそういうことだ
538:デフォルトの名無しさん
24/10/06 13:58:19.62 jCq2z3ec.net
まず圏論が必要ないっての
539:デフォルトの名無しさん
24/10/06 14:19:17.49 6zQjUfx4.net
それは極論だがそれを許容する代わりに反対側の極論も許容してもらう
ダブルヘイターとは違うのだよ
540:デフォルトの名無しさん
24/10/07 16:51:22.87 89HfDe1C.net
>>539
君頭悪いなら無理に書き込まないほうがいいよ
541:デフォルトの名無しさん
24/10/08 16:34:43.77 uOPPJ/Hn.net
圏論好きはHaskellよりCPLで幸せになれる
542:デフォルトの名無しさん
24/10/08 19:19:24.66 fXGz3G0z.net
>>529
集合と写像って違うんですか?写像って集合ではなかったですか?
543:デフォルトの名無しさん
24/10/08 19:24:10.23 u3fJk7wa.net
>>541
CPLとは?kwsk
544:デフォルトの名無しさん
24/10/08 19:35:49.07 i8KKt4Pq.net
>>542
反対向きは成り立たないよ
彼はラムダ項みたいなただの集合も関数だとか言ってたんだよ
545:デフォルトの名無しさん
24/10/08 20:00:43.25 fXGz3G0z.net
>>544
なるほど。勉強になります。
546:デフォルトの名無しさん
24/10/08 20:58:36.65 uOPPJ/Hn.net
>>543
CPL (圏論プログラミング言語)
URLリンク(ja.m.wikipedia.org)(%E5%9C%8F%E8%AB%96%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%A8%80%E8%AA%9E)
547:デフォルトの名無しさん
24/10/08 21:59:10.54 fIGAPb3c.net
CPL使ったことは一度もないが
関手圏よりもっとややこしい圏で、モナドより凡庸なものを定義するんでしょ
548:デフォルトの名無しさん
24/10/08 23:08:48.38 Fz/Eetv9.net
こんなんだけど
>通常では,自然数などのデータ型は,効率のためにシステムに組込んであるが,CPLでは定義しなければならない.
>また,定義したとしても,機械本来の足し算,かけ算を使用できず,独自に定義しなければならない.
549:デフォルトの名無しさん
24/10/09 00:11:45.00 NBQjGpZO.net
O'CAMLのCAMLはCategorical Abstract Machine Languageの略ということを忘れてはかわいそう。
550:デフォルトの名無しさん
24/10/09 20:31:07.90 UpCIlB6y.net
>>546
Thenks!!
551:デフォルトの名無しさん
24/10/12 20:07:00.42 fyUcodga.net
初心者はStack、ガチムチはCabalで開発するんですか?
552:デフォルトの名無しさん
24/10/15 05:30:10.38 CzVFQLgH.net
みんなStackだよ
Cabalの依存関係解決はましになったとはいえプロジェクト構成の記述はStackのほうがよくできてるし
553:デフォルトの名無しさん
24/10/15 22:34:15.38 2I09ehic.net
詳しい情報サンクス
CabalやめてStackに帰ります
GHCup tuiで選べるCabalやHLSやStackも全部recommendedに落とします
554:デフォルトの名無しさん
24/10/16 05:04:51.74 PvdZsye3.net
ああCabal辞めてStackに移行したらビルドし直しただけでTLSのハンドシェイクがTwitchでは大丈夫なのにツイキャスで失敗する謎の不具合が治りました
やっぱStackすわ
555:デフォルトの名無しさん
24/10/18 18:33:56.50 358zSdqs.net
別に不具合あったわけじゃないならよくね
みんなとか言い出したらそもそもみんなhaskellなんか使ってないが
556:デフォルトの名無しさん
24/10/25 23:46:50.40 jl3K3ThU.net
Haskellを学んだみたいと思うんだけど、「すごいHaskell たのしく学ぼう」って書籍は今でも有用?
Haskellの良書として挙げることは多いと思うけど、出版から10年以上経ってるのが気になった
その間で言語に大きな変更があったとか、「今のHaskellだったらこう書くよね」みたいな注意が必要な点などあれば知りたい
あるいは最近の書籍でよりおすすめというものでも
557:
24/10/25 23:58:48.00 ss1i659U.net
ちょっと古い情報だけど、
僕が「すごいH」を購入したのが2016.12だけど、数年後には章立ての変更まではなかったかもしれないけど、コードの記述など結構アップデートされてたような
いずれにしても、一冊でHaskellを、ってのはアレで、何冊かは読まないとと僕の場合
558:デフォルトの名無しさん
24/10/26 01:14:59.65 jaMDzNJq.net
>>556
ラムダノートのプログラミングHaskell第2版
これを読めばモナドの使い方がわかる
559:デフォルトの名無しさん
24/10/26 13:33:26.33 qze4GRwI.net
モナドはCのポインタより概念が難しいのどうにかならんの
別のはないんですか
560:デフォルトの名無しさん
24/10/26 14:33:50.42 jaMDzNJq.net
ない
別に理論的な部分はすっ飛ばしていいよ
純粋関数型言語で手続き型言語のようなシーケンスをどうやったら書けるか?みたいなパズルを解く方法と思ってればいい
全てはdo記法にため
561:デフォルトの名無しさん
24/10/26 18:20:45.25 QG40CL6R.net
>>559
だったらCleanはどうでせう?
モナドの代わりに線形何たらっての使ってる。
副作用関数を使い捨て関数と捉える概念らしいけど…。
変数は引数のない関数と捉えられるので、入力関数も外部で代入する変数と捉えられる。
んで、
return 0 >>= \x -> return (x + 1) >>= \x -> return (x + 1) = 2
は
return 0 >>= (\x -> return (x + 1) >>= (\x -> return (x + 1)))
と解釈されて、(\x -> ...) 部分が1個のラムダ式(関数)の上に階層構造なので、同名の変数 x はシャドーイングで古い値は隠される。
(そして隠されたら他から参照されなくなるのでGCでメモリを解放される)
IOモナドな入力関数も引数が無いので、値を外部で代入する変数と捉え、シャドーイングで古い値は隠されると考えると、線形何たらの使い捨て副作用関数と同じことしてる。
562:デフォルトの名無しさん
24/10/28 07:23:18.71 duvMwVsG.net
>>557 >>558
ありがとう
まずはラムダノートのプログラミングHaskellを買いました
すごいH本はもう一冊読もうと思って時に買います
563:デフォルトの名無しさん
24/10/28 11:18:21.59 ABlPDVd9.net
すごいエロい本か
564:デフォルトの名無しさん
24/10/28 16:01:27.57 3PX2guVI.net
>>563
それ面白いと思ってレスしてんの?
565:デフォルトの名無しさん
24/10/28 17:13:55.02 B1OBTGXf.net
10年前のtwitterでは鉄板ジョークでしたよ
すごいH
566:デフォルトの名無しさん
24/10/28 19:07:28.37 aKxYxFxQ.net
haskell知らない人はエロ本だと思うし
隠れた卑猥な意味が無ければ
隠語としての価値も無い
567:デフォルトの名無しさん
24/10/28 19:57:49.83 2RuMUG8y.net
ML族のRustが市民権を得た今haskellやる意味ないよ
その時間をRustに当てなさい
568:デフォルトの名無しさん
24/10/28 21:28:05.60 B1OBTGXf.net
平均的HaskellerはRustもやった上でLinearTypes拡張がどうなるか様子見しつつ両方使ってるのでは?
URLリンク(zenn.dev)
569:デフォルトの名無しさん
24/10/28 22:50:50.12 duvMwVsG.net
Haskellスレで言われましても
わざわざカレー屋に来て「ラーメンを食え」って喧伝するようなものでしょ
570:デフォルトの名無しさん
24/10/29 10:29:33.30 2QinlXet.net
>>567
ほんそれ
571:デフォルトの名無しさん
24/10/29 11:58:27.10 IrbjK6II.net
Rustを関数型扱いするやつは
Rustも関数型もまるで理解してない
だから誰も真面目には相手してくれない
572:デフォルトの名無しさん
24/10/29 12:22:05.93 dZcxKFDp.net
そう。世界がHaskellから孤立していく
世界はもっと危機感もった方が良いよ
573:デフォルトの名無しさん
24/10/29 15:30:57.70 +9FvEifI.net
実用プログラムに使った例はあるの?
574:デフォルトの名無しさん
24/10/29 16:00:48.67 FJXFYfo2.net
>>567
MLとは全然ちゃうがな
HM型推論せんやろ
575:デフォルトの名無しさん
24/10/29 22:29:59.15 LPWWq4s4.net
>>573
自分も詳しくはないけど、クローズドな分野が多いんじゃない?
576:デフォルトの名無しさん
24/10/29 23:08:38.64 +9FvEifI.net
>>575
秘密ということ、それじゃわからんと同じことじゃないか
577:デフォルトの名無しさん
24/10/29 23:25:09.95 6SLkDv7J.net
世界は頭悪すぎてHaskellを使いこなせていない
世界はもっと危機感を持った方が良い
578:デフォルトの名無しさん
24/10/30 02:10:51.19 p9nsrTZ/.net
急に主語が大きくなったぞωωω=2πf
579:デフォルトの名無しさん
24/11/02 09:15:14.82 KpOoS8wa.net
クローズドな部分なら使ったうちには入らないな
580:デフォルトの名無しさん
24/11/02 18:11:47.64 3NvQMTDb.net
金融工学で使ってるとこあるかもね
OCamlが定番らしいし
581:デフォルトの名無しさん
24/11/02 19:19:33.26 Mufqfjtq.net
>>580
やはり実務ではフィンテックですか。
このスレで趣味教養的に
数理の応用実験や
アート作品生成プログラム記述用とかで
使ってる香具師いる?
582:デフォルトの名無しさん
24/11/02 19:33:48.22 pIz290+w.net
>>580
みずほでOCamlしか聞いたことない
結局大規模障害出ちゃったけど
583:デフォルトの名無しさん
24/11/02 19:38:33.59 3NvQMTDb.net
>>582
金融商品の設計に使うんだよ
その手の障害とは全く関係ない
584:デフォルトの名無しさん
24/11/02 20:11:17.53 pIz290+w.net
>>581
どっちかというと、教育に興味があって、例えば足し算の足し方が増加と追加って2種類あるんだけど、追加は後から増えるって意味だと教科書に書いてあるけど、その説明がもやもやする。
それで、違いを考えるとこれは
増加の足し算:末尾再帰。その場で簡約出来る
3 + 2 = (3 + 1) + (2- 1) = 4 + 1 = (4 + 1) + (1 -1) = 5 + 0 = 5
追加の足し算:再帰。基底部まで来てから簡約開始。リストの ++ 演算子的な動き。
2 + 3 = 1 + ((2 - 1) + 3) = 1 + (1 + ((1 - 1) + 3)) = 1 + (1 + (0 + 3)) = 1 + (1 + 3) = 1 + 4 = 5
みたいに、足し算作らないと気付かない違いを気付いて教えるのに役立ててる。
(+1/-1の代わりにsucc/pred関数の適用で考えた方が分かり易いかも)
585:デフォルトの名無しさん
24/11/02 20:16:43.59 pIz290+w.net
>>583
そうなんだ。
そういうライブラリ頼みっぽい事なら、MathmacticaとかPythonのが良さそうなのにね。
金融商品だったら統計に強いRだってあるし。
なぜわざわざOCamlだったのやら…。
586:デフォルトの名無しさん
24/11/03 11:40:35.68 kGU90lSm.net
>>584
本スレ誘導
スレリンク(tech板)
587:デフォルトの名無しさん
24/11/03 17:33:41.03 4RaSizfZ.net
その手のはかなり昔からの話だしその頃pythonはそんな一般的ではない
588:デフォルトの名無しさん
24/11/03 18:58:10.27 W/WQS3jI.net
>>586
え…。
Haskellを何に使ってるか聞かれたから答えたのに、そりゃ無いよ。
589:デフォルトの名無しさん
24/11/06 18:53:34.69 s8sk505y.net
semigroupoidsのAltからFunctor抜いたやつないのかな
catsのSemigroupK相当のやつ
590:デフォルトの名無しさん
24/11/07 02:17:24.00 w1FRCcDr.net
HackageもHaskellWikiもつながらねえ
攻撃でも受けたか
591:デフォルトの名無しさん
24/11/07 06:45:43.72 NVSipRlq.net
数か月前もHoogle繋がらなかったしね…。
592:デフォルトの名無しさん
24/11/09 18:32:16.19 r4DlAvJp.net
mylist.py TotalSeconds : 6.1246778
1:def mylist(n, m):
2: a = 1
3: outer = []
4: for _ in range(0, n):
5: inner = []
6: for _ in range(0, m):
7: inner.append(a)
8: a += 1
9: outer.append(inner)
10: return outer
11:
12:print(mylist(6000, 8000)[-1][-1])
上と同じ動きのコードを書いたけど、
アルゴリズムとしてはPythonと同じmylist.hsのコードが良いはずなのに、
どっちも最適化するとmylist2.hsのが良好。
(ファイル名の横の秒数は実行時間)
mylist.hs TotalSeconds : 4.107899
1:main = print.last.last $ mylist 6000 8000
2:
3:mylist n m = take n.f $ [1..]
4: where f ns = xs:f ys
5: where (xs, ys) = splitAt m ns
mylist2.hs TotalSeconds : 2.3916408
1:main = print.last.last $ mylist 6000 8000
2:
3:mylist n m = take n.iterate f $ [1..m]
4: where f = map (+m)
593:デフォルトの名無しさん
24/11/09 18:32:43.47 r4DlAvJp.net
mylist2.hsのアルゴリズムは
f = map (+3)とすれば
[1,2,3]
[4,5,6] -- f [1,2,3] = [1 + 3, 2 + 3, 3 + 3] = [4,5,6]
[7,8,9] -- f (f [1,2,3]) = f [1 + 3, 2 + 3, 3 + 3] = [4 + 3, 5 + 3, 6 + 3] = [7,8,9]
と、行数が増えるごとに関数の適用回数が増えるので本来なら遅いはずですが、
考えるに直前の結果をキャッシュする様な最適化が施された模様。(-O3)
(そうすると、mylist.hsのsplitAtの方がボトルネックになる?)
最適化なしでのコンパイルはしてないので、
もしかしたらiterateの中身自身がキャッシュするように改良されたのかも。
594:デフォルトの名無しさん
24/11/10 16:05:22.18 AfmJKCJ3.net
これ数学的にどういうことなのか
かいつまんで教えてくらまいか
watch?v=dYj0rPQeRkA
595:デフォルトの名無しさん
24/11/16 10:08:07.70 9CYVpzbn.net
Category Theory Using Haskell
An Introduction with Moggi and Yoneda
Shuichi Yukita
という書籍が来月出るんですって?
596:デフォルトの名無しさん
24/11/16 14:32:48.68 Avgm411i.net
>>595
高いな
> Hardcover
> \36,125 Tax included
597:596
24/11/16 14:36:30.07 Avgm411i.net
円記号がバックスラッシュになっていたので訂正
¥36,125
フォントによるわけだが
598:デフォルトの名無しさん
24/11/16 15:13:06.50 ZnREBqGy.net
買って損するだけの高額本の予感
599:デフォルトの名無しさん
24/11/16 15:27:44.60 x85mVkLf.net
なんだ雪田の本じゃねぇか
プラスアルファはあるかも知れんが
基本雪田の「圏論入門 Haskellで計算する具体例から」と大差無いと思うぞ
600:デフォルトの名無しさん
24/11/16 20:50:43.88 ZUJ+jDQV.net
結局Moggiのアイディアがなんなのか書いてなかったから、洋書でも同じでしょ。
601:デフォルトの名無しさん
24/11/16 21:01:44.68 UsNa54E4.net
すでに書かれてるのがwikipediaにあるじゃん
URLリンク(ja.m.wikipedia.org)
602:デフォルトの名無しさん
24/11/16 21:18:48.47 ZUJ+jDQV.net
wikiのは肝心のvalueとcomputationについてちゃんと書いてない。
computationの訳を「計算された値」とするのは微妙。
603:デフォルトの名無しさん
24/11/16 21:28:16.06 ZUJ+jDQV.net
『圏論入門』の方にはvalueもcomputationも書いてなかったと思うから言わずもがな。
604:デフォルトの名無しさん
24/11/16 21:43:11.16 HNcchqjT.net
出たら人柱になって買って読んで下さい
605:デフォルトの名無しさん
24/11/16 22:29:43.38 MlIU4R6X.net
多分加筆してると思うよ
日本の出版社はなぜかページ数制限があることが多いんだけど
海外にそれはないし
606:デフォルトの名無しさん
24/11/16 22:41:34.37 ZUJ+jDQV.net
加筆してvalueとcomputationの説き起こしから始めて本当にMoggiのアイディア書くかなぁ?
米田の補題が工学応用できるとかいう主張と衝突する気がするんだけれど。
607:デフォルトの名無しさん
24/11/17 08:11:12.88 RK7ri1yG.net
レポよろ
608:デフォルトの名無しさん
24/11/17 09:07:13.97 zx90fdBd.net
ぷりぷりです
609:デフォルトの名無しさん
24/11/17 14:35:29.88 895B27h0.net
4万近く出してわざわざレポだけする奴なんているの?
圏論入門と同じでそれらしいキーワードだけ出して終わりの可能性高いのに。
610:デフォルトの名無しさん
24/11/17 19:34:30.56 A63wUj4E.net
まぁそもそもHaskellで圏論持ち出す必要ないしな
生産性上がらないよ
611:デフォルトの名無しさん
24/11/17 19:42:07.02 bAlb8WtH.net
Haskell、コーダー界隈で圏論勉強会が流行していた時期、あれは何だったのか?
612:デフォルトの名無しさん
24/11/17 20:00:10.23 895B27h0.net
圏がグラフの拡張みたいな概念だったから、グラフ理論みたいに有用なプログラミングにつかえるアルゴリズムがあるんじゃないかってことでやってたように見えた。
モナドも説明したかったようにみえたけど、結局圏論の勉強を踏まえた説明はでてこなかった。
613:デフォルトの名無しさん
24/11/17 21:17:15.64 U7PWp5lE.net
>>611
俺も行ってたわw
数学クラスターからの圏論マウントを喰らっていくのやめたがw
そういうやつ多いんじゃないか
614:デフォルトの名無しさん
24/11/20 04:56:53.37 vcDCbnyw.net
プログラムは合成できないといけないって当然のことを、いちいち圏である必要があるとか言い換えるオレ天才だわー
615:デフォルトの名無しさん
24/11/20 18:55:46.60 QVKMRnqI.net
URLリンク(dic.nicovideo.jp)
616:デフォルトの名無しさん
24/11/21 00:16:43.88 r2/mXbdf.net
集合論と圏論の抽象度がもし同レベルならたしかに圏である必要はないな
必要ない情報は捨象されるべきだと言われれば何も反論できない
だから抽象化マウントは強いんだ
617:デフォルトの名無しさん
24/11/21 01:45:46.56 bAf4oZLa.net
抽象化すればプログラムしにくいと思うけど
618:デフォルトの名無しさん
24/11/21 19:02:52.56 fTdZV0pc.net
プログラムが圏になるためとかいうクソしょうもない理由がモナド導入の理由って本当か?
圏論っていうか圏じゃん。モノイド構造も米田の補題もなにも出てこないんだが
619:デフォルトの名無しさん
24/11/21 21:57:07.56 r2/mXbdf.net
型構築子を導入すれば関手もモナドも勝手についてくる
型を必要とするすべての言語で同じことが言える
これも抽象化
620:デフォルトの名無しさん
24/11/28 10:04:33.91 p2Q1UON9.net
haskellでスクレイピングがやりたいんだが
arch linuxのリポにはscalpelがない
別言語でやったほうがいいかな?
621:デフォルトの名無しさん
24/12/04 21:11:42.90 D3PBVzJs.net
ディストリで全部パッケージ化してくれてるとは思えん
stackかcabal入れて自分で管理するんじゃね?
ローカルに1GBくらいのライブラリ入るし重複しないようにしないといかんが
もちろんseleniumとか使うにしてもpythonとかrubyのほうが楽やろ
622:デフォルトの名無しさん
24/12/08 23:12:57.17 G2o8fSXB.net
おおむね10^-300前後(-400乗は無理だった)精度の任意精度少数。
定義済みの中ではPico(10^-12)までは定義されてる。
下の定義のE300/10^300/F300を書き換えれば任意精度の浮動小数型が作れる。
(F300がPicoとかNanoとかの型)
ただし、pi/sin/sqrtなどの倍精度/単精度の浮動小数型用関数/定数が使えなくなるので四則演算を駆使して自作する必要がある。
import Data.Fixed
data E300
instance HasResolution E300 where resolution _ = 10^300
type F300 = Fixed E300
623:デフォルトの名無しさん
24/12/19 15:03:02.64 NXRHTsH0.net
add (x,y) (a,b) = (x+a,y+b)
これをaddを定義せずにarrowで簡単にかく方法はありますか
624:デフォルトの名無しさん
24/12/19 16:15:15.91 hCGKCs/t.net
arrowてなんすか
625:デフォルトの名無しさん
24/12/19 19:27:09.72 gIJYmlNm.net
富士通のスマホ
626:デフォルトの名無しさん
24/12/20 01:32:43.30 /9ZUXmih.net
スマホでHaskellを簡単に書く方法はないかな
627:デフォルトの名無しさん
24/12/20 02:01:04.72 I9azuXSK.net
>>626
今はキミの言うところの「簡単」ではない環境で書いてるってこと?
628:デフォルトの名無しさん
24/12/20 02:04:07.41 /9ZUXmih.net
>>627
だまらっしゃい
俺がウザ絡みするのは良いけどアンタにレスつけてウザ絡みする権利はないんだよ
何故ならアンタは世界で一番価値のない存在だからね
629:デフォルトの名無しさん
24/12/20 15:54:59.07 IOWVZ3it.net
スマホでHaskell書く必要ある?
ないよね
630:デフォルトの名無しさん
24/12/20 22:08:57.75 uE9QxZQG.net
>>626
iOSならRaskellってアプリあるけど、開発止まって大分経つので画面がずれたりする…。
ideoneとかpaiza.IOとかのクラウドサービスが今のところは一番手軽かもね。
631:
25/01/08 22:25:29.83 lvne7rNk.net
初学者のため、言葉の定義があいまいな部分はご容赦ください
IOモナドの純粋性についてですが(すでに言葉があやしい)、
実際に副作用が起こるのは、mainに束縛され実行されたり、ghciプロンプトからアクションを投入したときで
アクションを生成するまでは同じ入力に対してはつねに同一のアクションを出力するという意味で純粋であるという理解でよいでしょうか(まだ実行前なので、副作用は生じていない)
アクションを生成するまでが純粋
ただ、このときの純粋性の有り難みがさっぱり分からず…
純粋な関数が遅延評価などに有効なことや、副作用のある処理が >>= などで順序を拘束しなければならないことは分かるのですが
632:デフォルトの名無しさん
25/01/09 20:13:21.93 xwwTGWUu.net
評価が全部終わった後じゃないと参照透明性が保証されない。
633:デフォルトの名無しさん
25/01/09 20:18:47.77 xwwTGWUu.net
規制あったはずなんだけどなんか書き込めた。
アクションの生成が完了(コンパイルの終了)。この時点ではみんな純粋。
その後に、アクションの実行(プログラムの実行)が起こって入出力が出る。
アクションの生成時点まですべての関数が純粋関数だということは参照透明性が保証されるということで、ありがたみはその一点にあると思うが。
634:デフォルトの名無しさん
25/01/09 21:49:19.20 31eIYKLT.net
異教徒は汚染物として分離隔離する思想
635:
25/01/09 22:58:50.93 vav7Znkh.net
>>632-633
ありがとうございます >>631 です
あくアクションの生成までが純粋、でよいことを確認させていただきました
でもこれって、Cだろうがアセンブラだろうが、(厳密には違うかもしれませんが)同じソースコードをコンパイル(アセンブリ)すれば同じオブジェクトファイルが生成されるのと何が違うのだろうかと
>>634 にある分離隔離のような、何かこう、これまでとは違う何かがあるはず…と、浅知恵で考えるから訳が分からないのです…
636:デフォルトの名無しさん
25/01/09 23:09:19.47 2G6IUNoe.net
>>634
おパンツ分解されたオペラッドのおパンツの中で脱糞してもズボンの裾のお股のどっち側からウンコが転げ出てくるのかわかんないだけかと思ってた。
637:デフォルトの名無しさん
25/01/09 23:34:59.91 xwwTGWUu.net
>>635
>でもこれって、Cだろうがアセンブラだろうが、(厳密には違うかもしれませんが)同じソースコードをコンパイル(アセンブリ)すれば同じオブジェクトファイルが生成されるのと何が違うのだろうかと
だから参照透明性の保証だって。オブジェクトファイルとしては状態変化とかしているけれど、元のHaskellコードとしては参照透明性は保たれている、そこがすごいということなんだし。
逆に普通のオブジェクトファイルと全く違うなんてことありうると思う?同じコンピュータ上で動くんだからオブジェクトファイルとしては変わらんだろ。
638:
25/01/10 09:27:26.71 N8eMPB8m.net
>>637
レスをありがとうございます
参照透過性の保証、ですね
アクションを実行し、副作用が起こる前なので当然だ、という解釈は誤っているでしょうか
まだ本の上の字面を追って学んでいるだけで圧倒的にコーティング量が足りない状態なので、これから経験を積むうちにいつかスッと腑に落ちるときがくるのかもしれません
639:デフォルトの名無しさん
25/01/10 10:01:16.98 xLB3XHZu.net
必要呼び評価戦略を採用するための前提として、すべての式の参照透過性が要求されるというだけでは
640:デフォルトの名無しさん
25/01/10 18:54:00.90 X+hiLHcK.net
>>638
>アクションを実行し、副作用が起こる前なので当然だ、という解釈は誤っているでしょうか
?なんか混乱しているんじゃないか。
アクションの生成時点でのHaskellコードの参照透明性と、オブジェクトコード実行の際の参照の処理は別物だぞ。
641:デフォルトの名無しさん
25/01/10 18:59:59.95 X+hiLHcK.net
補足:
Haskellコンパイルは少なくとも次の二つの段階を持つ
1.アクションの生成(入出力指示書の生成、Haskellコードの字面のコンパイル)
2.アクションの実行
1.のアクションの生成時に参照透明性がHaskellコードとして保証されている。
アクションの生成で必要な参照行為は全て終わっているので、2.では入出力だろうが破壊的操作だろうがやっても文句を言われない。
IOの機構がすごいのは1.アクションの生成計算で参照透明性が保証されているというところがうれしいところ、だという話。
642:デフォルトの名無しさん
25/01/10 19:16:07.13 NIbIyPdh.net
一度死んだら復活は有り得んので注意な
643:
25/01/10 19:39:05.74 N8eMPB8m.net
>>640-641
レスをありがとうございます
そうですね
表現がいけませんでしたが、そのように理解しています
あとひとつ伺いたいのが(アドバイスいただいたことがまだちゃんと理解できたわけではないのでアレですが)、
参照透明性が担保されているとは、(1.アクションを生成する時点までは)副作用がある処理は書くことができない、ということでしょうか
644:
25/01/10 19:48:40.81 N8eMPB8m.net
>>643 ですが、
このレスはちょっと意味が分かりませんね
実行前なので副作用は怒りようがありませんね
645:デフォルトの名無しさん
25/01/10 20:01:13.00 X+hiLHcK.net
>>643-644
そのように理解しています。って本当に理解してるか?
アクションの生成において生成しているのは入出力の指示書みたいなもので入出力自体はない。
こういう入力があったらこういう計算方法でこういう出力をするみたいな手順を生成しているだけ。
なんで参照透明性が担保されているというところでそんな引っかかるんだ?
646:
25/01/10 20:34:59.37 0gelnbg2.net
>>643 で確認したかったことは次のようなことでした
アクションを生成する段までは副作用なく、同一のプログラムを入力とすれば、かならず同一のアクションが出力されるか
ということでした
それはそうであるように思います
647:デフォルトの名無しさん
25/01/10 20:42:16.47 X+hiLHcK.net
同一のプログラムを入力とすればってどういう意味?
前も言ったようにアクションの生成とアクションの実行は別フェーズ。同一のアクションが出力される、というのはどっちのフェーズでのことを言ってんの?
648:
25/01/10 21:16:13.66 0gelnbg2.net
アクションが出力される、なので 1.です