ocaml null关键字:曾经但没有更多?

时间:2011-10-08 03:52:39

标签: null ocaml

在ocaml toplevel(版本3.11.2)中,这个简单的表达式给了我一个错误:

# let a = [] in if null a then 0 else 1;;
Error: Unbound value null

我刚开始从oreilly book学习ocaml,它似乎经常使用null作为关键字 - 例如,在页面32的顶部:

# let rec size a_list =
    if null a_list then 0
    else 1 + (size (List.tl a_list));;

我很尴尬地在这里问一个明显的可谷歌问题。但经过大量的谷歌搜索,我空手而归。所以我对谷歌查询建议持开放态度,因为我是直截了当的答案。 (谷歌尝试失败:[ocaml“错误:未绑定值null”] [ocaml null关键字] [ocaml changelog null] [ocaml change null])。

问题:一旦ocaml关键字为null,但不再是?或者我安装了ocaml错误或拼错了什么?

我当然可以在代码中用“[]”替换每次出现的“null”,但是我很惊讶一本书中的代码的逐字副本给我这么早的错误。这本书是否充满了其他的陷阱?我相信它是用ocaml 2.04编写的;那太旧了?我选择它是因为我喜欢TOC和在线免费提供。除了这个零错误(我仍然更愿意责怪自己而不是作者),解释很好,我期待着混合功能和放大器的讨论。命令式的风格(对我而言,只是熟悉c / c ++的人)。

2 个答案:

答案 0 :(得分:11)

null在第31页的书中定义。这是一个你可以自己定义的正常函数:

let null l = (l = [])

这个命名法或多或少基于Lisp,其中NIL是一个空列表(也写成()),NULL是一个谓词(一个返回true或false的函数),就像上面的null一样。

答案 1 :(得分:2)

OCaml提供强大的Pattern Matching,允许您更可读地定义函数:

let rec size a_list = match a_list with
 | [] -> 0
 | _ :: tl -> 1 + (size tl)

由于模式匹配通常在最后一个参数上执行,因此可以使用特殊符号:

let rec size = function
 | [] -> 0
 | _ :: tl -> 1 + (size tl)

使用null(即,将相等性测试作为普通/前缀函数)可以更短地定义

(=)

let null = (=) []