函数式编程中的纯函数是没有副作用的函数。其含义之一是它不能改变输入参数的值。这可以被视为内存利用率的劣势吗?
例如,假设我有一个函数,它只接受一个列表并在其中添加另一个元素。在 C++ 中,它可能很简单
void addElem(std::vector& vec, int a)
{
vec.insert(a);
}
这个函数显然不会使用比传递对象已经占用的更多内存。
但是在 Haskell 中也会出现这样的情况。
addElem :: [Int] -> Int -> [Int] addElem xs a = xs ++ [a]
现在在这个计算中,因为 xs 没有改变它的值。所以我是否正确地说,有时该函数将消耗 xs 的内存双倍大小,一个用于 xs,另一个用于返回值。或者以某种方式延迟调用确保实际上 xs 仅通过在最后添加一个元素来返回?
我知道 Monad 是一种可以产生副作用的方法。但是 Monad 可以用来简单地修改输入并返回它的值吗?
也可以将 xs ++ [a] 更改为 a:xs 消耗更少的内存吗?