関数型プログラミング言語Haskell Part34at TECH
関数型プログラミング言語Haskell Part34 - 暇つぶし2ch739:デフォルトの名無しさん
26/03/02 17:24:58.03 zdTnYiWN.net
int f(int n){ puts("hello");
return n +2; }
という関数があるとき
3
というデータと
f(1)
という関数適用の結果は同じ3を与える。
だけれどもf(1)は計算結果として3を与えるだけで、3というデータというわけではない。出自が違うしhelloと出力する分差がある。
なので3と同一視してしまうのはマズイ。
3:int
f(1):計算 int
と区別する。名称としても3の方は値(value)
f(1)の方は計算(computation)と呼ぶことにする。

モナドはこういう区別をとりあえず認められるかどうか。計算結果としてのデータと単なるデータを区別すると言うことが重要なんだがOK?これが認められればすぐ分かる

740:デフォルトの名無しさん
26/03/02 18:36:01.12 nktAT8k9.net
わかってなさそう

741:デフォルトの名無しさん
26/03/02 18:59:57.06 tWwuztZJ.net
モナーなんてZ世代は知らない

742:デフォルトの名無しさん
26/03/02 19:20:21.63 zdTnYiWN.net
具体的にはどこが?計算とかいう概念持ち出すところ?
それだともう根本的だよね

743:デフォルトの名無しさん
26/03/02 19:41:30.44 nktAT8k9.net
チャーチロッサーの話ならモナド持ち必要がない

744:デフォルトの名無しさん
26/03/02 19:59:33.68 zdTnYiWN.net
チャーチロッサーの定理の話なんてしてないが

745:デフォルトの名無しさん
26/03/03 20:09:29.90 AsM/jRKA.net
プログラミングのモナドにおいて、値(value)と計算(computation)はどのように区別されますか。
=================
Eugenio Moggiの理論における「値(Value)」と「計算(Computation)」の区別は、**「型(Type)」というレンズを通して明確に線引き**されています。
一言で言えば、**「それ自体が何であるか(静的)」**と**「それが何を引き起こすか(動的)」**の違いです。
### 1. 値(Value):
値とは、プログラムの中で「純粋なデータ」として扱われるものです。
* **性質:** それ自体に副作用はなく、評価した瞬間にその中身が確定しています。
* **型としての表現:** 単なる型 で表されます(例:`Int`, `String`, `Bool`)。
* **例:** 数値の `10` や、文字列の `"Hello"`。これらはどこで使われても、それ自体がプログラムの状態を変えたり、エラーを投げたりすることはありません。
### 2. 計算(Computation):
計算とは、「最終的に型 の値を返すが、その過程で**何らかの付随的な効果(Effect)**を伴うプロセス」を指します。
* **性質:** 実行されるまで結果がわからなかったり、実行中にログを出力したり、失敗したりする「振る舞い」を含んでいます。
* **型としての表現:** モナド を被せた型 で表されます。
* **例:** * `Maybe Int`: 「`Int` を返すが、失敗するかもしれない」という計算。
* `IO String`: 「`String` を返すが、外部世界との入出力を伴う」という計算。
### 3. 両者の境界線:Monadの役割
Moggiはこの「値」と「計算」をバラバラにするのではなく、モナドの2つの基本操作によってこれらを厳密に、かつ安全に繋ぎ合わせました。
#### ① 値を計算に昇格させる (`unit` / `return`)
純粋な値を、「何の効果も伴わない、ただ値を返すだけの計算」の中に閉じ込めます。
> 例:`10` という値を、`Just 10`(Maybeモナドにおける計算)にする。
#### ② 計算と計算を繋ぐ (`bind` / `>>=`)
「ある計算の結果(値)」を「次の計算」へと引き渡します。このとき、計算のプロセス(副作用)が連鎖していきます
ここが肝心なのですが、`bind` は **「計算 の中から値 を取り出して、次の計算を生成する関数 に渡す」** という役割を担っています。

746:デフォルトの名無しさん
26/03/04 01:58:00.48 XOqqy6En.net
wikipediaにもT Aは計算した値って書いてあるじゃん
>>739 が言ってる通りだよ

プログラム(program)の数学的モデルを見つけ出す過程において、Moggi は圏論と表示的意味論の観点からプログラムは圏の射、型は圏の対象とみなすことができ[5]、さらに直感的解釈として、関数が値を取り値を返すものであるのに対しプログラムが値を取り計算した 値を返す[6]、すなわち引数の型と返り値の型の間にはなにか違いがあり単純な射の合成ができない、と考えた。

集合写像(関数):値 →       値
プログラム   :値 → "計算した" 値

747:デフォルトの名無しさん
26/03/04 05:27:21.48 7OJSzV14.net
計算について書いてないやん。"計算した"ってなんやねん

748:デフォルトの名無しさん
26/03/04 05:45:10.64 SVNV5ClQ.net
(1) 計算Pを行った結果値vを得た。
(2) 値v。

この二つは全然ちがう。
なんかゴニョゴニョやってvが出たと、単なる値vでは情報量が違う。
両者は区別されて当然。この違いを定義する形式的枠組と考えれば良い。

749:デフォルトの名無しさん
26/03/04 05:58:42.41 7OJSzV14.net
haskellでは、値に純粋関数適用するというゴニャゴニャしたことしても値のままだがな。
fが純粋関数だったら
f 5
も値にしてる。

750:デフォルトの名無しさん
26/03/04 06:03:40.92 7OJSzV14.net
そういう微妙に説明しきれないところがあったので、Haskellerには全く受け入れられなかった。
でもそういう区別があると認めればモナドはすぐ出る。
なんか説明できんかなと、圏論の基礎をパラパラめくって形だけ見ただけでも出てくるかもしれない
圏論が必要っていうのもこういうレベル

751:デフォルトの名無しさん
26/03/04 06:35:37.11 GN6HcWHi.net
アセンブリで考えた方が楽だったりしないか。CPU決めないといけないけど

752:デフォルトの名無しさん
26/03/04 09:18:26.50 jKWw5dKe.net
区別するより
値vで同一視するのが好きな人が多いからw

753:デフォルトの名無しさん
26/03/04 11:14:51.99 7OJSzV14.net
同一視も何も、誰も区別してなかったんだからそんな認識ないと思うよ

754:デフォルトの名無しさん
26/03/04 22:21:48.44 Ksw16q/0.net
-- I v = (v)

return v = I v
(>>=) (I x) f = f x

みたいに何の意味もないIも定義上はモナドにならんの?
モナド則は満たしてそうだけど

755:デフォルトの名無しさん
26/03/05 04:36:01.77 zXMZ2FD1.net
恒等モナドか。論文にはなんも書いてなかったと思う。
クライスリ射 a -> I b をどう解釈するかになるんじゃね。知らんけど。
計算効果が何もない純粋関数と同じと解釈すれば、なにも計算効果がないモナドと解釈はできる。
「恒等」モナドだから、他モナドと組み合わせるとき、つまりモナド変換子とかを導入するときぐらいしか意味なさそうだけど。

756:デフォルトの名無しさん
26/03/08 22:34:48.83 Mtbhf7w9.net
モジュール性のためにモナドを導入したんじゃないの?

757:デフォルトの名無しさん
26/03/08 22:36:23.08 Mtbhf7w9.net
副作用のある計算を合成するためにモナドを導入したんじゃないの?

758:デフォルトの名無しさん
26/03/08 22:52:32.88 d+H6OQjC.net
純粋関数と必要なIOなんかの副作用を両立させるためでしょ?

759:デフォルトの名無しさん
26/03/08 23:06:18.80 ZuaiB7hd.net
臭い物に蓋をするためです


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch