Предположим, у меня есть код:
let listB = [ 1; 2; 3 ]
Используя нотацию Lisp, как мне сопоставить car и cadr с этим списком? Знаю минусы - это ::.
Или в схеме first и rest?





List.head: возвращает первый элемент непустого списка (Глава списка).
List.tail: возвращает все элементы непустой список, кроме первого (Хвост или остальная часть списка).
Пример (с использованием F# Interactive Console):
> let sample = [1;2;3;4];;
val sample : int list
> List.head sample;;
val it : int = 1
> List.tail sample;;
val it : int list = [2; 3; 4]
List.hd и List.tl будут делать то, что вы хотите, но в F# вы обнаружите, что списки обычно деконструируются с использованием сопоставления с образцом. Например, в следующей функции x соответствует заголовку, а xs соответствует концу списка, переданного функции:
let list = [1;2;3]
let rec f = function
| [] -> 1
| (x::xs) -> x * (f xs)
f list;
Придется согласиться с Симонюком. Хотя, как упоминалось в CMS, hd и tl являются правильными функциями, есть еще один аргумент.
При использовании сопоставления с образцом вы можете использовать способность компилятора перехватывать (базовые) случаи, которые вы могли пропустить (например, когда список пуст). Вы определенно можете поймать или продолжить генерировать это исключение, но вам это не обязательно, и вы можете ввести ошибки, если такое ожидание не происходит часто. Так что выработка привычки использовать сопоставление с образцом - хорошая практика программирования. Во всех смыслах и целях фактическая функция, применяемая при вызове hd / tl, соответствует шаблону. На самом деле в ocaml это сбой:
let hd = function [] -> failwith "hd" | a::l -> a
let tl = function [] -> failwith "tl" | a::l -> l
Например, вместо использования исключений / сбоев мы могли бы найти более удовлетворительным использование options:
> let car = function | hd::tl -> Some hd | _ -> None
> let cdr = function | hd::[] -> None | hd :: tl -> Some tl | _ -> None
Кроме того, будьте осторожны с использованием _ для чего-либо. Когда вы решите добавить еще один тип, будет больнее, когда вы решите добавить еще один ...