Как мне сопоставить автомобиль и кадр со списком?

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

let listB = [ 1; 2; 3 ]  

Используя нотацию Lisp, как мне сопоставить car и cadr с этим списком? Знаю минусы - это ::.

Или в схеме first и rest?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
4
0
475
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

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

Кроме того, будьте осторожны с использованием _ для чего-либо. Когда вы решите добавить еще один тип, будет больнее, когда вы решите добавить еще один ...

Другие вопросы по теме