関数型プログラミング言語Haskell Part34 (694レス)
1-

694: デフォルトの名無しさん [] 2025/10/11(土) 22:43:04.64 ID:pZv0dAV3(2/2) AAS
C++で書いてみた。
今回は値渡しにしたけど、本当に最適化でコピーにならないようにできるのかな…。
そもそもどうやってそれを確認するんだろう?
本当なら参照渡しがほぼ要らなくなるけど。
そして、例によって参照渡しだと>>668
668(4): デフォルトの名無しさん [] 2025/10/08(水) 08:47:56.03 ID:66xUgFQM(1/2) AAS
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みたいな仕組みが必要になるわけだ。
やコードこそ書いてないがCで一般的な>>677
677(2): デフォルトの名無しさん [] 2025/10/09(木) 02:23:13.64 ID:j1OYGPg+(1/5) AAS
>>676
確かにメモリ管理が必要な手続き型言語全般というのは広げすぎたかもしれない。
静的な配列を関数内で作ってポインタを返す形で作ると関数を抜ける際に配列の寿命が尽きる。
(通常、それを避けるために結果を格納するためのポインタを引数で渡す)

C言語で関数型言語のmap関数みたいな配列を返す関数が作れるか?と考えると動的に作って、使い終わったら解放する形になるのかなと。
ここへの書き込みが長すぎると怒られたので削除したが、構造体で包むという案も考えた。
値渡しだからコピーコストがかさむ。
参照渡しだと生の配列と同じ寿命の問題に突き当たる。
のカッコ内に書いた(通常、それを避けるために結果を格納するためのポインタを引数で渡す)になる。

コードにするとこう。
(Haskellerなのでmapにしたけど、C++だとmapって連想配列なのね。失敗した…)

void map(vector<int>* input, vector<int>* output);

配列と比べて長さを引数に渡さないで良くなるのと、realocしなくても長さを変更できる点が進化しているが。
1-
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.015s