V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
wocanmei
V2EX  ›  分享创造

分享在 Windows 下使用 OCaml 的经验

  •  
  •   wocanmei ·
    naosense · 2019-11-03 09:12:58 +08:00 · 3306 次点击
    这是一个创建于 1849 天前的主题,其中的信息可能已经有所发展或是发生改变。

    第一次听说 Ocaml 是看到 Ocaml 写的 quicksort 算法:

    let rec quicksort = function
      | [] -> []
      | x::xs ->
        let smaller, larger = List.partition (fun y -> y < x) xs
        in quicksort smaller @ (x::quicksort larger);;
    
    List.iter (fun x -> Printf.printf "%d " x) (quicksort [2; 3; 1; 1; 7; 10])
    

    Java 语言的实现相信大家都看过,这里我把Algorithms 4th中的源码贴一下:

    public class Quick {
    
        public static void sort(Comparable[] a) {
            StdRandom.shuffle(a);
            sort(a, 0, a.length - 1);
        }
    
        private static void sort(Comparable[] a, int lo, int hi) {
            if (hi <= lo) return;
            int j = partition(a, lo, hi);
            sort(a, lo, j-1);
            sort(a, j+1, hi);
        }
    
        private static int partition(Comparable[] a, int lo, int hi) {
            int i = lo;
            int j = hi + 1;
            Comparable v = a[lo];
            while (true) {
                while (less(a[++i], v)) {
                    if (i == hi) break;
                }
                while (less(v, a[--j])) {
                    if (j == lo) break;
                }
                if (i >= j) break;
                exch(a, i, j);
            }
            exch(a, lo, j);
            return j;
        }
    
        private static boolean less(Comparable v, Comparable w) {
            if (v == w) return false;
            return v.compareTo(w) < 0;
        }
    
        private static void exch(Object[] a, int i, int j) {
            Object swap = a[i];
            a[i] = a[j];
            a[j] = swap;
        }
    }
    

    两下一对比,被震撼到了。这么说吧,看 Ocaml 写的快排算法很容易看到算法的本质,而 Java 的实现则是“一团糟”,算法的本质隐藏到琐碎的细节中了,通篇都是if分支和数组索引。Ocaml 强大的模式匹配和 immunable 数据结构可以让你写出清晰简洁的代码。难能可贵的是,和曲高和寡的 Lisp 不同,Ocaml 虽然崇尚函数式编程,但并不排斥命令式编程。另外,Ocaml 是一门非常实用的语言,尤其适合编译方面的工作,所以如果你对 DSL 感兴趣,相信 Ocaml 会是你的菜,要知道大名鼎鼎的 Rust 语言在自举前编译器就是用 Ocaml 写的。

    怀着激动的心情一通谷歌,发现只支持 Linux 和 OSX,这就蛋疼了。尝试了官网安装说明中几种 Windows 安装方式,效果都不理想,顶多就一个黑框框,毕竟自己不是大神,还是需要代码提示和代码格式化这样的功能的,所以尝试了几次,只好忍痛割爱。一个偶然的机会,接触了 Windows 上的 Wsl 系统,感觉不错,又想起心心念念的 Ocaml 了,自然就想到了结合 Wsl 是否可以搭建一个理想的 Ocaml 环境?摸索了一段时间,终于找到一种比较理想的方法。

    全文请移步这里,最后配置好的环境如下,

    5 条回复    2019-11-19 15:56:04 +08:00
    siloong
        1
    siloong  
       2019-11-04 10:30:06 +08:00
    给楼主点个赞,另外 haskell 也不错,楼主可以试试
    wocanmei
        2
    wocanmei  
    OP
       2019-11-04 10:59:53 +08:00
    @siloong 嗯,看过一些,感觉还是喜欢 OCaml 的语法[捂脸]
    DavidGao
        3
    DavidGao  
       2019-11-13 16:10:54 +08:00
    点赞,我在 Windows 下果断切换 F#,OCaml 我只能在类 Unix 系统下用
    wocanmei
        4
    wocanmei  
    OP
       2019-11-14 16:49:40 +08:00
    @DavidGao 我有点受不了 F#的命名方式以及与 C#的绑定关系
    DavidGao
        5
    DavidGao  
       2019-11-19 15:56:04 +08:00
    @wocanmei 同感,但是 Windows 下 F#还是比 OCaml 适应度高一些。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1154 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 18:52 · PVG 02:52 · LAX 10:52 · JFK 13:52
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.