c++ - 在 Haskell 中移动或复制(相对于 C++)

标签 c++ haskell

以这两个 C++ 函数和示例用法为例:

vector<int> makeVect() {
  vector<int> v = {1,2,3};
  return v;
}

//usage
auto v = makeVect(); //vector is moved

void addFour(vector<int> &v) {
  v.push(4);
}

//usage
addFour(v); //v is passed in as reference

两种情况下都不会发生复制。这真的很有效。

对应的Haskell函数和用法如下:

makeVect :: (Num a) => [a]
makeVect = [1,2,3]

--usage
--Q1: is [1,2,3] copied or moved to v?
let v = makeVect

addFour :: (Num a) => [a] -> [a]
addFour xs = xs ++ [4]

--usage
--Q2: is the parameter copied or moved into the function?
--Q3: on return, is the result copied or moved out of the function?
addFour v

问题Q1、Q2、Q3在代码中。 Haskell 会移动或复制东西吗?有没有办法控制它?在这些情况下,与 C++ 相比,Haskell 的效率如何?

最佳答案

在 Haskell 中,值是不可变的。从概念上讲,复制移动它们是没有意义的。全世界有多少个数字5?这是一个毫无意义的问题。 5 只是。每个人都可以自由使用它,它是相同的数字 5。[1,2,3] 也是如此。

如果我们查看由典型编译器生成的代码,当然会有一些复制操作在进行,但这些操作大多是指向不可变内存区域的指针。

关于c++ - 在 Haskell 中移动或复制(相对于 C++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20857165/

相关文章:

c++ - 如何设置/选择应该包含什么版本的boost?

haskell - 如何比较haskell中的自定义数据类型

haskell - 当 MVar 被垃圾回收时终止线程

c++ - 我的返回类型是否需要定义?

c++ - C++中使用Catch测试框架编译错误 "error: expected ' ;' at end of declaration list"

c++ - 是否可以在全局函数中访问类成员?

algorithm - 如何在 Haskell 中编写 N 元树遍历函数

python - 使用 cmake 构建 Windows DLL 的简单示例

haskell - 定义一个根据参数是 Integral 还是 Fractional 而表现不同的函数

haskell - 不变仿函数的例子?