Как мне сделать машину и кадры против списка? - PullRequest
4 голосов
/ 12 ноября 2008

Предположим, у меня есть код:

let listB = [ 1; 2; 3 ]  

Используя нотацию Lisp, как мне сделать car и cadr для этого списка? Я знаю, что минусы это ::.

или на схеме first и rest?

Ответы [ 3 ]

6 голосов
/ 12 ноября 2008

List.hd и List.tl будут делать то, что вы хотите - но в F # вы обнаружите, что списки, как правило, деконструируются с использованием сопоставления с образцом. Например, в следующей функции x соответствует заголовку, а xs соответствует концу списка, переданного функции:

let list = [1;2;3]

let rec f = function
    | [] -> 1
    | (x::xs) -> x * (f xs)

f list;
5 голосов
/ 12 ноября 2008

List.head : возвращает первый элемент непустого списка (заголовок списка) .

List.tail : Возвращает все элементы непустой список, кроме первого (хвост или остальная часть списка) .

Пример ( с использованием интерактивной консоли F # ):

> 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]
2 голосов
/ 12 ноября 2008

Я собираюсь согласиться с Симонуком. Хотя, как уже упоминалось в 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!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...