関数型プログラミング言語Haskell Part34

1デフォルトの名無しさん
垢版 |
2021/12/17(金) 12:57:26.37ID:NPioGyUL
関数型プログラミング言語 Haskell について語るスレです。

Haskell Language(公式サイト)
https://www.haskell.org/
日本Haskellユーザーグループ - Haskell-jp
https://haskell.jp/

前スレ
関数型プログラミング言語Haskell Part33
https://mevius.5ch.net/test/read.cgi/tech/1581326256/
323デフォルトの名無しさん
垢版 |
2024/08/11(日) 17:42:41.08ID:7wNJGHOt
麓から山頂を目指す

foldl: 徒歩で登り切ったら滑り台で向こう側へ降りてゴンドラで再び山頂へ戻りゴール
foldr: ゴンドラでいきなり山頂へ。そこから向こうの麓まで滑り台で降り、そこから山頂へ徒歩で戻る。但しある場合は滑り台を途中で降りてそこから山頂へ徒歩で戻ってゴールにしてもよい

こういうこと?
324デフォルトの名無しさん
垢版 |
2024/08/12(月) 21:44:35.95ID:EAbaqMlq
Preludeのライブラリドキュメントのページが最新のChromeでよく応答なしになるんですが!
現代PCでもプチフリを起こすページとか凄いですね!(怒)
325デフォルトの名無しさん
垢版 |
2024/08/13(火) 01:44:03.00ID:3Ko8/FbA
>>324
hoogle使いんさい。
326デフォルトの名無しさん
垢版 |
2024/08/13(火) 01:45:16.10ID:3Ko8/FbA
>>323
foldl = 末尾再帰を高階関数化
foldr = 普通の再帰を高階関数化
2024/08/15(木) 10:15:40.11ID:oieuoNWz
yesod を導入しようとして調べているのですが、今は stack 前提で cabal での利用は考えられていないのでしょうか?
導入記事では cabal の記述がありますが、
yesod init すると stack new 使えと表示が出ます。
2024/08/15(木) 10:30:38.08ID:oieuoNWz
yesod-bin 1.6.2.3 です
2024/08/19(月) 21:35:37.73ID:CkMOJkdv
rambda.jsのfold相当の関数を教えてください
2024/08/24(土) 05:56:24.20ID:WHJg2+SV
今ってghcupの時代じゃないの?
久しぶりにHaskell書こうと戻ってきた浦島太郎がstackを最新にしようと思ったら
ghcupとか紹介されてミーハーだから飛びついたわ
2024/08/24(土) 07:38:35.09ID:E4GXjFrz
Gカップ、ハアーハアー
2024/08/28(水) 21:41:00.96ID:HNkudrYA
Youtubeでしばらくの間丁寧にHaskellを解説していた人が
ある日「やってらんね、俺はもうHaskellでプログラミングしない」と宣言してHaskellから離れたのを見て
所詮その程度の言語なんだなとガッカリした
2024/08/28(水) 23:56:40.97ID:FNkSebMV
>>332
Haskellはモナドの実証言語という側面が強いから、モナドは結局よくわからないものという結論に達した今では話題もないし、Haskellで視聴回数稼げないんじゃない。
334デフォルトの名無しさん
垢版 |
2024/08/29(木) 12:50:10.24ID:D5XAFbVY
自作ライブラリの(+)とPrelude.+が被って、Prelude.+使いたい時一々修飾するの面倒くさいしコードも汚くなります
被った時はデフォルトでPrelude.+を使うよって指定することはできないのですか?
2024/08/29(木) 12:53:31.30ID:1jszJs3n
>>332
+1
2024/08/29(木) 12:54:42.14ID:1jszJs3n
>>334
自作の方を修飾
337デフォルトの名無しさん
垢版 |
2024/08/29(木) 14:06:11.00ID:gtm/5H5m
>>334
両方使う予定があるのに、何故わざわざ同じ記号にしたのか…。
自分は自作の方を(.+)とか、微妙に変えてる。
338デフォルトの名無しさん
垢版 |
2024/08/29(木) 14:06:50.30ID:gtm/5H5m
使用例:
1 .+ 1
>2
2024/08/29(木) 16:27:15.59ID:Nq0HdWD9
やだやだ!修飾したくない!
どっちの+か特定して自動的に選択してよう!
2024/08/29(木) 16:57:49.70ID:YXIyrRhD
何の自作型だか知らんがSemigroup実装して(<>)にでもすれば
2024/08/29(木) 17:40:12.63ID:aIGVGYPU
就職しろよ
342デフォルトの名無しさん
垢版 |
2024/08/29(木) 20:48:46.38ID:gtm/5H5m
>>339
独自の(+)を自動で使い分けてもらうにはNum型クラスのインスタンスにする必要があるけど、それでも見分けるには型が違わないといけない。

独自の(+)は、独自の型を受け取りますか?
そうじゃないとPreludeの(+)と判別する術がないけど。
343デフォルトの名無しさん
垢版 |
2024/08/29(木) 20:51:12.20ID:gtm/5H5m
あ、できれば型宣言を見せて貰えるとアドバイスしやすい。
344デフォルトの名無しさん
垢版 |
2024/08/31(土) 21:17:53.38ID:XbdVGeAf
ワカランドとして .+. と .-. と .*. を定義することにしました。しかし本質的に解決するにはNumクラスのインスタンス宣言するらしいですね。
しかし独自型同士の+と-、Rationalとの*、Rationalとの/はできますが、
独自型同士の*、独自型同士の/は定義不可能です。
従ってNumクラスになることはできませんでした。
結局どうしていいか判らんどからのワカランドで落ち着きました。
345デフォルトの名無しさん
垢版 |
2024/09/03(火) 18:48:39.95ID:yXFMfbtr
もしかしてData.Mapって遅い?
一日中検索かけてるような処理なら、もうMapを卒業するべきときか・・・
346デフォルトの名無しさん
垢版 |
2024/09/04(水) 00:16:15.77ID:r/FGXedG
Data.Mapというより、リストが遅い。

とりあえずコンパイルの際にghc -O2とかghc -O3とかの最適化掛けてみる。

それでもなお速さを求めるなら、ByteStringとか使うと良い。

もしくは、正格評価版HaskellことIdris 2やRustに乗り換える。
(Idris1と2で互換性が無いらしく、別言語扱いされてる)

Haskellで速さを求めるとバッドノウハウが増えて本末転倒になる。
(そこまで苦労するなら素直に速い言語覚えた方が楽。それでも9.10.1はC#並みにはなった?かな?)
347デフォルトの名無しさん
垢版 |
2024/09/04(水) 15:29:34.52ID:ZA+d8/X/
リストが遅い、しかし多くのデータ構造の構築はリストから(fromList)。
つまりコンストラクション回数をいかに減らすか、一度コンストラクトした物を使いまわすか、ということですか
2024/09/04(水) 16:12:14.21ID:LSV34QaC
lisp系言語はリストの操作が速いのに…
349デフォルトの名無しさん
垢版 |
2024/09/04(水) 22:00:37.92ID:r/FGXedG
>>347
そういう事。
そして、そういう事を考えさせる時点でどうなの?ってのもある。

文法好きだし、普段使いで困らないけど、速さ求めるなら他の言語使うよねって。
350デフォルトの名無しさん
垢版 |
2024/09/04(水) 22:22:04.95ID:r/FGXedG
>>348
遅延評価だからってのも地味に大きい。

自分はプログラミング言語「数学」の(未完全な)実装として見てるので、遅延評価じゃないと困るが。
2024/09/05(木) 00:27:39.10ID:mpd8c2G1
普段使いって何してんの
エロ画像収集とか?
352デフォルトの名無しさん
垢版 |
2024/09/05(木) 04:50:37.33ID:l0HQxOqp
PythonやPerlの代わりにテキスト処理に使ってる。
2024/09/05(木) 18:56:54.85ID:k3Tfomjz
>>351
それ面白いと思って書き込んでんの?
2024/09/06(金) 09:50:34.80ID:zzPaKLb6
ブラウザでリンク画像が http://host/hoge.php?hage=fuga.jpg
みたいになってて最終的に jpg が表示されてるんだけど
http://host/hoge.php?hage=fuga.jpg をブラウザで開いても
jpg じゃなくて jpg ファイルのイメージがテキストファイルみたく表示される
こういうのは hoge.php の造りが悪い(たぶんhttpヘッダーが可笑しい)んだろうけど
じゃあなんで元頁では画像が表示されてたのかとか疑問は残る
それはともかく欲しいのは jpg ファイルなので
ブラウザに頼らずダウンローダーを描いた
355デフォルトの名無しさん
垢版 |
2024/09/06(金) 09:52:13.17ID:zzPaKLb6
補足
修正前: jpg ファイルのイメージ
正: jpg ファイルのバイナリデータ
356デフォルトの名無しさん
垢版 |
2024/09/07(土) 19:33:25.03ID:9PXNQc4Q
長大な処理となる関数を実行途中にRAM使用量が嵩んでいくとします
中には解放できる部分もある場合について、
このままガベコレせずに進んでいったらいずれOSが『君にはもうRAM貸せないよ』と言ってくるでしょうが、ランタイムシステムは
@その時になってようやく解放できる場所がないか探し出す
  @-i 今必要な最低限の確保ができたら即そこに記録して終わり
  @-ii 強制的にminorGCを発動して、即そこに記録して終わり
  @-iii 強制的にMajorGCを発動して、即そこに記録して終わり
  @-iv 強制的にBlockingMajorGCを発動して、即そこに記録して終わり
  @-v もはや解放できる場所は見つからないと判断したら例外終了
A何もせず例外終了する
Bその他

どれですか?
357デフォルトの名無しさん
垢版 |
2024/09/07(土) 19:35:13.52ID:9PXNQc4Q
文字化けしちゃいました。文字化けした?は1、2,3だと思ってください
358デフォルトの名無しさん
垢版 |
2024/09/08(日) 00:17:59.58ID:m7MeNrY2
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化できますか?
2024/09/09(月) 11:45:42.71ID:CQiqzRbc
>>356
黙って動いてるフリをする
2024/09/26(木) 23:16:42.97ID:eAiUCVhs
この言語まだ息してるのか?
2024/09/27(金) 00:41:23.43ID:ppX7mFe8
おまいらは圏論はちゃんとマスターしたか?
最近圏論のお勉強流行ってないみたいだが
2024/09/28(土) 08:56:06.97ID:boijaUwp
そもそもHaskellに圏論必要ないよ
2024/09/28(土) 11:20:55.86ID:szplrxFB
背景の理論を理解してないとbrainf*ckと同列のクソパズル言語にしか見えない
2024/09/28(土) 11:30:45.96ID:D4fCa7Ze
米田の何ちゃらの辺りで心が折れて終了
2024/09/28(土) 11:48:20.49ID:M6f6jLKS
>>363
> brainf*ckと同列のクソパズル言語

話がそれるけどbrainf*ckがパズル言語なのは100%その通りだよ

しかし構文パーサー、インタープリターやトランスレーター、JITエンジンの実践入門として
丁度良いからこれだけ根強い人気なんだぜ
366デフォルトの名無しさん
垢版 |
2024/09/28(土) 20:40:40.54ID:SDDTPU1M
>>361
流行ってないのか…。
個人的にはHaskellよりも圏論の方に関心が移ってるのに…。

んでも、圏論はHaskellでなくても、全てのプログラミング言語の裏側でも動いてるし、それこそ算数の裏側でも動いてる。

モナドが表に出てきてるからHaskellには圏論が必要って思うかもだけど、モナドって言わないで do形式だけ教えて知れっとしてても良いし、「こういう動きの演算子」としてモナドを紹介するだけでも良い。

受験数学とちゃんと向き合う数学みたいなものだけど、変にモナドを理解しようとすると深みにはまる。
(それはそれで楽しいけど、楽しめる人だけだよね…)
2024/09/29(日) 07:33:19.55ID:bBvJfaeS
ラムダと束縛変数をマスターしなければdo記法もマスターできないのを
すっかり忘れるぐらいポイントフリーが普及してるでしょ
2024/09/29(日) 08:45:10.72ID:3/NLN/+f
コーダーが数学の学習に使える時間なんて限られている
時間や基礎知識が足らないので、難解な数学を攻略するのはほぼ不可能
大学生時CSや数学の講義で身に付けておくしかない
2024/09/29(日) 09:32:49.44ID:twIz68VA
難解な数学を攻略できるなら
日本ではコーダーにはならないよな
2024/09/29(日) 10:15:01.09ID:AteoOTMZ
業界入るのに難解数学不要
プログラミングにも不要
数学分からんのでgoogle入るのは無理だけど
2024/09/29(日) 11:01:25.51ID:bBvJfaeS
人工的なルールに依存するのがクソパズルだが
自然界でなおかつ野生のマウンティング的なルールにも依存しないことが数学の目的のひとつだね
2024/09/29(日) 20:36:16.00ID:JU2vTa1F
圏論が全てのプログラミング言語の裏で動いてるとか適当なこと書くなよ
373デフォルトの名無しさん
垢版 |
2024/09/30(月) 00:30:17.34ID:Kh4w53R0
>>368
高卒の自分でも理解できるんだから、難しいわけではないんだけど。
何度も出てる通り、必ずしもモナドを理解する必要はないし。

そもそも自分がプログラマーの頃だって、12-13時間働いた後も新しいプログラミング言語や数学勉強してたぞ。
(新しい仕事のために学びたくない言語に時間使う事も)

高卒が圏論みたいな大学数学学ぶには専門用語がそもそも分らんから、用語が分かるまで遡った。
(アーベル圏のアーベルが分からないレベルからのスタート)

自分に投資できないと淘汰されるぞ。
374デフォルトの名無しさん
垢版 |
2024/09/30(月) 00:59:39.85ID:Kh4w53R0
>>372
適当じゃない。
モナドは(主に)逐次処理に現れる構造なので、Haskellのような遅延評価で逐次処理自体を作らないといけない(逐次処理をエミュレートするためのモナド)言語でない限り、意識することすらない。
(だからC言語で言う i = 0; の「;」とか言われる)
2024/09/30(月) 03:08:44.15ID:g+sPZSfB
>>372
沈黙させる努力をするよりも(全ての)人の話を聞くのをサボる方が良い
努力は時間がかかる
一瞬で報われるものは努力ではない
2024/09/30(月) 12:40:29.07ID:+8KmLjt4
圏論の極々一部のモナドを主語をデカくして圏論ガーとか言ってる人は何も分かってないんだなと思うけどね
俺みたいに数学かじってた人からすると
圏論を勉強すると「あ、この概念はこの分野のこれのことか」ってわかるけど
そうじゃない人は何のことを言ってるのかわからんと思う
専門家でも自分の担当外の圏なんて知らないのに
圏論という括りで語ろうとする人はそういうのすら理解してない
2024/09/30(月) 13:52:28.73ID:CD9F70e/
やっと普通の人が出てきて安心した
2024/09/30(月) 13:59:18.70ID:pkON+G7q
>>376
数学者向けの圏論の教科書の応用、具体例は全て数学。
数学知らない人が読んでも分かるわけがない。
応用、具体例、演習をCSの分野から採った教科書が望まれるが、書くのが難しい上に面白くするのも困難。
大体CSすらちゃんと修めてないエンジニアはやはり読めない。
CS自体ベースに位相、代数、グラフ理論と数学使うし。
2024/09/30(月) 14:09:03.81ID:rwCIuc1C
趣味でやる人に良くいるんだよね。
応用各分野に囚われずに、圏論そのものを学習したい、一般圏論を研究したいって人。
これは数学で言うと、集合論と同じく数学基礎論の分野。
380デフォルトの名無しさん
垢版 |
2024/09/30(月) 19:05:45.94ID:8C0MP56i
操作的意味論とか表示的意味論でプログラムを数学の話にして、その数学を圏論で整理するって話
だからアーベル圏とか具体的な圏はあんま出てこない。
やるとすれば
デカルト閉圏:ランベックがλ計算のモデルになると発見して関数型プログラミング的に重要
クライスリ圏:Moggiが計算効果をカプセル化したときの根拠の圏
ローベア理論:代数的効果をちゃんと理解するときは必要らしい。操作的意味論と表示的意味論と同じようにモナドの理論と妥当性が成り立つようだ。
ぐらいじゃね。
2024/09/30(月) 21:09:21.28ID:CVtPTYpb
じゃあラムダ計算(のモデル)だけを考えよう
タプルや代数的データ型は使わない
それでもモナドの具体例を作れるのを知ってるのが専門バカ
知らないのが一般国民だ
382デフォルトの名無しさん
垢版 |
2024/09/30(月) 21:29:13.05ID:8C0MP56i
一般国民。
λ計算のモデルでモナド作ってなにかいいことあるの?計算効果結局表現できないんじゃ?
拡張してcomputational lambda calculusやるって話?
2024/09/30(月) 21:47:09.45ID:CVtPTYpb
ないんじゃないか
ただ「具体例を出せば、いいことがある」とは誰も言ってない
というファクトをチェックするのは悪いことではない
384デフォルトの名無しさん
垢版 |
2024/09/30(月) 21:53:56.34ID:8C0MP56i
いいこと(メリット)があるから具体例が作られると思うんだが。
それは単に具体例の適用が間違ってるって話じゃね?
なんとなく作れるから群構造作ってみましたとかとか目的不在で作ったらそら何がいいかわからんし。
モナドだったら、各計算効果を圏(クライスリ圏)の中に閉じ込めることに成功しました(カプセル化)。
計算効果は強モナドの構造を取っているようです(計算効果の研究のとっかかり)。
みたいないいことあるから流行るんでしょ。
2024/10/01(火) 04:04:03.18ID:PZ96E01/
別にそれ圏論を持ち出す必要ないよね
ハイおしまい
2024/10/01(火) 09:39:15.78ID:KbL1rq/V
>なんとなく作れるから群構造作ってみました
ルービックキューブのことか
2024/10/01(火) 09:46:07.52ID:y60InQ2q
数学屋さんもね
研究では圏を使うが
学生に教えるときは
圏を記述に使わず教えたりする
388デフォルトの名無しさん
垢版 |
2024/10/01(火) 19:23:20.12ID:7kn4RxVI
圏論の話題になったから振ったのに。まあいいよ。
圏論根拠で(ソフトウェア工学的にじゃなくて)数学的にカプセル化が実現されてるってすごい
ことだと思うけどね。

>ルービックキューブのことか
ルービックキューブ解くという目的あるんなら構築する意味あるんじゃない。
2024/10/01(火) 19:34:54.43ID:YZm15ve9
群持ち出したところで解けないよ
2024/10/01(火) 20:18:43.32ID:PZ96E01/
圏論がプログラミングの問題解決に寄与するわけないのにね
ただ当てはめてみたってだけのことを過大評価しすぎ
2024/10/01(火) 20:52:10.03ID:u1x9FxNe
雪田修一の「圏論入門 Haskellで計算する 具体例から」ってどうなん?
2024/10/01(火) 21:10:04.55ID:YpLGkLDy
板チ
目的と手段を混同したら予選敗退
393デフォルトの名無しさん
垢版 |
2024/10/01(火) 21:16:26.45ID:7kn4RxVI
どうなんって何を知るのに?出たときに立ち読みしただけだけど。
2024/10/01(火) 21:16:56.98ID:Ig6Tf0ue
>>391
青本と似てて定義の後に具体例を出すみたいな感じだけど
具体例が数学科の人じゃないとわからない内容ばかりなので
結局個別の分野をやらないと理解できないと思う
2024/10/01(火) 21:38:18.13ID:Ig6Tf0ue
圏論をやりたいならまず代数学をやるべき
それだけでだいぶ見通しが違う
396デフォルトの名無しさん
垢版 |
2024/10/01(火) 21:42:08.00ID:4kH314XL
>>390
モナドの効用で自分の把握してるのは

・数学やHaskellの様な遅延評価の場合、逐次処理を表現できる
(これは変数を使いまわさない場合は、関数合成で十分だが、変数を使いまわすときはモナドじゃないと使いまわせない)

・副作用のある関数を使っても参照透明性は保たれている

・モナドは入れ物前提の概念なので、空の状態を使って例外処理をまとめることができる

正直、普通のプログラミング言語にも役立ちそうな3つ目は実感はしてないけど、ネットで例外処理よりモナドの方が優秀っぽい記事を読んだ

2番目もマルチスレッドとか最適化には役に立ちそうではある
(マルチスレッドなら正格評価版HaskellのIdris2やRustだと思うが)
397デフォルトの名無しさん
垢版 |
2024/10/01(火) 22:05:17.67ID:4kH314XL
圏論全体だと…当たり前のことを構造として研究してるだけなので、圏論というよりはHaskellの型クラスとの合わせ技で関手(Functor)の方がfmap的なのを他の言語にも導入すれば役に立つかも

圏論の関手を一言で言えば(関数も含めた)型変換
(Hakellだと入れ物前提にすることで、関数ごと型変換を実現。本来はもっと柔軟)

自然変換は一言で言えば単位変換とか、大文字小文字の変換
398デフォルトの名無しさん
垢版 |
2024/10/01(火) 22:16:21.15ID:4kH314XL
モノイドは条件が結合法則だけなので、ほぼ結合法則そのものがモノイド
(その割には繰り返しとか数え上げに現れる構造)

そしてモナドも構造はそっくりなので、入れ物前提のモノイドとも考えられる
(モナドの再帰はループ処理でスタックを消費しないし、数え上げは逐次処理と考えられる)
2024/10/01(火) 23:08:20.75ID:KbL1rq/V
バグを無くすこと自体が目的になりがちなのが数学とプログラムなんだよね
真の目的のため、デバッグを二の次にするやつが正しいと言われても・・・
それって証明とかあるんですか
2024/10/01(火) 23:21:35.19ID:syLuNokt
>>397
大文字小文字の変換が自然変換の部分kwsk

>>399
目的と手段を区別したら、手段は二の次だと言うのは予選敗退者のポエム
2024/10/01(火) 23:25:15.70ID:syLuNokt
>>396
> 2番目もマルチスレッドとか最適化には役に立ちそうではある
それもう一人のsimonが取り組んだけどモナドは否定された
2024/10/02(水) 05:35:22.65ID:OAhBXB+m
やっぱり数学的に表現してみただけってことか
まぁ実際のプログラミングに利益はないわな
403デフォルトの名無しさん
垢版 |
2024/10/02(水) 07:50:08.23ID:AFS53MaU
>>400
よくよく考えたら特別な事じゃないんだけど、普通のプログラミング言語でも大文字・小文字の変換関数を自作するってなったら、文字をInt型に変換して処理する。

それって文字の圏で直接大文字小文字の変換するを作れない場合、一旦整数の圏を経由する関数を作る。

A(a) → B(a)
↓ ↓
A(A) → B(A)

可換図のA(a) → B(a)の逆射が作れれば、B(a) → B(A)が作れる。
ほら、分かってみれば「なーんだ。そんなことか」でしょ?
404デフォルトの名無しさん
垢版 |
2024/10/02(水) 07:53:32.91ID:AFS53MaU
この場合、整数同士の足し算に対応する、文字同士の足し算が作れる。
(ただし、整数と文字列で集合の大きさを合わせる必要がある。0-25とか1-26とかで循環する集合)
405デフォルトの名無しさん
垢版 |
2024/10/02(水) 07:55:35.67ID:AFS53MaU
んで、プログラマーはいちいち集合を合わせないで、エラー処理だったり循環リスト作ったりで対応するわけだぬ。
2024/10/02(水) 08:30:24.33ID:VSz9kg2E
数学の圏論テキストではカリー化の操作は良く使うが、カリー化の名前を付けて引用することはまず無いね。
2024/10/02(水) 08:47:20.09ID:wonXK6QE
>>403
大文字小文字の変換が自然変換になる事を(Haskellの例で)証明して、と言う話

(自然変換が何かは分かっているで、直感的に違うと思ったから訊いた)
2024/10/02(水) 09:21:51.83ID:ZmuRtoMU
大文字の文字列の型から小文字の文字列の型への変換と考えると簡単
2024/10/02(水) 09:24:29.51ID:ZmuRtoMU
リスト関手から集合関手への自然変換も分かりやすい。
2024/10/02(水) 10:25:28.13ID:xCLOcr8o
すまん嘘を書いた
自然変換では無くリストの圏から集合の圏への関手だった
2024/10/02(水) 10:27:20.94ID:ZmuRtoMU
大文字列、小文字列も同様に間違い
2024/10/02(水) 16:24:48.26ID:H02uk4bf
>>402
ただの記号で表現したら「0の逆数」とかいう表現を禁止するのが難しい
ただの記号ではない方がベター
413デフォルトの名無しさん
垢版 |
2024/10/02(水) 20:27:37.99ID: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型を圏とみれば同じ。
可換にするのは面倒くさい上に効率悪いけど、そういう関手を作ろうと思えば作れる。
414デフォルトの名無しさん
垢版 |
2024/10/02(水) 20:45:45.19ID:AFS53MaU
可換図にすると

   Char(小文字)
  ⇗
Int  ⇑toL ⇓toU
  ⇘
   Char(大文字)

ここで、小文字→Int, 大文字→Intが作れればtoLower, toUpperを直接作らなくても、関手の合成で作れる。
2024/10/02(水) 20:53:28.38ID:4E8lSXKR
出番ですよ >>399
416デフォルトの名無しさん
垢版 |
2024/10/02(水) 21:03:02.82ID:AFS53MaU
圏論の地平線でも書かれていたけど、圏論は直接的に役に立つというより、発想の転換の源泉になるそうな。
(なので、別に圏論分かったから偉いとかない)
2024/10/02(水) 21:18:36.03ID:JUMm5MLB
数学の研究には有用かも知れないが
プログラミングで
直接役に立つようなことはまず無い
2024/10/02(水) 21:42:50.80ID:Xrjxo4NT
どっ白け
419デフォルトの名無しさん
垢版 |
2024/10/02(水) 21:51:30.73ID:OPLMo7z3
プログラミング言語もどんどん数学に寄せているし、上のカキコみたいにプログラムの記述を
そのまま数学的対象とみなせるように改造していってると思う。本来は別物と考えるべきだと思う。

数学の研究といってもプログラム意味論の研究で、プログラムを数学の世界に写像したら
どう表現できるかということを研究していると言えるんじゃないかと思う。
数学の世界には、式の評価途中に発生する副作用といった概念がないので、現実のプログラムを
そのまま数学の世界に移そうと思ってもできないことの方が多い。
計算効果を圏論的に表現できたというのは、そういうプログラミング言語の数学化の一端みたいな
もんだと思う。
2024/10/02(水) 22:00:14.12ID:YWEZQEUD
副作用ってどうでもよくね
Haskellとかだとそもそも副作用ないし
421デフォルトの名無しさん
垢版 |
2024/10/02(水) 22:12:34.31ID:OPLMo7z3
現実のプログラムだと式を評価する途中で発生する副作用というのは普通だけれど、
これを表示的意味論、操作的意味論で数学の世界に写そうと思うと途端に難しくなる。
数学で式の途中に文字列をディスプレイに映し出す、みたいな概念はないから。

それを整理して副作用と呼んでも差し支えない概念を提唱してHaskellに実装しているんだよ。
実際、IOモナドの圏論的定式みるとこれが副作用?という表式してる。
全部後回しにしてフラッシュするというアイディアみたい。副作用をプログラムの最終局面で
実行しているから、式の評価途中の参照透明性も壊さない。なるほど、って感じ。
2024/10/02(水) 22:20:07.75ID:sFAdPyYV
ID:OPLMo7z3 = ID:AFS53MaU 本人か同レベル

複おじってレベル
レスを投稿する

5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況