関数型プログラミングの純粋関数は、副作用のない関数です。これの意味の1つは、入力パラメーターの値を変更できないことです。これはメモリ使用率の不利と見なすことができますか?
たとえば、リストを取得して別の要素を追加するだけの関数があるとします。C ++では、次のように単純にすることができます。
void addElem(std::vector& vec, int a)
{
vec.insert(a);
}
この関数は明らかに、渡されたオブジェクトによってすでに使用されているよりも多くのメモリを使用しません。
しかし、Haskellでも同じことがこのようなものになるでしょう。
addElem :: [Int]-> Int-> [Int] addElem xs a = xs ++ [a]
xsは値を変更していないため、この計算では。したがって、関数がxsの2倍のサイズのメモリを消費することになると言っているのは正しいですか。1つはxs用で、もう1つは戻り値用です。または、どういうわけか怠惰な呼び出しは、最後に1つの要素のみを追加することによって、実際にxsが返されることを確認しますか?
私はモナドが副作用をもたらす可能性のある何かを持つ方法であることを知っています。しかし、Monadを使用して、入力を変更し、その値を返すことはできますか?
また、xs ++ [a]をa:xsに変更すると、消費するメモリが少なくなりますか?