小编rem*_*rem的帖子

在线性时间内运行的Haskell中实现反向

我只是在学习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)

所以,我开始考虑如何更快地实现自己的反向.在命令式语言中很容易做到.也许我需要后续章节中的一些更高级的材料才能做到这一点?任何提示都受到欢迎.

performance complexity-theory haskell

18
推荐指数
3
解决办法
8223
查看次数

声明依赖于模板函数中未知类型的变量

假设我正在编写一个具有类型参数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++的代码?

c++ templates typeof visual-c++

4
推荐指数
2
解决办法
6463
查看次数