関数型プログラミング言語Haskell Part34 (677レス)
上下前次1-新
抽出解除 レス栞
リロード規制です。10分ほどで解除するので、他のブラウザへ避難してください。
668(2): 10/08(水)08:47 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みたいな仕組みが必要になるわけだ。
670(1): 10/08(水)13:07 ID:4LSFWHe4(1) AAS
>>668
30点の理解
676(1): 10/08(水)23:41 ID:jkiZK6Mq(1) AAS
>>673
ゴールがわからないので100点のご高説は無理だが30点の理由は説明しといてあげる
C言語という特定の言語実装における制約がメモリ管理が必要な言語全般に対しても当てはまると考えてるのが根本的な間違い
>配列を返す関数の時点で関数を使った後は必ずメモリの開放が必要になるのか。
>>668のコードで(明示的な)メモリ解放が必要になるのはヒープに動的にメモリをアロケートしたからであって配列を返すからではない
C言語では配列がfirst classではないので配列をそのまま返すことは不可能
C言語でも構造体ならfirst classなので配列という概念を表現した構造体を作って静的配列を返すようにすれば(明示的な)メモリ開放は不要
C言語にはないがジェネリック等の抽象化機構を備えた言語であれば静的配列を使って任意長の配列に対するmap関数も書ける
>開放が必要だから、参照を持つためにポインタへの保存が必須
動的にアロケートするものは実行時になるまで必要なメモリサイズがわからないから言語に関係なくポインタ的なものでしか表現しようがない
動的にアロケートしたものだからポインタが必須、ヒープに動的にアロケートしたものだから後で(明示的な)開放が必要なのであって、開放が必要だからポインタへの保存が必須という因果関係ではない
上下前次1-新書関写板覧索設栞歴
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ
ぬこの手 ぬこTOP 0.020s