関数型プログラミング言語Haskell Part34 (686レス)
関数型プログラミング言語Haskell Part34 http://mevius.5ch.net/test/read.cgi/tech/1639713446/
上
下
前
次
1-
新
通常表示
512バイト分割
レス栞
675: デフォルトの名無しさん [sage] 2025/10/08(水) 18:45:31.77 ID:HFQA1hQ+ なるほどモナドと書き込めばこのスレで副作用の話もできるのですね http://mevius.5ch.net/test/read.cgi/tech/1639713446/675
676: デフォルトの名無しさん [sage] 2025/10/08(水) 23:41:30.24 ID:jkiZK6Mq >>673 ゴールがわからないので100点のご高説は無理だが30点の理由は説明しといてあげる C言語という特定の言語実装における制約がメモリ管理が必要な言語全般に対しても当てはまると考えてるのが根本的な間違い >配列を返す関数の時点で関数を使った後は必ずメモリの開放が必要になるのか。 >>668のコードで(明示的な)メモリ解放が必要になるのはヒープに動的にメモリをアロケートしたからであって配列を返すからではない C言語では配列がfirst class
ではないので配列をそのまま返すことは不可能 C言語でも構造体ならfirst classなので配列という概念を表現した構造体を作って静的配列を返すようにすれば(明示的な)メモリ開放は不要 C言語にはないがジェネリック等の抽象化機構を備えた言語であれば静的配列を使って任意長の配列に対するmap関数も書ける >開放が必要だから、参照を持つためにポインタへの保存が必須 動的にアロケートするものは実行時になるまで必要なメモリサイズがわからないから言語に関係なくポインタ的なものでしか表現しようがない 動的にアロケートしたものだからポインタ
が必須、ヒープに動的にアロケートしたものだから後で(明示的な)開放が必要なのであって、開放が必要だからポインタへの保存が必須という因果関係ではない http://mevius.5ch.net/test/read.cgi/tech/1639713446/676
677: デフォルトの名無しさん [] 2025/10/09(木) 02:23:13.64 ID:j1OYGPg+ >>676 確かにメモリ管理が必要な手続き型言語全般というのは広げすぎたかもしれない。 静的な配列を関数内で作ってポインタを返す形で作ると関数を抜ける際に配列の寿命が尽きる。 (通常、それを避けるために結果を格納するためのポインタを引数で渡す) C言語で関数型言語のmap関数みたいな配列を返す関数が作れるか?と考えると動的に作って、使い終わったら解放する形になるのかなと。 ここへの書き込みが長すぎると怒られたので削除したが、構造体で包むという案
も考えた。 値渡しだからコピーコストがかさむ。 参照渡しだと生の配列と同じ寿命の問題に突き当たる。 http://mevius.5ch.net/test/read.cgi/tech/1639713446/677
678: デフォルトの名無しさん [sage] 2025/10/09(木) 10:26:59.37 ID:DbxsJTmB >>677 >値渡しだからコピーコストがかさむ。 コンパイラの最適化で不必要なコピーは消える C言語でもそういうことは当たり前にやってる http://mevius.5ch.net/test/read.cgi/tech/1639713446/678
679: デフォルトの名無しさん [sage] 2025/10/09(木) 11:59:08.62 ID:4MZdWW58 仕様化されてるっけ コンパイラの実装次第だと怪しい http://mevius.5ch.net/test/read.cgi/tech/1639713446/679
680: デフォルトの名無しさん [sage] 2025/10/09(木) 17:36:59.11 ID:jE8FE7Nk Cに何を求めてんだよw http://mevius.5ch.net/test/read.cgi/tech/1639713446/680
681: デフォルトの名無しさん [sage] 2025/10/09(木) 17:53:09.88 ID:N3YUsGEr OS開発ですね。メモリも割り込みも何でも見えてしまい、扱わないといけません http://mevius.5ch.net/test/read.cgi/tech/1639713446/681
682: デフォルトの名無しさん [] 2025/10/09(木) 18:19:20.69 ID:j1OYGPg+ >>678 にゃんと!? それを押してもいざ実装してみたら 構造体で配列を包む場合、あらかじめ配列の長さを決めないといけなかった。 struct { int array[1024]; int size; }typedef Array; この1024とかも余分な分は最適化で無くなるっていうなら10万位要素があっても大丈夫なように1GB位(見かけ上)確保したいが、そうでないなら大体の場合、無駄な領域を確保してることになる。 http://mevius.5ch.net/test/read.cgi/tech/1639713446/682
683: デフォルトの名無しさん [] 2025/10/09(木) 18:28:04.54 ID:j1OYGPg+ >>678 ん、まてよ? 最適化で不要なコピーは消えるって言っても、関数プログラミングのmap関数と同じ動きなら、参照元の値は変わったらダメなので参照渡しされたら困るんだが、どんな最適化でコピー(値渡し)で無く、かつ参照渡しでもない状態ってどんな状態? http://mevius.5ch.net/test/read.cgi/tech/1639713446/683
684: デフォルトの名無しさん [sage] 2025/10/09(木) 19:31:35.47 ID:XykzCJ/G Haskellは遅延評価だからmapが配列を返してると言えるかあやしい 一般的な関数型言語だと末尾再帰で不必要になる値を再利用(上書き)する あと値が変更されない(immutable)なら参照渡しで共有しても問題ないし 共有するためにimmutableにすると言っても過言ではない http://mevius.5ch.net/test/read.cgi/tech/1639713446/684
685: デフォルトの名無しさん [] 2025/10/09(木) 19:50:16.02 ID:j1OYGPg+ >>684 うん、遅延評価だから基本参照を返してるはず。バード本参照 (なので>>668を書いてみたわけで) immutableなら a = [1..4] b = map (+1) [1..4] print a print b とうコードで output: [0,1,2,3,4] [1,2,3,4,5] になるはず。 Cで参照を共有すると [1,2,3,4,5] [1,2,3,4,5] という困った表示になってしまう。 というかHaskellでも生のリスト[0..4]とmap (+1) [0..4]は参照を共有してない。 共有してるのは[0..4]だけ。 (むしろ共有してないからこ
そ「富豪プログラミング」とか言われる) http://mevius.5ch.net/test/read.cgi/tech/1639713446/685
686: デフォルトの名無しさん [] 2025/10/09(木) 20:01:16.79 ID:j1OYGPg+ 言ってみればHaskellは新しい参照をどんどん生み出して、不要になった参照はガンガンGCする。 Cはそういうプログラミングには(当たり前だが)向かないし、当たり前にCの方が効率は良い。 人間が書くコードはHaskellみたく数学に近いほど短くなる。 どっちが良いとかじゃなく、何を優先するかという話。 (なのだなぁと、Cでmap関数もどきを書いて再確認した) http://mevius.5ch.net/test/read.cgi/tech/1639713446/686
メモ帳
(0/65535文字)
上
下
前
次
1-
新
書
関
写
板
覧
索
設
栞
歴
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.695s*