我是一个好的C/C++程序员.我发现Haskell非常有趣.但在我看来,虽然编写干净的Haskell代码相对容易,因为它模仿数学(我很熟悉)很好,但在Haskell中运行快速编写干净代码非常困难.
快速版本的Haskell快速版本非常长而且可怕,与天真但短暂(两行),干净和直观的实现没有相似之处.Haskell的长而可怕的版本实际上仍然比更短更简单的C计数器部分慢得多.
是因为当前的Haskell编译器太笨了还是凡人(当然不是SJP)编写快速的Haskell代码是不可能的?
部分模板专业化是C++中通用编程最重要的概念之一.例如:实现通用交换功能:
template <typename T>
void swap(T &x, T &y) {
const T tmp = x;
y = x;
x = tmp;
}
Run Code Online (Sandbox Code Playgroud)
专门用于支持O(1)交换的向量:
template <typename T, class Alloc>
void swap(vector<T, Alloc> &x, vector<T, Alloc> &y) { x.swap(y); }
Run Code Online (Sandbox Code Playgroud)
因此,当您在泛型函数中调用swap(x,y)时,总能获得最佳性能;
非常感谢,如果您可以在替代语言中发布等效语言(或语言的部分专业化的规范示例,如果语言不支持交换概念).
编辑:所以看起来许多回答/评论的人真的不知道什么是部分专业化,而且通用交换示例似乎妨碍了某些人的理解.一个更一般的例子是:
template <typename T>
void foo(T x) { generic_foo(x); }
Run Code Online (Sandbox Code Playgroud)
部分专业化将是:
template <typename T>
void foo(vector<T> x) { partially_specialized_algo_for_vector(x); }
Run Code Online (Sandbox Code Playgroud)
完整的专业化将是:
void foo(vector<bool> bitmap) { special_algo_for_bitmap(bitmap); }
Run Code Online (Sandbox Code Playgroud)
为什么这很重要?因为你可以在泛型函数中调用foo(任何东西):
template <typename T>
void bar(T x) {
// stuff...
foo(x);
// …Run Code Online (Sandbox Code Playgroud) language-agnostic generics programming-languages partial-specialization
来自C++,我发现通用编程是不可或缺的.我想知道人们如何在Haskell中接近它?
说如何在Haskell中编写通用交换函数?
在Haskell中是否存在部分特化的等价概念?
在C++中,我可以部分地使用特殊的泛型交换函数来处理泛型map/hash_map容器,该容器具有O(1)容器交换的特殊交换方法.你如何在Haskell中做到这一点,或者Haskell中泛型编程的典型例子是什么?