Я собираюсь согласиться с Симонуком. Хотя, как уже упоминалось в 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
Кроме того, будьте осторожны с использованием _
, чтобы соответствовать чему-либо. Больно больше в вариантах вариантов, когда вы решаете добавить другой тип ... opps!