我今天正在阅读Jason Hickey的在线书籍"Objective of Caml",在Functors(第140页)一章中,我在Set functor的定义中遇到了以下几行:
let add = (::)
Run Code Online (Sandbox Code Playgroud)
运行代码导致一个不太明显的"语法错误"错误消息.在插入ocaml toplevel的行后,我发现::实际上它不是一个运算符,而是一个类型构造函数.
但是,从我对Haskell的了解很少,等效:构造函数也可以被视为运算符(函数).
Prelude> :t (:)
(:) :: a -> [a] -> [a]
Run Code Online (Sandbox Code Playgroud)
我的问题是:OCaml构造函数从来都不是第一类值(意味着本书中的代码从一开始就是错误的),为什么会出现这种情况?
我还处于学习OCaml的早期阶段,并且很想知道在OCaml中从通用代码中提取最大性能的最佳方法是什么.
作为一个小实验,我编写了两个多态函数:一个在C++中,另一个在OCaml中,找到给定数组中的最大元素.
我观察到的是,在C++中,你不会为这种抽象付出代价,OCaml中的惩罚是性能下降了一个数量级.另外,我快速炮制的C++解决方案比OCaml更通用,但我主要是因为我对语言缺乏经验.
我的问题如下:如何编写和使用OCaml中的多态函数而不支付我刚刚观察到的巨大性能损失?
我在这个特定问题上观察到的另一件事是我在OCaml中的功能解决方案比命令式解决方案慢,而C++中的"功能"解决方案与模拟命令方法相比没有受到任何惩罚.
g++ -std="c++0x" -O3 -o max_cpp max.cpp使用gcc-4.6.3和OCaml代码编译C++代码:ocamlopt -o max_ml max.mlusing ocamlopt version 3.12.1.两个生成的可执行文件都是32位,并在Ubuntu x64 11.04上运行
我提交了两个程序的代码.
C++代码(当然不完全安全;))
#include <iostream>
#include <vector>
#include <numeric>
template <typename T> T max (T a, T b) {
return (a>b)? a : b;
}
template <typename I> typename I::value_type find_max (I begin, I end) {
auto max = *begin;
for (begin++;begin!=end;begin++)
if (*begin > max) max = *begin;
return max;
}
template <typename I> typename I::value_type find_max1(I begin, …Run Code Online (Sandbox Code Playgroud)