СодержаниеНулевые значенияПредположим, что на своём сайте вы решили провести исследование, дабы узнать у читателей их возраст и имена. Существует только проблема в том, что по некоторым причинам, некоторые из ваших читатели не хотят указывать свой возраст, упрямо отказываясь заполнять соответствующую область. Что, в данном случае, должен делать бедный администратор базы данных? Предположим, что возраст представлен как Другой, более корректный способ, состоит в том, чтобы хранить возраст в области которая имеет тип "int или null". Вот SQL таблица для хранения возрастов: create table users ( userid serial, name text not null, age int -- may be null ); Если данные о возрасте не получены тогда в базу отправляется специальное SQL значение В языках программирования тоже реализована поддержка нулевых значений, причём в одних эти значения легче использовать, чем в других. Например в Perl любой scalar (то есть число или строка) может быть обозначен как OCaml предлагает элегантное решение этой проблемы, используя простой вариант определения полиморфного типа: type 'a option = None | Some of 'a В данном случае нулевое значение обозначено как # Some 3;;
- : int option = Some 3
А, что на счёт списка дополнительных целых чисел? # [ None; Some 3; Some 6; None ];;
- : int option list = [None; Some 3; Some 6; None]
А, как на счёт дополнительного списка целых чисел? # Some [1; 2; 3];;
- : int list option = Some [1; 2; 3]
Утверждения, предупреждения, фатальные ошибки и вывод на stderrОдна замечательная особенность Perl'a — богатый набор команд для отладки программ и обработки неожиданных ошибок, включая способность печатать стек трассировки, отсылать и ловить исключения (более подробно об исключениях мы поговорим позже), ну и так далее. OCaml имеет не на столько богатый набор отладочных команд то, что есть просто лучше чем Java, схоже с C и не столь хорошо как в Perl. Прежде всего следует рассказать об # assert (Sys.os_type = "Win32");;
Exception: Assert_failure ("", 0, 30).
Разумеется запуск этого кода на Win32 не вызовет ошибку. Если в вашей программе, что-то пошло не так, вы можете использовать
match Sys.os_type with
"Unix" | "Cygwin" -> (* code omitted *)
| "Win32" -> (* code omitted *)
| "MacOS" -> (* code omitted *)
| _ -> failwith "this system is not supported"
Обратите внимание на две особенности сравнения с образцом, в этом примре. Так называемый "range pattern" используется для проверки соответствия Если вы, как и я, хотите провести отладку своей программы, но испытываете жуткую неприязнь к отладчикам, окромя gdb, в таком случае вы возможно пожелаете вывести ошибку через свою собственную функцию. Например (обратите внимание на код помеченый красным): open Graphics;;
open_graph " 640x480";;
for i = 12 downto 1 do
let radius = i * 20 in
prerr_endline ("radius is " ^ (string_of_int radius));
set_color (if (i mod 2) = 0 then red else yellow);
fill_circle 320 240 radius
done;;
read_line ();;
Если вы предпочитаете open Graphics;;
open Printf;;
open_graph " 640x480";;
for i = 12 downto 1 do
let radius = i * 20 in
printf "radius is %d\n" radius;x
set_color (if (i mod 2) = 0 then red else yellow);
fill_circle 320 240 radius
done;;
read_line ();;
|