刚接触 OCaml 和函数式编程时,如果只是想试一下 let 怎么绑定变量、match ... with 怎么做模式匹配,或者临时跑一段 List.filter 代码,还要专门去装一套 OCaml 工具链、配编辑器,难免有些折腾。
这时候,咱们绿叶网的 OCaml 在线编译器就派上用场了。打开网页直接敲代码,点击运行就能看结果。它非常适合新手边学边试,也很适合平时快速验证一小段独立的逻辑。
页面上方就是咱们的 OCaml 在线编译器。基本流程很简单:写代码、运行、看结果,然后根据输出继续修改。
Ctrl + Enter 快捷键。咱们直接跑一段代码感受一下:这个例子用列表存了 5 个成绩,通过 List.filter 筛选出及格的人数,并用 match ... with 模式匹配给分数评级。这段代码很好地展示了 OCaml 常用的列表操作、匿名函数和模式匹配:
let scores = [88; 72; 95; 61; 90]
let grade score =
match score with
| s when s >= 90 -> "A"
| s when s >= 80 -> "B"
| s when s >= 60 -> "C"
| _ -> "D"
let () =
let passed = List.filter (fun score -> score >= 60) scores in
Printf.printf "及格人数:%d\n" (List.length passed);
List.iter
(fun score -> Printf.printf "%d 分 -> %s\n" score (grade score))
scores运行结果如下。
及格人数:5
88 分 -> B
72 分 -> C
95 分 -> A
61 分 -> C
90 分 -> A像上面这种几十行的小代码,用在线编译器来跑再合适不过了。随写随测,把更多的时间留给写代码本身,而不是跟开发环境较劲。
OCaml 在线编译器主打一个 “随写随测,即刻反馈”。函数式编程里的很多概念,光看字面意思容易让人挠头,但只要自己敲几行代码跑一下,往往就秒懂了。
它的主要适用于以下场景:

在线编译器最适合单文件、小代码块的随手练。但如果是包含多个模块、需要引入一堆第三方库、或者需要构建配置的 “真枪实弹” 项目,咱们还是老老实实搭建本地的开发环境吧。
简单来说,OCaml 是一门 “主修函数式编程,辅修面向对象和命令式编程” 的通用型语言。小伙伴们可不要被 “函数式” 这 3 个字吓到,它其实是允许我们根据实际问题,灵活选择最舒服的写法。

OCamal 有 2 个非常讨喜的特点:
虽然 OCaml 的普及度不像 Python、JavaScript 那么满大街都是,但在一些 “硬核” 圈子里,它有着很强的不可替代性:

总而言之,如果你需要处理复杂的逻辑结构,或者对代码的健壮性有较高要求,OCaml 会是一把非常顺手的尖刀。至于常规的全新商业项目是否要用它,就得综合团队的技术背景、招人成本以及生态圈来理性评估了。
这是很多新手觉得 OCaml 最 “神奇” 的地方。它明明是静态类型语言,但我们很少需要像写 Java 或 C# 那样把类型标得清清楚楚。因为它的编译器非常聪明,会顺藤摸瓜帮你自动推断类型。
let count = 3
let price = 19.9
let () =
let total = float_of_int count *. price in
Printf.printf "总价:%.1f\n" total比如在这段代码里,count 会被自动推断为整数(int),price 会被推断为浮点数(float)。OCaml 的浮点数乘法有专属的符号 *.,编译器一看这个符号,就知道它两边必须是浮点数。
所以,类型推断不是 “没有类型”,而是编译器默默替我们算好了。新手阶段小伙伴们不用急着到处手工补类型,先学着看懂编译器给出的类型提示,反而更有帮助。
不完全是。在 OCaml 里,let 更准确的意思是 “给一个值贴个名字标签”(绑定)。一旦贴上,这个标签默认就是不可变的。你不能像在其他语言里那样,直接把同一个变量的值改成别的。
let count = 3
let count = count + 1
let () =
Printf.printf "count = %d\n" count看到上面的代码,别误会,第二个 let count 并不是在修改第一个 count。它其实是创建了一个全新的同名绑定,并把旧的给遮蔽(Shadowing)掉了。看起来名字没变,但背后其实已经是另外一个东西了。
当然,OCaml 也能写可变的数组或引用,但它鼓励你优先使用这种 “不可变” 的方式。把 “默认不可变” 和 “遮蔽” 区分开,你就不会被函数式编程绕晕了。
不一定。很多初学的小伙伴看教程时,发现交互式示例后面都有 ;;,就以为每行 OCaml 代码都得加上这两个分号。
其实,;; 主要是给 UTop 这种交互式环境(REPL)用的,它的意思是告诉系统:“我这一段输入完了,你可以开始执行了。”
在普通的 .ml 源码文件里,编译器会按程序的结构自己往下读,一般是不需要写的,像下面这样清清爽爽就可以:
let square x = x * x
let () =
Printf.printf "%d\n" (square 6)所以,看到示例里的 ;; 时,先分清它是在交互环境里,还是在源文件里。把这两个场景分开,就不会机械地在源码的每一行后面都敲两个分号了。
代码写得多了以后,鼠标点来点去多少有点慢。OCaml 在线编译器支持下面这些常用快捷键,小伙伴们先把几个高频的记住就够用了。
Ctrl + Enter:运行代码。Ctrl + Z:撤销、Ctrl + Y:重做。Ctrl + C:复制、Ctrl + V:粘贴。Ctrl + A:全选。Ctrl + X:剪切。Ctrl + /:注释或取消注释。Ctrl + Home:跳转到首行的行首。Ctrl + End:跳转到末行的结尾。其中最值得记住的还是 Ctrl + Enter。刚改完一个 match 分支、let 绑定或者 List.filter() 条件,顺手运行一次,很快就能知道代码是否符合预期。