在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 ++的人)。
答案 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 = (=) []