関数型プログラミング言語Haskell Part34 (691レス)
関数型プログラミング言語Haskell Part34 http://mevius.5ch.net/test/read.cgi/tech/1639713446/
上
下
前次
1-
新
通常表示
512バイト分割
レス栞
抽出解除
レス栞
リロード規制
です。10分ほどで解除するので、
他のブラウザ
へ避難してください。
668: デフォルトの名無しさん [] 2025/10/08(水) 08:47:56.03 ID:66xUgFQM int* map(int (*f)(const int), const int* array, const int n){ int* p = malloc(sizeof(int) * n); for(int i = 0; i < n; i++) p[i] = f(array[i]); return p; } ふむ、メモリ管理が必要な言語が(見かけ上)副作用のない関数を作ろうとしたら配列を返す関数の時点で関数を使った後は必ずメモリの開放が必要になるのか。 開放が必要だから、参照を持つためにポインタへの保存が必須なので、関数の連続適用(関数合成)は絶望的。 これじゃ、GCやRustみたいな仕組みが必要になるわけだ。 http://mevius.5ch.net/test/read.cgi/tech/1639713446/668
670: デフォルトの名無しさん [sage] 2025/10/08(水) 13:07:06.38 ID:4LSFWHe4 >>668 30点の理解 http://mevius.5ch.net/test/read.cgi/tech/1639713446/670
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
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
メモ帳
(0/65535文字)
上
下
前次
1-
新
書
関
写
板
覧
索
設
栞
歴
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
AAサムネイル
Google検索
Wikipedia
ぬこの手
ぬこTOP
0.029s