我只是在学习Haskell,很抱歉,如果我的问题很愚蠢.我正在阅读learnyouahaskell.com,现在我正在第5章"递归".有一个实现标准"反向"功能的例子:
reverse' :: [a] -> [a]
reverse' [] = []
reverse' (x:xs) = reverse' xs ++ [x]
Run Code Online (Sandbox Code Playgroud)
但似乎它在O(N ^ 2)时间运行,而标准反向运行在O(N)(我希望如此).以下代码说明了这一点:
sum (reverse [1,2..1000000]) -- runs pretty fast
sum (reverse' [1,2..1000000]) -- never finishes
Run Code Online (Sandbox Code Playgroud)
所以,我开始考虑如何更快地实现自己的反向.在命令式语言中很容易做到.也许我需要后续章节中的一些更高级的材料才能做到这一点?任何提示都受到欢迎.
假设我正在编写一个具有类型参数T的模板函数foo.它得到一个类型为T的对象,它必须有方法bar().在foo里面我想创建一个由bar返回的对象类型的向量.
在GNU C++中,我可以编写类似的东西:
template<typename T>
void foo(T x) {
std::vector<__typeof(x.bar())> v;
v.push_back(x.bar());
v.push_back(x.bar());
v.push_back(x.bar());
std::cout << v.size() << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
如何在Microsoft Visual C++中做同样的事情?有没有办法编写适用于GNU C++和Visual C++的代码?