нулевое ключевое слово ocaml: один раз, но не больше? - PullRequest
7 голосов
/ 08 октября 2011

На верхнем уровне ocaml (версия 3.11.2) это простое выражение выдает мне ошибку:

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

Я только начал изучать ocaml из oreilly book , в котором, как представляется, часто используется ноль в качестве ключевого слова - например, вверху страницы 32:

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

Мне стыдно задавать такой явно гугл-вопрос здесь. Но после долгих поисков я подошел с пустыми руками. Таким образом, я так же открыт для предложений запросов Google, как и для простых ответов. (неудачные попытки Google: [ocaml "Ошибка: несвязанное значение null"] [ocaml null ключевое слово] [ocaml changelog null] [ocaml change null]).

Вопрос: было ли когда-то null ключевое слово ocaml, но не больше? Или я неправильно установил ocaml или что-то написал?

Конечно, я могу заменить каждое вхождение «null» на «[]» в коде, но я удивлен, что дословная копия кода из книги выдает мне ошибку так рано. Эта книга полна других ошибок? Я полагаю, что это было написано с ocaml 2.04; это слишком старый? Я выбрал его, потому что мне понравилось TOC и бесплатная доступность онлайн. Помимо этой нулевой ошибки (которую я все еще более виноват в себе, чем в авторах), объяснения хороши, и я с нетерпением жду обсуждения вопроса о смешении функционального и императивного стиля (расширение ума для меня, как для кого-то другого). знакомы только с c / c ++).

Ответы [ 2 ]

11 голосов
/ 08 октября 2011

ноль определено в книге на стр. 31. Это обычная функция, которую вы можете определить самостоятельно:

let null l = (l = [])

Эта номенклатура более или менее основана на Лиспе, где NIL - пустой список (такжезаписывается как ()), а NULL является предикатом (функцией, возвращающей true или false), точно так же, как null выше.

2 голосов
/ 15 октября 2011

OCaml обеспечивает мощное сопоставление с образцом , которое позволяет определить функцию более читабельно:

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 = (=) []
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...